这是一个空白文档

发布时间 2023-08-12 21:27:48作者: 回眸晓三生

添加依赖:spring-boot-starter-data-redis和spring-boot-starter-cache

在具体Redis应用中有2种方式:编程和注解

注解缓存应用开发
@Cacheable如果缓存中不存在目标值,则将调用目标方法并将返回的值存入缓存;如果存在,则直接返回缓存中的值,不会执行方法体。即使方法体内进行了数据库的更新操作,也不会执行。坑就是在condition中使用固定写法result
@Cacheable(key="'abcde'",cacheNames = "users") 需要配置cacheNames否则报错。对应生成的key为【cacheNames::key值】。Key值如果使用字符串固定值,则使用单引号括起来,如果使用方法的参数变量#p0用于指代第一个参数,第二个参数为#p1,依次类推。允许对多个方法参数执行拼接生成key值,例如@Cacheable(key="#p1+#p0");如果是复杂类型可以访问参数的属性值@Cacheable(key="#p0.username+#p0.password"),并且允许调用请求参数的方法@Cacheable(key="#p0.getMyId()")
还可以在业务类上添加注解@CacheConfig(cacheNames = "users")进行统一配置
条件应用注解缓存@Cacheable(key="#p0.getMyId()",unless = "#result!=null")

@CachePut 如果缓存中先前存在目标值,则更新缓存中的值为该方法的返回值;如果不存在,则将方法的返回值存入缓存。永远不会获取缓存数据
@CacheEvict 如果缓存中存在存在目标值,则将其从缓存中删除
使用注解配置,则需要在启动类或者JavaConfig配置类上加入@EnableCaching注解

RedisConfig配置类
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());生成的key值第一部分为类名称
sb.append(method.getName()); 生成的key值第二部分为方法名称
for (Object obj : params) { sb.append(obj.toString()); }生成的可以值第三部分为方法参数
return sb.toString();
}
};
}

@Bean
public CacheManager cacheManager(RedisConnectionFactory lettuceConnectionFactory) {
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
// 设置缓存管理器管理的缓存的默认过期时间 defaultCacheConfig = defaultCacheConfig.entryTtl(Duration.ofSeconds(defaultExpireTime))
// 设置 key为string序列化 .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
// 设置value为json序列化 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
// 不缓存空值 .disableCachingNullValues();

    Set<String> cacheNames = new HashSet<>();
    cacheNames.add(userCacheName);

    // 对每个缓存空间应用不同的配置        Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
    configMap.put(userCacheName, defaultCacheConfig.entryTtl(Duration.ofSeconds(userCacheExpireTime)));  设置默认的生存周期
    RedisCacheManager cacheManager = RedisCacheManager.builder(lettuceConnectionFactory)
            .cacheDefaults(defaultCacheConfig)
            .initialCacheNames(cacheNames)
            .withInitialCacheConfigurations(configMap)
            .build();
    return cacheManager;
}