内容简介:背景Jedis源码分析下文仅以redis 五种类型的 String和List 数据结构为例:
简介
Spring Data Redis 源代码 spring-projects/spring-data-redis 示例代码
ListOperations<String, Person> listOps = template.listOps(); listOps.rightPush(random, new Person("Jane", "Smith")); List<Person> peopleOnSecondFloor = listOps.range("users:floor:2", 0, -1);
背景Jedis源码分析
spring-data-redis实现
下文仅以 redis 五种类型的 String和List 数据结构为例:
RedisTemplate 和ValueOperations、ListOperation 互相持有对方的引用, RedisTemplate 作为用户操作的入口对象, ValueOperations、ListOperation 等负责分担五种数据类型的 操作。
- 数据操作最终由 JedisConnection 来完成
- 从spring-data-redis 实现看,spring-data-redis 只是将jedis 作为 redis 访问的 工具 之一,并没有严格绑定
- JedisConnection 与 JedisStringCommands、JedisListCommands 等互相持有对方的引用,JedisStringCommands、JedisListCommands 等负责分担五种数据类型的 操作。
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) { RedisConnectionFactory factory = getRequiredConnectionFactory(); RedisConnection conn = null; try { if (enableTransactionSupport) { 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); if (pipeline && !pipelineStatus) { connToUse.closePipeline(); } return postProcessResult(result, connToUse, existingConnection); } finally { RedisConnectionUtils.releaseConnection(conn, factory); } }
RedisTemplate使用模板模式,提供了高层调用结构和基本的逻辑实现(execute逻辑就是:建连接,序列化,发请求数据,拿数据,返回)。ValueOperations、ListOperation 对应的命令由它们自己实现,双方的结合点就是callback。这和spring-jdbc中的JdbcTemplate非常相像。
ScriptingCommands
redis中提供对 lua 脚本的支持,jedis和sdr自然也不甘落后,也都提供了支持。
反应在jedis上,就是ScriptingCommands接口,从中可以看出一种感觉,eval命令和set命令并无本质不同,在实现上都是完成参数的传递即可,并没有因为其功能不同,有特别的处理。
public interface ScriptingCommands { // 以eval方式执行lua脚本 Object eval(String script, int keyCount, String... params); Object eval(String script, List<String> keys, List<String> args); Object eval(String script); // 以evalsha方式执行lua脚本 Object evalsha(String sha1); Object evalsha(String sha1, List<String> keys, List<String> args); Object evalsha(String sha1, int keyCount, String... params); // 判断lua脚本是否存在 Boolean scriptExists(String sha1); List<Boolean> scriptExists(String... sha1); // 加载lua脚本 String scriptLoad(String script); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 以太坊源码分析(36)ethdb源码分析
- [源码分析] kubelet源码分析(一)之 NewKubeletCommand
- libmodbus源码分析(3)从机(服务端)功能源码分析
- [源码分析] nfs-client-provisioner源码分析
- [源码分析] kubelet源码分析(三)之 Pod的创建
- Spring事务源码分析专题(一)JdbcTemplate使用及源码分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Seasoned Schemer
Daniel P. Friedman、Matthias Felleisen / The MIT Press / 1995-12-21 / USD 38.00
drawings by Duane Bibbyforeword and afterword by Guy L. Steele Jr.The notion that "thinking about computing is one of the most exciting things the human mind can do" sets both The Little Schemer (form......一起来看看 《The Seasoned Schemer》 这本书的介绍吧!
XML、JSON 在线转换
在线XML、JSON转换工具
HEX HSV 转换工具
HEX HSV 互换工具