Spring-Data-Redis是什么?
Spring-Data-Redis是Spring-Data的一个子项目,其提供了简单的设置便于在Spring应用中快速加入对redis的支持。其提供了较高层次的抽象接口RedisTemplate用于数据的读写。实际上,Spring-Data-Redis还支持更高层次的抽象接口CrudRepository,将数据以Json的形式存储在Redis-Hash中,从而使得代码中可以像操作数据库一样去操作Redis。
Spring-Data-Redis-Repository
使用Repository的优势
- 将Redis的读写数据按照业务封装成Repository后,相当于对数据进行了表隔离,免去了对数据类型过多造成的多实例隔离或分库隔离的麻烦。例如
@RedisHash("AValue")
public class AValue {
@id
private String id;
private String name;
}
@RedisHash("BValue")
public class BValue {
@id
private String id;
private Integer count;
}
......
@Repository
public interface ARepo extends CrudRepository<AValue, String> {
}
@Repository
public interface BRepo extends CrudRepository<BValue, String> {
}
......
@Autowired
private ARepo aRepo;
@Autowired
private BRepo bRepo;
void actionMethod(){
AValue a = new AValue("1","a");
BValue a = new BValue("1", 123);
aRepo.save(a);
bRepo.save(b);
}
- 通过@Indexed注解建立索引,可以直接对Value中的某个field进行搜索。
- 通过@TimeToLive注解可以设置过期时间,省去了代码主动去remove的动作。
使用自定义的class作为id
笔者在项目中使用的Spring-Data-Redis的maven版本是1.7.2.RELEASE,截至笔者写下这篇博客时,最新 版本是2.0.0.M1。经过对官方文档的查阅,支持使用Java的基础类型如String,Integer,Long等作为id(默认推荐使用String),都没有支持使用自定义的class作为id。
然而实际的业务情境中,需要根据多个信息作为联合主键进行存储。笔者根据对源码的理解,在1.7.2.RELEASE版本下实现了一种可用方式。由于源码可能会更新,利用的接口可能会修改,并不保证其它的版本可以直接使用,可能需要酌情修改。
定义通用 class to byte[] 和 class to String 的Converter
在Spring-Data-Redis-Repository的实现中,数据是存储在Redis-Hash中的,通过@RedisHash自定义的Entity也是需要通过内置的Json转换器转化成byte或String的,读取时再逆向转换。官方文档中提供了自定义转换器的示例 。
参考这个示例,笔者定义了几个通用的转换器。
public