最近刚好有时间,打算抽空统一下公司研发中常见Redis操作工具类;折腾一番后发现陷入死胡同了。请问各位大佬都是怎么处理redis 工具类的。下面提供了两种,目前别人常用的;
第一种:基于 StringRedisTemplate:(下面的代码有做了一些简化)
//redis 工具类
@Component
public class RedisService {
@Autowired
private StringRedisTemplate redisTemplate;
//设置缓存
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
//获取缓存
public String get(String key) {
return redisTemplate.opsForValue().get(key);
}
}
问题描述:上面这种方式直接限定了 key 和 value 都是 string 类型。这种方式在操作对象的时候,在业务层就需要将对象进行各种的序列化和反序列操作。
第二种:基于 RedisTemplate (下面的代码有做了一些简化)
//redis 操作工具类
@Component
public class RedisService {
@Autowired
private RedisTemplate redisTemplate;
//设置缓存
public <T> void set(String key, T value) {
redisTemplate.opsForValue().set(key, value);
}
//直接返回 Object ps:返回的类型在业务层需要进行类型转换比较麻烦
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
//在网上咨询了一些答案,给出这种方式,但是经过验证我发现,这种方式有问题,他需要有一个前提就是,redis 中的缓存value需要带有类型信息,否则
//最终返回的 Object 其实是一个Map。 导致类型强转失败;
//这种方式感觉不太合理。很容易出现各种数据兼容问题
public T get(String key,Class<T> clazz) {
Object cache = redisTemplate.opsForValue().get(key);
return (T)cache;
}
}
问题描述:第二种利用 RedisTemplate 来封装操作,这用方式就是在获取redis 缓存数据的时候,转换为具体类型的时候遇到了问题;