因为以前的老的项目一直在使用 Jedis 做为Redis的Java客户端操做数据,Jedis 与JedisPool 做为官方推荐的API,其操做与redis-cli 客户端操做一模一样,在Spring 大行其道的时代,固然也须要好好了解下RedisTemplate 的操做以及源码。
![]()
经过源码分析:
RedisOperations --定义了Redis的基本操做,提供可扩展性,由 RedisTemplate 实现。
RedisAccessor --定义了RedisTemplate 的一些公有属性
InitializingBean --Spring Bean 对象的初始化,其内部仅仅有一个方法:afterPropertiesSet ,只要是实现该接口,均会在Bean对象初始化时调用该方法java
public class RedisAccessor implements InitializingBean { protected final Log logger = LogFactory.getLog(getClass()); private RedisConnectionFactory connectionFactory; public void afterPropertiesSet() { Assert.notNull(getConnectionFactory(), "RedisConnectionFactory is required"); } /** * Returns the connectionFactory. */ public RedisConnectionFactory getConnectionFactory() { return connectionFactory; } /** * Sets the connection factory. */ public void setConnectionFactory(RedisConnectionFactory connectionFactory) { this.connectionFactory = connectionFactory; }
public interface InitializingBean { void afterPropertiesSet() throws Exception; }
Helper class that simplifies Redis data access code.
简化Redis数据访问代码的Helper类
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) { Assert.isTrue(initialized, "template not initialized; call afterPropertiesSet() before using it"); Assert.notNull(action, "Callback object must not be null"); RedisConnectionFactory factory = getConnectionFactory(); RedisConnection conn = null; try { if (enableTransactionSupport) { // only bind resources in case of potential transaction synchronization conn = RedisConnectionUtils.bindConnection(factory, enableTransactionSupport); } else { conn = RedisConnectionUtils.getConnection(factory); } boolean existingConnection = TransactionSynchronizationManager.hasResource(factory); RedisConnection connToUse = preProcessConnection(conn, existingConnection); boolean pipelineStatus = connToUse.isPipelined(); if (pipeline && !pipelineStatus) { connToUse.openPipeline(); } RedisConnection connToExpose = (exposeConnection ? connToUse : createRedisConnectionProxy(connToUse)); T result = action.doInRedis(connToExpose); // close pipeline if (pipeline && !pipelineStatus) { connToUse.closePipeline(); } // TODO: any other connection processing? return postProcessResult(result, connToUse, existingConnection); } finally { if (enableTransactionSupport) { RedisConnectionUtils.unbindConnection(factory); } else { RedisConnectionUtils.releaseConnection(conn, factory); } } }
- 根据RedisConnectionFactory 获取 RedisConnection
- 执行RedisCallback. doInRedis
- 返回结果
public class StringRedisTemplate extends RedisTemplate<String, String> { public StringRedisTemplate() { RedisSerializer<String> stringSerializer = new StringRedisSerializer(); setKeySerializer(stringSerializer); setValueSerializer(stringSerializer); setHashKeySerializer(stringSerializer); setHashValueSerializer(stringSerializer); } public StringRedisTemplate(RedisConnectionFactory connectionFactory) { this(); setConnectionFactory(connectionFactory); afterPropertiesSet(); } protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) { return new DefaultStringRedisConnection(connection); } }
未完,待续