主题
Redis Wrapper 类使用指南
核心类架构
RedisTemplateStringKeyWrapper (基类 - Key前缀处理)
↑
RedisTemplateFastOperationsWrapper (快速操作)
↑
├── RedisTemplateEmptyWrapper (空前缀)
├── RedisTemplatePrivateWrapper (应用级前缀 - 推荐)
└── RedisTemplatePublicWrapper (公共数据前缀)RedisTemplatePrivateWrapper(推荐)
用途:应用级私有缓存,Key 自动带应用名前缀(如 myapp:)
使用示例:
java
@Service
public class UserService {
@Autowired
private RedisTemplatePrivateWrapper redisTemplatePrivateWrapper;
public void setUserCache(String userId, User user) {
// Key 最终为: "myapp:user:123" (假设应用名为 myapp)
redisTemplatePrivateWrapper.boundValueOps("user:" + userId).set(user, 3600, TimeUnit.SECONDS);
}
public User getUserCache(String userId) {
return (User) redisTemplatePrivateWrapper.boundValueOps("user:" + userId).get();
}
public void deleteUserCache(String userId) {
redisTemplatePrivateWrapper.delete("user:" + userId);
}
}RedisTemplatePublicWrapper
用途:公共数据缓存,Key 自动带 pub-dat: 前缀
使用示例:
java
@Service
public class DictService {
@Autowired
private RedisTemplatePublicWrapper redisTemplatePublicWrapper;
public void setDictCache(String dictCode, List<DictItem> items) {
// Key 最终为: "pub-dat:dict:STATUS"
redisTemplatePublicWrapper.boundValueOps("dict:" + dictCode).set(items, 7200, TimeUnit.SECONDS);
}
public List<DictItem> getDictCache(String dictCode) {
return (List<DictItem>) redisTemplatePublicWrapper.boundValueOps("dict:" + dictCode).get();
}
}RedisTemplateEmptyWrapper
用途:不需要前缀的场景,或作为空操作占位
使用示例:
java
@Service
public class SystemService {
@Autowired
private RedisTemplateEmptyWrapper redisTemplateEmptyWrapper;
public void setGlobalConfig(String key, String value) {
// Key 保持原样: "global:config"
redisTemplateEmptyWrapper.boundValueOps("global:config").set(value);
}
}RedisTemplateFastOperationsWrapper
用途:提供快速操作方法,一般不直接实例化,而是通过子类使用其方法
常用快速方法:
java
// Value 操作
Object value = wrapper.valueGet("key");
wrapper.valuePut("key", value, 3600L); // 带过期时间(秒)
// Hash 操作
Map<String, Object> entries = wrapper.hashEntriesGet("hashKey");
wrapper.hashPutAll("hashKey", map, 3600L);
wrapper.hashEntryAppend("hashKey", "field", value, 3600L);
// List 操作
List<Object> list = wrapper.listValuesGet("listKey");
wrapper.listPutAll("listKey", values, 3600L);
// Set 操作
Set<Object> set = wrapper.setValuesGet("setKey");
wrapper.setPutAll("setKey", values, 3600L);
// JSON 操作
wrapper.beanJsonPut("key", bean, 3600L);
MyBean bean = wrapper.beanFromJsonGet("key", MyBean.class);RedisTemplateStringKeyWrapper
用途:提供 Key 前缀处理核心能力
Key 前缀相关方法:
java
// 获取当前前缀
String prefix = wrapper.getKeyPerfix(); // 如 "myapp:"
// 手动包装 Key(当使用 opsForXxx 返回的操作对象时需要手动调用)
String wrappedKey = wrapper.keyPerfixWrapper("user:123"); // 返回 "myapp:user:123"
// 批量包装 Key
List<String> wrappedKeys = wrapper.listKeysPerfixWrapper(Arrays.asList("key1", "key2"));注意:使用 opsForValue()、opsForHash() 等返回的操作对象时,不会自动添加前缀,需要手动调用 keyPerfixWrapper()。
java
// 不推荐:这样 Key 不会带前缀
ValueOperations<String, Object> ops = wrapper.opsForValue();
ops.set("key", value); // Key 就是 "key"
// 推荐:使用 boundXxxOps 或手动包装
wrapper.boundValueOps("key").set(value); // Key 带前缀
// 或
ops.set(wrapper.keyPerfixWrapper("key"), value);场景选择速查表
| 场景 | 推荐类 | Key 前缀 |
|---|---|---|
| 通用业务缓存 | RedisTemplatePrivateWrapper | 应用名: |
| 公共数据/字典 | RedisTemplatePublicWrapper | pub-dat: |
| 无前缀场景 | RedisTemplateEmptyWrapper | 无 |
