最近在入门SpringBoot,而后在感慨 SpringBoot较于Spring真的方便多时,顺便记录下本身在集成redis时的一些想法。面试
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
/* 操做k-v都是字符串的 */ @Autowired StringRedisTemplate stringRedisTemplet; /* 操做k-v都是对象的 */ @Autowired RedisTemplate redisTemplate;
redis的包中提供了两个能够操做方法,根据不一样类型的值相对应选择。
两个操做方法对应的redis操做都是相同的redis
stringRedisTemplet.opsForValue() // 字符串 stringRedisTemplet.opsForList() // 列表 stringRedisTemplet.opsForSet() // 集合 stringRedisTemplet.opsForHash() // 哈希 stringRedisTemplet.opsForZSet() // 有序集合
在StringRedisTemplet中,默认都是存储字符串的形式;在RedisTemplet中,值能够是某个对象,而redis默认把对象序列化后存储在redis中(因此存放的对象默认状况下须要序列化)spring
若是须要更改数据的存储方式,如采用json来存储在redis中,而不是以序列化后的形式。json
1)本身建立一个RedisTemplate实例,在该实例中本身定义json的序列化格式(org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer)springboot
// 这里传入的是employee对象(employee 要求能够序列化) Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
2)把定义的格式放进本身定义的RedisTemplate实例中性能优化
RedisTemplate<Object,Employee> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 定义格式 Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class); // 放入RedisTemplate实例中 template.setDefaultSerializer(jackson2JsonRedisSerializer);
参考代码:架构
@Bean public RedisTemplate<Object,Employee> employeeRedisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException{ RedisTemplate<Object,Employee> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class); template.setDefaultSerializer(jackson2JsonRedisSerializer); return template; }
原理:并发
@Configuration @ConditionalOnClass({RedisOperations.class}) @EnableConfigurationProperties({RedisProperties.class}) @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class}) public class RedisAutoConfiguration { public RedisAutoConfiguration() { } @Bean @ConditionalOnMissingBean( name = {"redisTemplate"} ) // 在容器当前没有redisTemplate时运行 public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<Object, Object> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } @Bean @ConditionalOnMissingBean // 在容器当前没有stringRedisTemplate时运行 public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { StringRedisTemplate template = new StringRedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } }
若是你本身定义了RedisTemplate后并添加@Bean注解,(要在配置类中定义),那么默认的RedisTemplate就不会被添加到容器中,运行的就是本身定义的ReidsTemplate实例,而你在实例中本身定义了序列化格式,因此就会以你采用的格式定义存放在redis中的对象。分布式
springboot默认提供基于注解的缓冲,只要在主程序类(xxxApplication)标注@EnableCaching,缓冲注解有spring-boot
@Cachingable、@CachingEvict、@CachingPut,而且该缓冲默认使用的是ConcurrentHashMapCacheManager
当引入redis的starter后,容器中保存的是RedisCacheManager ,RedisCacheManager建立RedisCache做为缓冲组件,RedisCache经过操纵redis缓冲数据
在此我向你们推荐一个架构学习交流群。交流学习群号:478030634 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
在SpringBoot中,若是要修改序列化机制,能够直接创建一个配置类,在配置类中自定义CacheManager,在CacheManager中能够自定义序列化的规则,默认的序列化规则是采用jdk的序列化
注:在SpringBoot 1.5.6 和SpringBoot 2.0.5 的版本中自定义CacheManager存在差别
参考代码:
// springboot 1.x的版本 public RedisCacheManager employeeCacheManager(RedisConnectionFactory redisConnectionFactory){ // 一、自定义RedisTemplate RedisTemplate<Object,Employee> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class); template.setDefaultSerializer(jackson2JsonRedisSerializer); // 二、自定义RedisCacheManager RedisCacheManager cacheManager = new RedisCacheManager(template); cacheManager.setUsePrefix(true); // 会将CacheName做为key的前缀 return cacheManager; } // springboot 2.x的版本 /** * serializeKeysWith() 修改key的序列化规则,这里采用的是StringRedisSerializer() * serializeValuesWith() 修改value的序列化规则,这里采用的是 Jackson2JsonRedisSerializer<Employee>(Employee.class) * @param factory * @return */ @Bean public RedisCacheManager employeeCacheManager(RedisConnectionFactory redisConnectionFactory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() . serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<Employee>(Employee.class))); RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build(); return cacheManager; }
tip:能够经过查看各版本的org.springframework.data.redis.cache.RedisCacheConfiguration去自定义CacheManager.
由于不一样版本的SpringBoot对应的Redis版本也是不一样的,因此要重写时能够查看官方是怎么定义CacheManager,才知道怎样去自定义CacheManager。
你们以为文章对你仍是有一点点帮助的,你们能够点击下方二维码进行关注。 《 Java烂猪皮 》 公众号聊的不单单是Java技术知识,还有面试等干货,后期还有大量架构干货。你们一块儿关注吧!关注烂猪皮,你会了解的更多..............