最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springBoot集成redis的key,value序列化的相關問題

 更新時間:2019年08月22日 14:24:28   作者:古越劍簫  
這篇文章主要介紹了springBoot集成redis的key,value序列化的相關問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

使用的是maven工程

springBoot集成redis默認使用的是注解,在官方文檔中只需要2步;

1、在pom文件中引入即可

 <dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-redis</artifactId>
</dependency>

2、編寫一個CacheService接口,使用redisCacheServiceImpl實現(xiàn)這個接口

官網(wǎng)的原文是這樣的,也就是說,提供三個接口注入和你自己實現(xiàn)的其他實現(xiàn)類,默認是本地端口號為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默認提供的redis服務,但是這樣有幾個問題,1序列化,我們set到redis服務器中的key是這樣的

我們直接在cli中get key發(fā)現(xiàn),在redisClent中發(fā)現(xiàn)是一堆看不懂的字符,解決這個問題就需要將key和value序列化,如果是xml配置的

我們直接注入官方給定的keySerializer,valueSerializer,hashKeySerializer即可,那么使用注解的話我們需要自己編寫RedisCacheConfig配置類

緩存主要有幾個要實現(xiàn)的類:

1、CacheManager緩存管理器;

2、具體操作實現(xiàn)類;

3、CacheManager工廠類(這個可以使用配置文件配置的進行注入,也可以通過編碼的方式進行實現(xiàn));

4、緩存key生產(chǎn)策略(當然Spring自帶生成策略,但是在Redis客戶端進行查看的話是系列化的key,對于我們?nèi)庋蹃碚f就是感覺是亂碼了,這里我們先使用自帶的緩存策略)。

/**
 * 緩存管理(注解用)
 * @author Administrator
 */
@Configuration
@EnableCaching//啟用緩存的意思
public class CacheConfig extends CachingConfigurerSupport{
  
  /**
   * 自定義key. 這個可以不用
   * 此方法將會根據(jù)類名+方法名+所有參數(shù)的值生成唯一的一個key,即使@Cacheable中的value屬性一樣,key也會不一樣。
   */
  /* @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);
    /* //設置緩存過期時間
    // rcm.setDefaultExpiration(60);//秒
    //設置value的過期時間
    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類型會出現(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;
  }

}

當數(shù)據(jù)存儲到redis中時候key和value都是通過spring serializer進行序列化的,

RedisTemplate, spring默認會使用jdk序列化,如果使用jdk序列化,model模型必須實現(xiàn)Serializable且要有一個空的構造器,

StringRedisTemplate 默認是使用StringSerializer,同時springData還提供了其他的序列化方式,如下:

GenericToStringSerializer:使用Spring轉換服務進行序列化;
JacksonJsonRedisSerializer:使用Jackson 1,將對象序列化為JSON;
Jackson2JsonRedisSerializer:使用Jackson 2,將對象序列化為JSON;
JdkSerializationRedisSerializer:使用Java序列化;
OxmSerializer:使用Spring O/X映射的編排器和解排器(marshaler和unmarshaler)實現(xiàn)序列化,用于XML序列化;
StringRedisSerializer:序列化String類型的key和value。實際上是String和byte數(shù)組之間的轉換

ok;基本解決了相關的序列化問題;代碼有參考!

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java實現(xiàn)API sign簽名校驗的方法詳解

    Java實現(xiàn)API sign簽名校驗的方法詳解

    為了防止中間人攻擊,有時我們需要進行API sign 簽名校驗。本文將用Java語言實現(xiàn)API sign 簽名校驗,感興趣的小伙伴可以嘗試一下
    2022-07-07
  • Java C++實現(xiàn)相同MD5加密算法的方式

    Java C++實現(xiàn)相同MD5加密算法的方式

    這篇文章主要介紹了Java與C++實現(xiàn)相同MD5加密算法的方法,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • springboot整合rocketmq實現(xiàn)分布式事務

    springboot整合rocketmq實現(xiàn)分布式事務

    大多數(shù)情況下很多公司是使用消息隊列的方式實現(xiàn)分布式事務。 本篇文章重點講解springboot環(huán)境下整合rocketmq實現(xiàn)分布式事務,感興趣的可以了解一下
    2021-05-05
  • Java中使用BeanMap將對象轉為Map詳解

    Java中使用BeanMap將對象轉為Map詳解

    這篇文章主要介紹了Java中使用BeanMap將對象轉為Map詳解,BeanMap?是?Apache?Commons?BeanUtils?庫中的一個類,BeanMap?可以將?Java?對象的屬性作為鍵,屬性值作為對應的值,存儲在一個?Map?中,它提供了一種將?Java?對象轉換為?Map?的方式,需要的朋友可以參考下
    2024-01-01
  • Java連接各種數(shù)據(jù)庫的方法

    Java連接各種數(shù)據(jù)庫的方法

    這篇文章主要介紹了Java連接各種數(shù)據(jù)庫的方法,實例分析了java連接MySQL、SQL Server、Sysbase、Oracle、PostgreSQL及DB2等數(shù)據(jù)庫的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • Mybatis使用IN語句查詢的實現(xiàn)

    Mybatis使用IN語句查詢的實現(xiàn)

    這篇文章主要介紹了Mybatis使用IN語句查詢的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot+jpa配置如何根據(jù)實體類自動創(chuàng)建表

    SpringBoot+jpa配置如何根據(jù)實體類自動創(chuàng)建表

    這篇文章主要介紹了SpringBoot+jpa配置如何根據(jù)實體類自動創(chuàng)建表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 集合嵌套之ArrayList嵌套ArrayList實例

    集合嵌套之ArrayList嵌套ArrayList實例

    下面小編就為大家?guī)硪黄锨短字瓵rrayList嵌套ArrayList實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringBoot使用讀寫鎖解決緩存一致性的問題

    SpringBoot使用讀寫鎖解決緩存一致性的問題

    本文主要介紹了SpringBoot使用讀寫鎖解決緩存一致性的問題,通過在緩存類中維護一個讀寫鎖,可以在讀多寫少的場景下提高并發(fā)訪問效率,感興趣的可以了解一下
    2025-03-03
  • 舉例講解JDK注解的使用和自定義注解的方法

    舉例講解JDK注解的使用和自定義注解的方法

    今天小編就為大家分享一篇關于舉例講解JDK注解的使用和自定義注解的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

望谟县| 四平市| 东乡县| 肥东县| 瑞丽市| 阳朔县| 肥东县| 安宁市| 清流县| 辰溪县| 措勤县| 安国市| 金平| 丹阳市| 黄平县| 错那县| 昭苏县| 措勤县| 白朗县| 竹山县| 连云港市| 宁波市| 澜沧| 临洮县| 盐亭县| 翼城县| 萨嘎县| 新绛县| 大方县| 怀柔区| 宁陕县| 通化市| 自治县| 承德市| 长垣县| 乌拉特中旗| 泰顺县| 德兴市| 象州县| 丹寨县| 西宁市|