详解springboot整合redis

        redis相信大家不会陌生,可以说是日常开发中用的最广泛的缓存工具,而springboot作为与Java的集成框架,适用面非常广泛,其中就包含了对redis的集成,网上针对此类文章个人搜索后感觉大多写的不够详细,所以小编决定自己写一篇,一来供自己学习,二来供读者探讨

目录

相关配置文件

redis配置类

测试Case

测试结果

 导入依赖

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

 说明:这里用的springboot版本较新,3.0.6

相关配置文件

# Redis本地服务器地址,注意要开启redis服务,即 redis-server.exe
spring.data.redis.host=localhost
# Redis服务器端口,默认为6379.若有改动按改动后的来
spring.data.redis.port=6379
# Redis服务器连接密码,默认为空,若有设置按设置的来
spring.redis.password=
# redis客户端类型,springboot支持jedis和lettuce两种客户端,仅引入spring-boot-starter-data-redis依赖时,默认客户端类型为lettuce,可无需配置
spring.data.redis.client-type=lettuce
# spring cache 缓存前缀配置,注意该前缀并不会在redisTemplate操作缓存时加入,而是redisCache操作缓存时生效的
spring.cache.redis.key-prefix=yqw_redis_
# 开启spring cache 默认前缀
spring.cache.redis.use-key-prefix=true

redis配置类

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setValueSerializer(RedisSerializer.json());
        redisTemplate.setDefaultSerializer(RedisSerializer.json());
        return redisTemplate;
    }

    @Bean
    public RedisCacheManager redisCacheManager(RedisConnectionFactory redisConnectionFactory, CacheProperties cacheProperties) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                // 设置缓存有效期为1天
                .entryTtl(Duration.ofDays(1))
                // 设置键序列化方式
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
                // 设置值序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()))
                // 不处理空数据
                .disableCachingNullValues();
        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        // 设置cache前缀
        if (redisProperties.getKeyPrefix() != null) {
            config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
        }
        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(config);
        return builder.build();
    }
}

1. 本配置类,针对redis的序列化,关于key的序列化为String的默认序列化方式,关于value的序列化为json序列化方式,借助到了 GenericJackson2JsonRedisSerializer 类

2. 针对redisTemplate实例,RedisAutoConfiguration类中已经帮我们注入了 RedisTemplate<Object, Object> 和 RedisTemplate<String, String> 其中关于object的默认序列化方式为 jdk序列,性能相对较差且jdk序列化扩展性也不强,所以自定义RedisTemplate<String, Object>序列化方式,关于object采用json序列化

3. 关于RedisCacheManager 的配置办法,大家也可以参考RedisCacheConfiguration 配置类,很多配置的写法我们要学会参考源码的配置办法

4. RedisCacheManager负责生成和管理redisCache,从配置类中可以看到,RedisCacheManager其实是和redisTemplate公用一套redis连接的,redisCache本质上也是redis,但和redisTemplate的适用面又不太相同,个人理解redisCache主要与org.springframework.cache.annotation 包下的类如 @Cacheable 等注解结合使用,下面会有测试示例

测试Case

@RestController
public class RedisController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisCacheManager redisCacheManager;

    @Autowired
    private CacheService cacheService;

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @GetMapping("/redis/put")
    public String put(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
        return "success!";
    }

    @GetMapping("/redis/putObj")
    public String putObj(String key) {
        redisTemplate.opsForValue().set(key, TestEntity.returnTestObj());
        return "success";
    }

    @GetMapping("/redis/getObj")
    public String getObj(String key) {
        Object o = redisTemplate.opsForValue().get(key);
        return JSON.toJSONString(o);
    }

    @GetMapping("/cache/put")
    public String cachePut(String key) {
        Cache testCache = redisCacheManager.getCache("testCache");
        testCache.put(key, TestEntity.returnTestObj());
        return "success!";
    }

    @GetMapping("/cache/get")
    public String cacheGet(String key) {
        TestEntity testEntity = cacheService.cacheGet(key);
        return JSON.toJSONString(testEntity);
    }

}


@Service
public class CacheService {

    /**
     * testCache为cacheName,会有具体的redisCache与其以Map结构来一一对应,不同redisCache均由redisCacheManager生成
     * @param key
     * @return
     */
    @Cacheable(value = "testCache", cacheManager = "redisCacheManager", key = "#key")
    public TestEntity cacheGet(String key) {
        return new TestEntity("缓存", "找不到");
    }
}

public class TestEntity implements Serializable {

    @Serial
    private static final long serialVersionUID = -4058390548264688398L;
    
    private String fieldOne;

    private String fieldTwo;

    private String enumField;

    private static String staticField = "yangqingwei";

    public TestEntity(String fieldOne, String fieldTwo) {
        this.fieldOne = fieldOne;
        this.fieldTwo = fieldTwo;
    }

    public TestEntity() {}
    
    public static TestEntity returnTestObj() {
        return new TestEntity("one", "two");
    }
}

测试结果

1. 请求 localhost:9090/redis/putObj?key=yuan 会将默认的 TestEntity 测试对象json序列化后放入redis中

2.  请求 http://localhost:9090/cache/put?key=yang

TTL为过期时间,对应RedisCacheManager配置的缓存有效期,秒级别展示

key为我们设置的yqw_redis_前缀加使用的redisCache name 后跟 :: 和实际的存储的key,key的模板可参考 CacheKeyPrefix 

3. 请求 http://localhost:9090/cache/get?key=yang

        好啦,本章就先写到这里,个人觉得本篇文章是网上关于此块儿写的较为详细的文章,关于springboot整合redis各位读者有什么不同想法和对于本文有任何不清楚的地方欢迎留言指出,我们一起探索提高,最后,码字不易,觉得小编写的还行对你确实有帮助的,不要吝啬您的赞赞哦,感谢! 

 参考文章