spring boot 集成 redis 緩存

在spring中使用redis緩存有三種方式:

  • 直接使用各種redis客戶端提供的接口
  • 使用spring data redis
  • 使用spring caching 注解

直接使用客戶端提供的接口

這個(gè)沒什么好說的, 直接看相應(yīng)客戶端的文檔就行了, 當(dāng)前redis有非常多的客戶端
官網(wǎng)的客戶端列表: https://redis.io/clients
在java語言方面, 官網(wǎng)推薦: Jedis, lettuce, Redisson
其中spring boot默認(rèn)的客戶端是lettuce .
因?yàn)槊總€(gè)客戶端都有自己的API, 如果深入集成到項(xiàng)目中, 后續(xù)需要更換就比較麻煩, 建議使用后面兩種訪問方式, 對于特殊功能才直接使用客戶端接口.

使用spring data redis

官方文檔: https://docs.spring.io/spring-data/redis/docs/2.1.7.RELEASE/reference/html/
這種方式需要Redis客戶端支持spring data redis.
使用spring data redis :

  • 導(dǎo)入依賴 compile("org.springframework.boot:spring-boot-starter-data-redis:${springbootVersion}")
  • 創(chuàng)建Redis連接
  • 使用RedisTemplate操作數(shù)據(jù).

創(chuàng)建redis連接

RedisConnection 是對連接的抽像, 提供了操作Redis的接口, 并處理了網(wǎng)絡(luò)層的細(xì)節(jié).
RedisConnection是通過RedisConnectionFactory創(chuàng)建的.
每個(gè)Redis客戶端都會實(shí)現(xiàn)RedisConnectionFactory的子類, 實(shí)現(xiàn)創(chuàng)建RedisConnection的功能.

下面是一個(gè)配置使用Redisson客戶端的示例

  @Bean
  public RedissonClient redissonClient() {
        Config config = new Config();
        SingleServerConfig singleServer = config.useSingleServer();
        singleServer
                .setClientName(applicationName)
                .setAddress("redis://" + host + ":" + port)
                .setPassword(password);
        return Redisson.create(config);
    }

    @Bean
    public RedisConnectionFactory redisConnectionFactory(RedissonClient redissonClient) {
        return new RedissonConnectionFactory(redissonClient);
    }

使用RedisTemplate操作數(shù)據(jù)

RedisTemplate是spring data redis操作redis數(shù)據(jù)的一組接口, 詳細(xì)使用見官網(wǎng).
在使用之前, 可以做一些配置, 比如key和value的序列化器, 下面是一個(gè)配置示例.

    private GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        return new GenericJackson2JsonRedisSerializer(objectMapper);
    }

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer()); // 配置key序列化方式
        template.setValueSerializer(genericJackson2JsonRedisSerializer()); //配置value序列化方式
        template.setEnableTransactionSupport(false); // 關(guān)閉事務(wù)
        return template;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(genericJackson2JsonRedisSerializer());
        template.setEnableTransactionSupport(false);
        return template;
    }

使用spring caching 注解

配置Spring Caching需要創(chuàng)建CacheManager, 下面是配置示例:

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory,
                                     RedisCacheConfiguration redisCacheConfiguration) {
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(redisCacheConfiguration)
                .build();
    }

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration() {
        RedisSerializationContext.SerializationPair<String> keySerializationPair
                = RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer());
        RedisSerializationContext.SerializationPair<?> valueSerializationPair
                = RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer());
        return RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMillis(expireTime)) //配置超時(shí)時(shí)間
                .serializeKeysWith(keySerializationPair) //配置key序列化方式
                .serializeValuesWith(valueSerializationPair) //配置vaue序列化方式
                .disableCachingNullValues();
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容