在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) {
        // 业务代码
    }
}
相关推荐
职略1 小时前
负载均衡类型和算法解析
java·运维·分布式·算法·负载均衡
A22741 小时前
LeetCode 196, 73, 105
java·算法·leetcode
容若只如初见2 小时前
项目实战--Spring Boot + Minio文件切片上传下载
java·spring boot·后端
阿里巴巴P8资深技术专家2 小时前
Java常用算法&集合扩容机制分析
java·数据结构·算法
weixin_440401692 小时前
分布式锁——基于Redis分布式锁
java·数据库·spring boot·redis·分布式
码农爱java2 小时前
Spring Boot 中的监视器是什么?有什么作用?
java·spring boot·后端·面试·monitor·监视器
zengson_g2 小时前
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
java·数据库·算法·排序算法
血战灬狂龙3 小时前
pom.xml文件加载后没有变成maven图标
xml·java·maven
Apifox.3 小时前
什么是 HTTP POST 请求?初学者指南与示范
后端·http·学习方法·web
无名指的等待7123 小时前
SpringBoot实现图片添加水印(完整)
java·spring boot·后端