在SpringBoot项目中应用RedisCache功能

1.application.yaml中添加cache配置

XML 复制代码
spring:
  cache:
    type: redis
    redis:
      time-to-live: 72000000
      key-prefix: 'redis:cache:'
      use-key-prefix: true
      cache-null-values: true

2.封装RedisCache配置类

java 复制代码
@EnableConfigurationProperties(CacheProperties.class)
@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean
    public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
        // config = config.entryTtl();
        config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
        config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        CacheProperties.Redis redisProperties = cacheProperties.getRedis();
        //将配置文件中所有的配置都生效
        if (redisProperties.getTimeToLive() != null) {
            config = config.entryTtl(redisProperties.getTimeToLive());
        }
        if (redisProperties.getKeyPrefix() != null) {
            config = config.computePrefixWith(cacheName -> redisProperties.getKeyPrefix() + cacheName);
        }
        if (!redisProperties.isCacheNullValues()) {
            config = config.disableCachingNullValues();
        }
        if (!redisProperties.isUseKeyPrefix()) {
            config = config.disableKeyPrefix();
        }

        return config;
    }
}

3.封装RedisCache缓存Key生成器

java 复制代码
/**
 * @ClassName redisCacheKeyGenerator
 * @description: Redis缓存key 生成策略
 */
@Slf4j
@Component("redisCacheKeyGenerator")
public class RedisCacheKeyGenerator implements KeyGenerator {

    private final static int NO_PARAM_KEY = 0;
    public static final char SP = ':';
	
    @Autowired(required = false)
    private CacheManager cacheManager;

    @PostConstruct
    public void init() {
        log.info("cacheManager:{}",cacheManager);
    }

    @Override
    public Object generate(Object target, Method method, Object... parameters) {
        StringBuilder strBuilder = new StringBuilder(30);
        // 类名
        strBuilder.append(SP);
        // 方法名
        strBuilder.append(method.getName());
        strBuilder.append(SP);
        if (parameters.length > 0) {
            // 参数值
            for (Object object : parameters) {
                if (isSimpleValueType(object.getClass())) {
                    strBuilder.append(object);
                } else {
                    strBuilder.append(JSONUtil.toJsonStr(object).hashCode());
                }
            }
        } else {
            strBuilder.append(NO_PARAM_KEY);
        }
        log.info("生成缓存序列:{}",strBuilder);
        return strBuilder.toString();
    }

    /**
     * 判断是否是简单值类型.包括:基础数据类型、CharSequence、Number、Date、URL、URI、Locale、Class;
     *
     * @param clazz
     * @return
     */
    public static boolean isSimpleValueType(Class<?> clazz) {
        return (ClassUtils.isPrimitiveOrWrapper(clazz) || clazz.isEnum() || CharSequence.class.isAssignableFrom(clazz)
                || Number.class.isAssignableFrom(clazz) || Date.class.isAssignableFrom(clazz) || URI.class == clazz
                || URL.class == clazz || Locale.class == clazz || Class.class == clazz);
    }

}

4.Service类中应用RedisCache

java 复制代码
@Service
@CacheConfig(cacheNames = "productAlbum",keyGenerator = "redisCacheKeyGenerator")
public class ProductAlbumServiceImpl extends ServiceImpl<ProductAlbumMapper, ProductAlbum> implements IProductAlbumService {

    @Override
    @Transactional(rollbackFor = Exception.class)
    @Caching(
            evict = {
                    @CacheEvict(key = "':getAlbumPics_'+#productSn"),
                    @CacheEvict(key = "':getAlbumPicsBySn_'+#productSn")
            }
    )
    public void saveAlbumPics(String productSn, String pic) {
        // 业务代码
    }

    @Override
    @Caching(
            evict = {
                    @CacheEvict(key = "':getAlbumPics_'+#productSn"),
                    @CacheEvict(key = "':getAlbumPicsBySn_'+#productSn")
            }
    )
    public void doAlbumPics(String productSn,List<ProductAlbumResp> albumList) {
       // 业务代码
    }

    @Override
    @Cacheable(key = "':getAlbumPics_'+#productSn")
    public String getAlbumPics(String productSn) {
        // 业务代码
    }

    @Override
    @Cacheable(key = "':getAlbumPicsBySn_'+#productSn")
    public List<ProductAlbumResp> getAlbumPicsBySn(String productSn) {
       // 业务代码
    }

    @Override
    @Caching(
            evict = {
                    @CacheEvict(key = "':getAlbumPics_'+#productSn"),
                    @CacheEvict(key = "':getAlbumPicsBySn_'+#productSn")
            }
    )
    public void saveAlbumPicsByNotExist(String productSn, String pic) {
        // 业务代码
    }
}
相关推荐
桦说编程21 分钟前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen21 分钟前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研24 分钟前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
wyiyiyi1 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
没有bug.的程序员1 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
一只爱撸猫的程序猿1 小时前
使用Spring AI配合MCP(Model Context Protocol)构建一个"智能代码审查助手"
spring boot·aigc·ai编程
甄超锋2 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
阿华的代码王国2 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~2 小时前
《设计模式》装饰模式
java·设计模式
Jimmy2 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程