Appearance
缓存实操
提示
如果你觉得key的命名过长,完全可以将非必填的部分置空,通过CacheKeyBuilder#getKey方法生成出来的key就会短一些。
操作缓存步骤如下:
- 定义缓存Key构造器:CacheKeyBuilder
- 编写代码操作缓存
- 实现SuperCacheManager
- 自行调用CacheOps
- 自行调用CacheHashOps
- 自行调用RedisOps
示例
Demo
假设业务中有5个地方需要存缓存:
- 用户完整数据:
lc:system:user:id:obj:1 -> {id: 1, name: “张三”, username: “zhangsan”}
- 用户名ID:
lc:system:user:username:number:zhangsan -> 1
- 员工在某个活动中的奖品:
lc:123:system:employee.activity:id.id:number:1.1 -> [1,2,3]
定义CacheKeyBuilder的示例代码:
java
public class UserCacheKeyBuilder implements CacheKeyBuilder {
@Override
// 租户
public String getTenant() {
return null;
}
@Override
// 前缀
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
@Override
// 模块
public String getModular() {
return CacheKeyModular.SYSTEM;
}
@Override
// 表
public String getTable() {
return "user";
}
@Override
// 字段
public String getField() {
return SuperEntity.ID_FIELD;
}
// 存储的value值的类型
@Override
public ValueType getValueType() {
return ValueType.obj;
}
@Override
// 有效期24小时
public Duration getExpire() {
return Duration.ofHours(24);
}
}
public class UserCacheKeyBuilder implements CacheKeyBuilder {
@Override
// 租户
public String getTenant() {
return null;
}
@Override
// 前缀
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
@Override
// 模块
public String getModular() {
return CacheKeyModular.SYSTEM;
}
@Override
// 表
public String getTable() {
return "user";
}
@Override
// 字段
public String getField() {
return SuperEntity.ID_FIELD;
}
// 存储的value值的类型
@Override
public ValueType getValueType() {
return ValueType.obj;
}
@Override
// 有效期24小时
public Duration getExpire() {
return Duration.ofHours(24);
}
}
java
public class UserUsernameCacheKeyBuilder implements CacheKeyBuilder {
@Override
// 租户
public String getTenant() {
return null;
}
@Override
// 前缀
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
@Override
// 模块
public String getModular() {
return CacheKeyModular.SYSTEM;
}
@Override
// 表
public String getTable() {
return "user";
}
@Override
// 字段
public String getField() {
return "username";
}
// 存储的value值的类型
@Override
public ValueType getValueType() {
return ValueType.number;
}
@Override
// 有效期24小时
public Duration getExpire() {
return Duration.ofHours(24);
}
}
public class UserUsernameCacheKeyBuilder implements CacheKeyBuilder {
@Override
// 租户
public String getTenant() {
return null;
}
@Override
// 前缀
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
@Override
// 模块
public String getModular() {
return CacheKeyModular.SYSTEM;
}
@Override
// 表
public String getTable() {
return "user";
}
@Override
// 字段
public String getField() {
return "username";
}
// 存储的value值的类型
@Override
public ValueType getValueType() {
return ValueType.number;
}
@Override
// 有效期24小时
public Duration getExpire() {
return Duration.ofHours(24);
}
}
java
public class UserActivityPrizeCacheKeyBuilder implements CacheKeyBuilder {
@Override
// 租户
public String getTenant() {
return ContextUtil.getTenantId();
}
@Override
// 前缀
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
@Override
// 模块
public String getModular() {
return CacheKeyModular.SYSTEM;
}
@Override
// 表
public String getTable() {
return "employee.activity";
}
@Override
// 字段
public String getField() {
return "id.id";
}
// 存储的value值的类型
@Override
public ValueType getValueType() {
return ValueType.number;
}
@Override
// 有效期24小时
public Duration getExpire() {
return Duration.ofHours(24);
}
}
public class UserActivityPrizeCacheKeyBuilder implements CacheKeyBuilder {
@Override
// 租户
public String getTenant() {
return ContextUtil.getTenantId();
}
@Override
// 前缀
public String getPrefix() {
return CacheKeyModular.PREFIX;
}
@Override
// 模块
public String getModular() {
return CacheKeyModular.SYSTEM;
}
@Override
// 表
public String getTable() {
return "employee.activity";
}
@Override
// 字段
public String getField() {
return "id.id";
}
// 存储的value值的类型
@Override
public ValueType getValueType() {
return ValueType.number;
}
@Override
// 有效期24小时
public Duration getExpire() {
return Duration.ofHours(24);
}
}
实现SuperCacheManager
调用SuperCacheController、SuperCacheService、SuperCacheManager中的部分接口时,会自动查询、设置、清理缓存值。前提是SuperCacheManager的子类需要重写cacheKeyBuilder()。如:
java
@RequiredArgsConstructor
@Service
public class DefUserManagerImpl extends SuperCacheManagerImpl<DefUserMapper, DefUser> implements DefUserManager {
@Override
protected CacheKeyBuilder cacheKeyBuilder() {
return new DefUserCacheKeyBuilder();
}
}
@RequiredArgsConstructor
@Service
public class DefUserManagerImpl extends SuperCacheManagerImpl<DefUserMapper, DefUser> implements DefUserManager {
@Override
protected CacheKeyBuilder cacheKeyBuilder() {
return new DefUserCacheKeyBuilder();
}
}
SuperCacheManagerImpl 会在save、saveBatch、saveOrUpdateBatch、updateAllById、updateById、updateBatchById、removeById、removeByIds、getByIdCache等方法中操作缓存。这些方法操作的都是单条数据,操作缓存时key生成方式为:
java
CacheKey cacheKey = cacheKeyBuilder().key(id);
cacheOps.xxx(cacheKey);
CacheKey cacheKey = cacheKeyBuilder().key(id);
cacheOps.xxx(cacheKey);
调用CacheOps
若SuperCacheManagerImpl封装的缓存不能满足你的需求,可以在代码中注入CacheOps来操作你的复杂业务的缓存。
java
@RequiredArgsConstructor
@Service
public class DefUserManagerImpl extends SuperCacheManagerImpl<DefUserMapper, DefUser> implements DefUserManager {
@Override
protected CacheKeyBuilder cacheKeyBuilder() {
return new DefUserCacheKeyBuilder();
}
public void save2(DefUser user) {
CacheKey key = new XxxCacheKeyBuilder().getKey("xxx");
cacheOps.get(key);
cacheOps.set(key, user);
}
}
@RequiredArgsConstructor
@Service
public class DefUserManagerImpl extends SuperCacheManagerImpl<DefUserMapper, DefUser> implements DefUserManager {
@Override
protected CacheKeyBuilder cacheKeyBuilder() {
return new DefUserCacheKeyBuilder();
}
public void save2(DefUser user) {
CacheKey key = new XxxCacheKeyBuilder().getKey("xxx");
cacheOps.get(key);
cacheOps.set(key, user);
}
}
调用CacheHashOps
CacheHashOps专门用来操作hash类型的缓存,所以对应的参数都应该传入CacheHashKey。若SuperCacheManagerImpl封装的缓存不能满足你的需求,可以在代码中注入CacheHashOps来操作你的复杂业务的缓存。
java
@RequiredArgsConstructor
@Service
public class DefUserManagerImpl extends SuperCacheManagerImpl<DefUserMapper, DefUser> implements DefUserManager {
@Override
protected CacheKeyBuilder cacheKeyBuilder() {
return new DefUserCacheKeyBuilder();
}
public void save3(DefUser user) {
CacheHashKey key = new XxxCacheKeyBuilder().hashFieldKey("field", "xxx");
cacheOps.get(key);
cacheOps.set(key, user);
}
}
@RequiredArgsConstructor
@Service
public class DefUserManagerImpl extends SuperCacheManagerImpl<DefUserMapper, DefUser> implements DefUserManager {
@Override
protected CacheKeyBuilder cacheKeyBuilder() {
return new DefUserCacheKeyBuilder();
}
public void save3(DefUser user) {
CacheHashKey key = new XxxCacheKeyBuilder().hashFieldKey("field", "xxx");
cacheOps.get(key);
cacheOps.set(key, user);
}
}