Skip to content

缓存实操

提示

如果你觉得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);
    }
}

欢迎使用天源云Saas快速开发系统