📄 系统缓存使用
内部资料,请刷新扫码登录
pigcloud
# 1. Spring Cache
pigx 对 Spring Cache
进行了扩展,支持到期删除、区分租户和全局缓存等操作。
关于 Spring Cache 注解的使用,请直接参考此博客 (opens new window)。
# 1.1 使用方法
当引入 pigx-common-data
模块时,会自动引入扩展版本的 Spring Cache
。
# 1.2 缓存过期支持
通过在原有的 Spring Cache 的 value 属性后增加 #过期时间 来设置缓存过期时间。
@Cacheable(value = VALUE_NAME#TTL, key = "#PARAMS")
例如:设置过期时间为 2 秒。
@Cacheable(value = "USER#2", key = "#userId")
# 1.3 缓存清除
使用 @CacheEvict 注解可以清除缓存
// 删除指定key的缓存
@CacheEvict(value = "USER", key = "#userId")
public void updateUser(String userId) {
// 更新用户操作
}
// 删除某个缓存名称下的所有缓存
@CacheEvict(value = "USER", allEntries = true)
public void clearUserCache() {
// 清除所有用户缓存
}
# 1.4 全局缓存
在 pigx 中对 Spring Cache 进行了区分,比如:
- A 租户有一个 CacheName 为 XXX。
- B 租户有一个 CacheName 为 XXX。
在多租户情况下会自动为每个租户隔离缓存,例如 A 租户的 XXX 缓存保存为 A:XXX,B 租户的 XXX 缓存保存为 B:XXX。
如果特定缓存不需要区分租户,比如某些功能对于所有租户的查询结果是一致的,只需要在 CacheName 上增加 gl:
前缀即可。
@Cacheable(value = "gl:tenant_details")
# 2. RedisTemplate 使用
除了使用 Spring Cache 注解,pigx 支持 RedisTemplate,可以直接注入使用:
@Autowired
private RedisTemplate<String, Object> redisTemplate;
# 2.1 常用操作示例
// 设置字符串
redisTemplate.opsForValue().set("key", "value");
// 设置带过期时间的值(60秒)
redisTemplate.opsForValue().set("key", "value", 60, TimeUnit.SECONDS);
// 获取值
String value = (String) redisTemplate.opsForValue().get("key");
// 删除键
redisTemplate.delete("key");
// 判断键是否存在
boolean exists = redisTemplate.hasKey("key");
// Hash操作
redisTemplate.opsForHash().put("hashKey", "field", "value");
Object fieldValue = redisTemplate.opsForHash().get("hashKey", "field");
// List操作
redisTemplate.opsForList().rightPush("listKey", "value");
String listValue = (String) redisTemplate.opsForList().leftPop("listKey");
// Set操作
redisTemplate.opsForSet().add("setKey", "value1", "value2");
Set<Object> members = redisTemplate.opsForSet().members("setKey");
# 2.2 注意事项
- 1.RedisTemplate 操作不会自动进行租户隔离,需要手动在 key 前加上租户标识
- 2.建议使用统一的 key 命名规范,例如:
业务:模块:功能:id
- 3.操作复杂数据结构时注意序列化问题
- 4.RedisTemplate 已经足够简单了,不要自己再封装 Util 啦