springBoot集成redis的key,value序列化的相關(guān)問題
使用的是maven工程
springBoot集成redis默認(rèn)使用的是注解,在官方文檔中只需要2步;
1、在pom文件中引入即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
2、編寫一個(gè)CacheService接口,使用redisCacheServiceImpl實(shí)現(xiàn)這個(gè)接口
官網(wǎng)的原文是這樣的,也就是說,提供三個(gè)接口注入和你自己實(shí)現(xiàn)的其他實(shí)現(xiàn)類,默認(rèn)是本地端口號(hào)為6379的redis
You can inject an auto-configured RedisConnectionFactory, StringRedisTemplate or vanilla RedisTemplate instance as you would any other Spring Bean.By default the instance will attempt to connect to a Redis server using localhost:6379:
我自己的redisCacheServiceImpl這樣寫的
@Service public class RedisCacheServiceImpl<K,V> implements CacheService<K,V> { @Autowired RedisTemplate<K, V> redisTemplate; public void set(K key, V value) { redisTemplate.opsForValue().set(key, value); } }
ok,這樣我們即可使用springBoot默認(rèn)提供的redis服務(wù),但是這樣有幾個(gè)問題,1序列化,我們set到redis服務(wù)器中的key是這樣的
我們直接在cli中g(shù)et key發(fā)現(xiàn),在redisClent中發(fā)現(xiàn)是一堆看不懂的字符,解決這個(gè)問題就需要將key和value序列化,如果是xml配置的
我們直接注入官方給定的keySerializer,valueSerializer,hashKeySerializer即可,那么使用注解的話我們需要自己編寫RedisCacheConfig配置類
緩存主要有幾個(gè)要實(shí)現(xiàn)的類:
1、CacheManager緩存管理器;
2、具體操作實(shí)現(xiàn)類;
3、CacheManager工廠類(這個(gè)可以使用配置文件配置的進(jìn)行注入,也可以通過編碼的方式進(jìn)行實(shí)現(xiàn));
4、緩存key生產(chǎn)策略(當(dāng)然Spring自帶生成策略,但是在Redis客戶端進(jìn)行查看的話是系列化的key,對(duì)于我們?nèi)庋蹃碚f就是感覺是亂碼了,這里我們先使用自帶的緩存策略)。
/** * 緩存管理(注解用) * @author Administrator */ @Configuration @EnableCaching//啟用緩存的意思 public class CacheConfig extends CachingConfigurerSupport{ /** * 自定義key. 這個(gè)可以不用 * 此方法將會(huì)根據(jù)類名+方法名+所有參數(shù)的值生成唯一的一個(gè)key,即使@Cacheable中的value屬性一樣,key也會(huì)不一樣。 */ /* @Override public KeyGenerator keyGenerator() { System.out.println("RedisCacheConfig.keyGenerator()"); returnnew KeyGenerator() { @Override public Object generate(Object o, Method method, Object... objects) { // This will generate a unique key of the class name, the method name //and all method parameters appended. StringBuilder sb = new StringBuilder(); sb.append(o.getClass().getName()); sb.append(method.getName()); for (Object obj : objects) { sb.append(obj.toString()); } System.out.println("keyGenerator=" + sb.toString()); returnsb.toString(); } }; } */ @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager rcm = new RedisCacheManager(redisTemplate); /* //設(shè)置緩存過期時(shí)間 // rcm.setDefaultExpiration(60);//秒 //設(shè)置value的過期時(shí)間 Map<String,Long> map=new HashMap(); map.put("test",60L); rcm.setExpires(map);*/ return rcm; } /** * RedisTemplate配置 * @param factory * @return */ @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); //定義key序列化方式 //RedisSerializer<String> redisSerializer = new StringRedisSerializer();//Long類型會(huì)出現(xiàn)異常信息;需要我們上面的自定義key生成策略,一般沒必要 //定義value的序列化方式 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // template.setKeySerializer(redisSerializer); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
當(dāng)數(shù)據(jù)存儲(chǔ)到redis中時(shí)候key和value都是通過spring serializer進(jìn)行序列化的,
RedisTemplate, spring默認(rèn)會(huì)使用jdk序列化,如果使用jdk序列化,model模型必須實(shí)現(xiàn)Serializable且要有一個(gè)空的構(gòu)造器,
StringRedisTemplate 默認(rèn)是使用StringSerializer,同時(shí)springData還提供了其他的序列化方式,如下:
GenericToStringSerializer:使用Spring轉(zhuǎn)換服務(wù)進(jìn)行序列化;
JacksonJsonRedisSerializer:使用Jackson 1,將對(duì)象序列化為JSON;
Jackson2JsonRedisSerializer:使用Jackson 2,將對(duì)象序列化為JSON;
JdkSerializationRedisSerializer:使用Java序列化;
OxmSerializer:使用Spring O/X映射的編排器和解排器(marshaler和unmarshaler)實(shí)現(xiàn)序列化,用于XML序列化;
StringRedisSerializer:序列化String類型的key和value。實(shí)際上是String和byte數(shù)組之間的轉(zhuǎn)換
ok;基本解決了相關(guān)的序列化問題;代碼有參考!
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
- SpringBoot自定義Redis實(shí)現(xiàn)緩存序列化詳解
- SpringBoot結(jié)合Redis實(shí)現(xiàn)序列化的方法詳解
- SpringBoot整合redis中的JSON序列化文件夾操作小結(jié)
- SpringBoot集成Redis,并自定義對(duì)象序列化操作
- SpringBoot Redis配置Fastjson進(jìn)行序列化和反序列化實(shí)現(xiàn)
- SpringBoot整合Redis實(shí)現(xiàn)序列化存儲(chǔ)Java對(duì)象的操作方法
相關(guān)文章
Java常用類庫StringBuffer,Runtime,日期操作類等類庫總結(jié)
這篇文章主要介紹了Java常用類庫StringBuffer,Runtime,日期操作類等類庫總結(jié),需要的朋友可以參考下2020-02-02java線程池對(duì)象ThreadPoolExecutor的深入講解
在我們的開發(fā)中“池”的概念并不罕見,有數(shù)據(jù)庫連接池、線程池、對(duì)象池、常量池等等。下面這篇文章主要給大家介紹了關(guān)于java線程池對(duì)象ThreadPoolExecutor的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧2018-09-09RSA加密的方式和解密方式實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄猂SA加密的方式和解密方式實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Java實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃背包問題
本文主要介紹使用java實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃的背包問題,詳細(xì)使用圖文和多種案例進(jìn)行解析,幫助理解該算法2021-06-06spring-boot-plus V1.4.0發(fā)布 集成用戶角色權(quán)限部門管理(推薦)
這篇文章主要介紹了spring-boot-plus V1.4.0發(fā)布 集成用戶角色權(quán)限部門管理,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值需要的朋友可以參考下2019-11-11Spring Boot Jar 包部署腳本的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于Spring Boot Jar 包部署腳本的實(shí)例講解內(nèi)容,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。2021-12-12Java適配器模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java適配器模式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07圖解Java中歸并排序算法的原理與實(shí)現(xiàn)
歸并排序是建立在歸并操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。本文將通過圖片詳解插入排序的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08