溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

springBoot如何集成redis的key

發(fā)布時(shí)間:2021-08-13 12:42:59 來(lái)源:億速云 閱讀:119 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)springBoot如何集成redis的key的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

使用的是maven工程

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

1、在pom文件中引入即可

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

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

官網(wǎng)的原文是這樣的,也就是說(shuō),提供三個(gè)接口注入和你自己實(shí)現(xiàn)的其他實(shí)現(xiàn)類(lèi),默認(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這樣寫(xiě)的

@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è)問(wèn)題,1序列化,我們set到redis服務(wù)器中的key是這樣的springBoot如何集成redis的key

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

我們直接注入官方給定的keySerializer,valueSerializer,hashKeySerializer即可,那么使用注解的話(huà)我們需要自己編寫(xiě)RedisCacheConfig配置類(lèi)

緩存主要有幾個(gè)要實(shí)現(xiàn)的類(lèi):

1、CacheManager緩存管理器;

2、具體操作實(shí)現(xiàn)類(lèi);

3、CacheManager工廠(chǎng)類(lèi)(這個(gè)可以使用配置文件配置的進(jìn)行注入,也可以通過(guò)編碼的方式進(jìn)行實(shí)現(xiàn));

4、緩存key生產(chǎn)策略(當(dāng)然Spring自帶生成策略,但是在Redis客戶(hù)端進(jìn)行查看的話(huà)是系列化的key,對(duì)于我們?nèi)庋蹃?lái)說(shuō)就是感覺(jué)是亂碼了,這里我們先使用自帶的緩存策略)。

/**
 * 緩存管理(注解用)
 * @author Administrator
 */
@Configuration
@EnableCaching//啟用緩存的意思
public class CacheConfig extends CachingConfigurerSupport{
  
  /**
   * 自定義key. 這個(gè)可以不用
   * 此方法將會(huì)根據(jù)類(lèi)名+方法名+所有參數(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è)置緩存過(guò)期時(shí)間
    // rcm.setDefaultExpiration(60);//秒
    //設(shè)置value的過(guò)期時(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類(lèi)型會(huì)出現(xiàn)異常信息;需要我們上面的自定義key生成策略,一般沒(méi)必要
    //定義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都是通過(guò)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還提供了其他的序列化方式,如下:

springBoot如何集成redis的key

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類(lèi)型的key和value。實(shí)際上是String和byte數(shù)組之間的轉(zhuǎn)換

感謝各位的閱讀!關(guān)于“springBoot如何集成redis的key”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI