package com.java110.core.cache; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.*; import org.springframework.util.StringUtils; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.time.Duration; import java.util.HashSet; import java.util.Set; /** * Created by wuxw on 2017/7/23. */ @Configuration @EnableCaching public class Java110RedisConfig extends CachingConfigurerSupport { public final static String REDIS_EXPIRE_TIME_KEY = "#key_expire_time"; public final static String DEFAULT_EXPIRE_TIME_KEY = "#key_expire_time=600"; public final static String GET_STORE_ENTER_COMMUNITYS_EXPIRE_TIME_KEY = "#key_expire_time=7200"; public final static String GET_STORE_INFO_EXPIRE_TIME_KEY = "#key_expire_time=5400"; @Autowired private RedisTemplate redisTemplate; @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory){ RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(factory); redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化类型 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // value的序列化类型 redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } //@Bean(name = "jedisPool") //@Autowired public JedisPool jedisPool(@Qualifier("jedis.pool.config") JedisPoolConfig config, @Value("${jedis.pool.host}") String host, @Value("${jedis.pool.port}") int port, @Value("${jedis.pool.timeout}") int timeout, @Value("${jedis.pool.password}") String password) { //没有配置改为默认值 if (timeout == 0) { timeout = 2000; } if (StringUtils.isEmpty(password)) { return new JedisPool(config, host, port, timeout); } else { return new JedisPool(config, host, port, timeout, password); } } // @Bean(name = "jedisCluster") // @Autowired public JedisCluster jedisCluster(@Qualifier("jedis.pool.config") JedisPoolConfig config, @Value("${jedis.pool.host}") String host, @Value("${jedis.pool.port}") int port, @Value("${jedis.pool.timeout}") int timeout, @Value("${jedis.pool.password}") String password) { //没有配置改为默认值 if (timeout == 0) { timeout = 2000; } String[] hosts = host.split(","); Set nodes = new HashSet<>(); String[] tmpHosts = null; for (String tmpHost : hosts) { tmpHosts = tmpHost.split(":"); nodes.add(new HostAndPort(tmpHosts[0], Integer.parseInt(tmpHosts[1]))); } JedisCluster cluster = new JedisCluster(nodes); return cluster; } //@Bean(name = "jedis.pool.config") public JedisPoolConfig jedisPoolConfig(@Value("${jedis.pool.config.maxTotal}") int maxTotal, @Value("${jedis.pool.config.maxIdle}") int maxIdle, @Value("${jedis.pool.config.maxWaitMillis}") int maxWaitMillis) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(maxTotal); config.setMaxIdle(maxIdle); config.setMaxWaitMillis(maxWaitMillis); return config; } @Bean public RedisSerializer redisKeySerializer(){ return new StringRedisSerializer(); } @Override @Bean public CacheManager cacheManager() { RedisConnectionFactory connectionFactory = redisTemplate.getConnectionFactory(); //上面实现的缓存读写 Java110RedisCacheWriter java110RedisCacheWriter = new Java110RedisCacheWriter(connectionFactory); CacheManager cm = new RedisCacheManager(java110RedisCacheWriter, redisCacheConfiguration()); return cm; } /** * @return * @Cacheable和通过RedisTemplate之间去相互获取数据 * @Cacheable注解存储redis缓存数据和通过RedisTemplate去获取存储的数据,由于@Cacheable默认的序列化编码存储到数据为byte类型,而RedisTemplate的默认编码为JdkSerializationRedisSerializer,所以要通过设置同一个序列化方式去解决问题; 通过继承CachingConfigurerSupport并且开启@EnableCaching去设置cache的配置通过RedisCacheConfiguration.defaultCacheConfig()去设置序列化的方式RedisTemplate设置RedisTemplate的序列化方式 * 设置序列化方式Jackson2JsonRedisSerializer */ @Bean public RedisCacheConfiguration redisCacheConfiguration() { RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig(); configuration = configuration.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new JdkSerializationRedisSerializer())).entryTtl(Duration.ofSeconds(30)); return configuration; } }