ItGo.me - 专注IT技术分享

首页 > Redis > Spring Data Redis 项目源码框架分析

Spring Data Redis 项目源码框架分析

时间:2016-08-28来源:网友分享 点击:
redis是由Salvatore Sanfilippo用C语言编写的一个缓存系统,与memcached相比,提供了更多的处理复杂数据结构的方法;性能也非常的突出。

 由于项目需要,自己简单地看了下spring新加入的模块 spring data redis,spring data redis对jedis, jredis, rjc等redis的java客户端接口进行了进一部的抽象,类似于jdbcTemplate的实现。具体spring配置方式如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="; xmlns:xsi=";xmlns:p=";xmlns:context=";xsi:schemaLocation=";><bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"/><!-- Configurer that replaces ${...} placeholders with values from a properties file --><context:property-placeholder location="classpath:redis.properties"/><context:annotation-config /><context:component-scan base-package="org.springframework.data.redis.samples"/><bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"p:connection-factory-ref="connectionFactory"/></beans>

 connectionFactory功能类似于spring 数据库连接的datasource,提供对远程redis server的连接访问;  redisTemplate类似于SqlMapClientTemplate,提供对数据库访问的模板方法。 

下面是spring data redis class diagram
结合下面的代码我们进行分析:

public class Example{@autowiredprivate RedisTemplate<String,String> template;public void addLink(String userId, URL url){template.opsForList.leftPush(userId, url.toExternalForm);}}
 spring data redis根据数据的类型进行了接口方法的拆分,如 ValueOperations,ListOperations,SetOperations,ZSetOperations。template调用 opsForList拿到具体的对哪种数据结构进行操作的对象,进而调用相应的操作方法。DefaultListOperations等对象使用回调函数的方法向redis server进行请求。 
public Long leftPush(K key, V value) {final byte[] rawKey = rawKey(key);final byte[] rawValue = rawValue(value);return execute(new RedisCallback<Long>() {public Long doInRedis(RedisConnection connection) {return connection.lPush(rawKey, rawValue);}}, true);}
 在RedisTemplate中,有一个重要的方法execute对connection进行预处理,包括是否使用pipeline,是否expose(暴露)connection等,对server进行请求后的返回结果进行后续的处理等。 
/*** Executes the given action object within a connection that can be exposed or not. Additionally, the connection* can be pipelined. Note the results of the pipeline are discarded (making it suitable for write-only scenarios).** @param <T> return type* @param action callback object to execute* @param exposeConnection whether to enforce exposure of the native Redis Connection to callback code* @param pipeline whether to pipeline or not the connection for the execution* @return object returned by the action*/public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {Assert.notNull(action, "Callback object must not be null");RedisConnectionFactory factory = getConnectionFactory();//由spring中配置的JedisConnectionFactory创建连接RedisConnection conn = RedisConnectionUtils.getConnection(factory);boolean existingConnection = TransactionSynchronizationManager.hasResource(factory);preProcessConnection(conn, existingConnection);boolean pipelineStatus = conn.isPipelined();//判断是否打开pipelineif (pipeline && !pipelineStatus) {conn.openPipeline();}try {RedisConnection connToExpose = (exposeConnection ? conn : createRedisConnectionProxy(conn));T result = action.doInRedis(connToExpose);// TODO: any other connection processing?// 对后续结果进行处理,但postProcessResult还是直接返回result的,不知为何?return postProcessResult(result, conn, existingConnection);} finally {try {if (pipeline && !pipelineStatus) {conn.closePipeline();}} finally {RedisConnectionUtils.releaseConnection(conn, factory);}}}

Spring Data Redis 项目源码框架分析

Spring Data Redis 项目源码框架分析  讨论


redis 一二事 - 搭建集群缓存服务器

在如今并发的环境下,对大数据量的查询采用缓存是最好不过的了,本文使用redis搭建集群 (个人喜欢redis,对memcache不感冒) redis是3.0后增加的集群功能,非常强大 集群中应该至少有三个节点...

redis memcache 性能比较

redis和memcache非常像的,都是key,value的方式,将数据存放内存中。最近在学习redis,在网上看了一些这方面的资料,有三种观点: 1,redis读写内存比memcache快 2,memcache读写内存比redis快 3,memcache读写...

使用Redis实现锁(支持分布式应用)(整理网络资料)

使用Redis实现锁(支持分布式应用) 1. 简介 使用Redis指令setnx、expire、getset等操作实现互斥资源的访问 本文内容来着网络整理,参考: 2. 背景 在特殊业务逻辑中,需要保证莫一个操作同时只有...

redis是由Salvatore Sanfilippo用C语言编写的一个缓存系统,与memcached相比,提供了更多的处理复杂数据结构的方法;性能也非常的突出。 由于项目需要,自己简单地看了下spring新加入的模块 spring
------分隔线----------------------------