import java.lang.reflect.Method; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisPassword; import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import lombok.extern.slf4j.Slf4j; /** * Redis服务器对象缓存配置(对象缓存) * * @author Frank.Zeng * */ @Configuration @EnableCaching @Slf4j public class MyRedisConfig extends CachingConfigurerSupport { /** * 加载属性文件数据 * * @return */ @Bean public MyRedisProperties redisProperties() { return new MyRedisProperties(); } /** * RedisTemplate * * @return */ @SuppressWarnings("rawtypes") @Primary @Bean(name = "redisTemplate") public RedisTemplate redisTemplate( RedisConnectionFactory connectionFactory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); RedisSerializer stringSerializer = new StringRedisSerializer(); template.setKeySerializer(stringSerializer); template.setValueSerializer(sessionRedisSerializer()); template.setHashKeySerializer(stringSerializer); template.setHashValueSerializer(sessionRedisSerializer()); template.afterPropertiesSet(); return template; } /** * 设置redisTemplate的存储格式(在此与Session没有什么关系) * * @return */ @SuppressWarnings("rawtypes") @Bean public RedisSerializer sessionRedisSerializer() { return new Jackson2JsonRedisSerializer(Object.class); } /** * 主键生成器 * * @return */ @Bean public KeyGenerator commonKeyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } String key = sb.toString(); log.info("key:" + key); return key; } }; } @Bean public CacheManager cacheManager( @Qualifier("connectionFactory") RedisConnectionFactory redisConnectionFactory) { RedisCacheManager redisCacheManager = RedisCacheManager.create(redisConnectionFactory); return redisCacheManager; } @Primary @Bean(name = "connectionFactory") public RedisConnectionFactory connectionFactory() { // 单机版配置 RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(redisProperties().getHost(), redisProperties().getPort()); redisStandaloneConfiguration.setDatabase(redisProperties().getDatabase()); redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties().getPassword())); // 集群版配置 // RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); // String[] serverArray = clusterNodes.split(","); // Set nodes = new HashSet(); // for (String ipPort : serverArray) { // String[] ipAndPort = ipPort.split(":"); // nodes.add(new RedisNode(ipAndPort[0].trim(), Integer.valueOf(ipAndPort[1]))); // } // redisClusterConfiguration.setPassword(RedisPassword.of(password)); // redisClusterConfiguration.setClusterNodes(nodes); // redisClusterConfiguration.setMaxRedirects(maxRedirects); // 客户端配置 GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();// 连接池配置 poolConfig.setMaxIdle(redisProperties().getLettuce().getPool().getMaxIdle()); poolConfig.setMaxTotal(redisProperties().getLettuce().getPool().getMaxActive()); poolConfig.setMaxWaitMillis(redisProperties().getLettuce().getPool().getMaxWait().toMillis()); poolConfig.setMinIdle(redisProperties().getLettuce().getPool().getMinIdle()); LettuceClientConfiguration lettuceClientConfiguration = LettucePoolingClientConfiguration.builder().poolConfig(poolConfig) .commandTimeout(redisProperties().getLettuce().getShutdownTimeout()).build(); LettuceConnectionFactory redisConnectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration, lettuceClientConfiguration); log.info("2.1 初始化Redis缓存服务器(普通对象)... ..."); return redisConnectionFactory; } }