目录

  • ​​前置​​
  • ​​pom: jar​​
  • ​​配置文件: application.yml​​
  • ​​MyCacheConfig.java​​
  • ​​效果图​​

前置

会演示springcache的使用方式
​​​项目地址:​​ https://gitee.com/xmaxm/test-code/blob/master/chaim-cache/chaim-spring-cache/chaim-spring-cache-redis/README.md

前置配置

本篇文章是基于上篇文章进行: ​​spring cache (默认方式)​​

强调:

需要使 Redis 配置(spring.cache.redis)生效, 以及自定义配置Redis的前缀 故添加配置文件: MyCacheConfig.java
不使用MyCacheConfig.java, 需要 implements Serializable

源码部分
​spring cache (默认方式)​​ 一致, 只是实现缓存的方式不一样

关键类: org.springframework.cache.Cache
org.springframework.cache.interceptor.CacheInterceptor#invoke
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration
实现类: org.springframework.data.redis.cache.RedisCache

相关缓存文章

​​spring cache (默认方式)​​spring cache (Redis方式)
spring cache (ehcache方式)


pom: jar

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

<!-- 自定义二级缓存存储: Redis方式 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置文件: application.yml

spring:
redis:
database: 2
host: 127.0.0.1
port: 6379
timeout: 5000
jedis:
pool:
max-active: 100
max-wait: -1
max-idle: 10
min-idle: 5

cache:
# 程序启动时创建的缓存名称
cache-names: chaim-name
# 缓存类型 org.springframework.boot.autoconfigure.cache.CacheType
type: redis
redis:
# 缓存前缀
key-prefix: "CACHE:"
# 写入 Redis 时是否使用前缀 默认:true
use-key-prefix: true
# 允许缓存空值 默认: true, 可也防止缓存穿透问题
cache-null-values: true
# 缓存过期时间, 单位: 毫秒
time-to-live: 300000

MyCacheConfig.java

package com.chaim.spring.cache.redis.config;

import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
* @author Chaim
* @date 2022/9/17 0:51
*/
@Configuration
public class MyCacheConfig {

/**
* 使 Redis 配置(spring.cache.redis)生效
* 配置 Redis 自定义前缀 (可按需扩展)
* 也可以通过: config.computePrefixWith(cacheName -> "redisProperties.getKeyPrefix()" + cacheName + ":"); 进行自定义配置, 本意是对函数式接口的实现
*
* @param cacheProperties Redis 配置参数
* @return
*/
@Bean
public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
//设置key用string类型保存,value用json格式保存
config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new Jackson2JsonRedisSerializer<>(Object.class)));

CacheProperties.Redis redisProperties = cacheProperties.getRedis();
// 使配置文件中所有的配置都生效
if (redisProperties.getTimeToLive() != null) {
config = config.entryTtl(redisProperties.getTimeToLive());
}
if (redisProperties.getKeyPrefix() != null) {
// 自定义前缀: spring.cache.redis.key-prefix
// + 入参(org.springframework.data.redis.cache.CacheKeyPrefix.compute(String cacheName))
// + value值 @Cacheable(value = "selectPage")
config = config.computePrefixWith(cacheName -> redisProperties.getKeyPrefix() + cacheName + ":");
// 前缀格式: spring.cache.redis.key-prefix + value值 @Cacheable(value = "selectPage")
// config = config.prefixKeysWith(redisProperties.getKeyPrefix());
}
if (!redisProperties.isCacheNullValues()) {
config = config.disableCachingNullValues();
}
if (!redisProperties.isUseKeyPrefix()) {
// 写入 Redis 时是否使用前缀: org.springframework.data.redis.cache.RedisCache.createCacheKey
config = config.disableKeyPrefix();
}

return config;
}
}

效果图

spring cache (Redis方式)_spring



spring cache (Redis方式)_spring boot_02