- Spring对于redis的集成很大程度上方便了开发人员操作redis的各种数据。屏蔽了对于底层redis连接的获取,释放。Spring-data-redis主要集成了jedis第三方客户端的操作。
redis中主要有5种数据类型,分别为String,List,Set,Map,sort set.每一种数据结构在spring中都封装成一个操作接口。类图如下:
上述5个接口定义了redis操作行为,主要是面向上层应用操作,程序开发人员直接通过这些接口的实例进行操作redis。每一种数据接口都有一个默认的实现类,都是以Defalut开头,同时都继承了AbstractOperations抽象类。该父类中定义了RedisTemplate的应用,同时通过定义一个内部类来实现对回调接口RedisCall的引用。核心源码如下:
abstract class AbstractOperations<K, V> {
// utility methods for the template internal methods
// 内部类实现回调接口
abstract class ValueDeserializingRedisCallback implements RedisCallback<V> {
private Object key;
public ValueDeserializingRedisCallback(Object key) {
this.key = key;
}
// 采用模板方法设计,doInRedis中定义算法骨架,具体的子类实现inRedis功能
public final V doInRedis(RedisConnection connection) {
byte[] result = inRedis(rawKey(key), connection);
return deserializeValue(result);
}
// 具体子类实现inRedis功能,作为模板方法的具体实现功能部分。
protected abstract byte[] inRedis(byte[] rawKey, RedisConnection connection);
}
RedisTemplate<K, V> template;
}
- 抽象类AsbtractOperations中的抽象内部类ValueDeserializingRedisCallback 实现了回调接口RedisCall,该接口中定义了一个非常重要的方法就是doInRedis(RedisConnection connection)。这是spring-data-redis中非常核心的方法,后续会讲述。该抽象内部类ValueDeserializingRedisCallback 采用了模板方法思想,doInRedis方法为业务逻辑的主要执行入口,抽象方法inRedis,主要是具体的实现类去完成最终的redis操作。redis是一个Key-Value数据库,所以inRedis中方法参数都可以定义为key和RedisConnection两个参数。
- RedisConnection顾名思义,就是封装了redis连接,借鉴java.sql.connection思想,主要封装了底层操作redis的操作。
接口 RedisConnection继承了RedisCommand接口,而RedisCommand接口继承了一堆封装了redis操作命令的接口。RedisConnection是Redis操作的核心接口。
通过UML类图可以发现RedisConnection接口具体实现主要有JedisConnection和JedisClusterConnection两个实现类。分别封装了redis操作,redis哨兵和RedisCluster操作。
- RedisTemplate中最核心的设计思想主要是两部分,第一是采用ThreadLocal将redis连接与线程请求绑定,即每个线程都会操作单独的redis连接。第二是采用回调的设计思想,将回调接口RedisCallback中具体的redis操作行为最终采用匿名内部类实现。即实现上述中ValueDeserializingRedisCallback 类中的抽象方法InRedis。这两个部分的设计完美的体现了Spring封装redis的操作核心理念。
- TransactionSynchronizationManager事物同步资源管理器,这个工具类是spring事物模块中的一个核心操作类。在spring-tx.jar中,可见这个工具类的重要性。这个工具类中有如下几个属性: