从今天开始,开始慢慢学习Spring 对 redis 中各种特性的支持,事务啦,pipeline啦,sharding啦,cache啦,还有就是分布式中和用jedispool 等等之中的东西,东西好多呀。头大了。。
1.首先看Jedis 原生态的对事务的处理
Jedis jedis = new Jedis("192.168.137.100",6379); Transaction tx = jedis.multi(); for(int i=0;i<1000; i++){ tx.set("zhang"+i, "hao"+i); } List<Object> result = tx.exec(); jedis.disconnect();
其中可以用Jedis 的 watch(key) 来实现乐观锁,有一点,如果事务处理器中出现错误,不会回滚,出错那条不会处理,还有Jedis的 discard 方法来取消事务,可以自己模拟多线程来看看这两个方法的使用,还有一点,事务是异步执行,所以不能再事务中调用get 同步查询结果,都是坑呀。。。。
2.Spring中对Redis 事务的支持
(1)
rt.watch("zhang"); rt.multi(); for(int i=0;i<10;i++){ BoundHashOperations<String, String, String> hs = rt.boundHashOps("zhang"); hs.put("zhang"+i, "hao"+i); } rt.exec();
我们按照上面的思路,然后写下了上面这段代码。然后就报错了: java.lang.NullPointerException,
好吧 看下面一段代码:
SessionCallback<String> sessionCallback = new SessionCallback<String>() { @Override public <K, V> String execute(RedisOperations<K, V> operation) throws DataAccessException { operation.multi(); for(int i=0;i<10;i++){ BoundHashOperations<String, String, String> hs = ((RedisTemplate)operation).boundHashOps("zhang"); hs.put("zhang"+i, "hao"+i); } operation.exec(); return null; } }; rt.execute(sessionCallback);
这段代码就执行成功了,为什么呢。只有Google 大神们是怎么解释了:
首先还是看源码:
public void multi() { execute(new RedisCallback<Object>() { public Object doInRedis(RedisConnection connection) throws DataAccessException { connection.multi(); return null; } }, true); }
这里要实现一个指定返回类型的RedisCallback接口,这个接口只有一个函数doInRedis
doInRedis的参数是RedisConnection接口,spring-data-redis针对不的Redis Java Client都有对应的 RedisConnection实现:
JedisConnection
JredisConnection
RjcConnection
SrpConnection
目的就是将不同Client的API统一了一下,可以看成是Adapter吧 。
execute这个是模板函数,主是处理连接的问题。
spring-data-redis 针对不的 Redis Java Client 也都实现了相应的 RedisConnectionFactory,来获取连接。
比如 JedisConnectionFactory 内部是通过 JedisPool 来实现连接工厂。
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) { Assert.notNull(action, "Callback object must not be null"); RedisConnectionFactory factory = getConnectionFactory(); RedisConnection conn = RedisConnectionUtils.getConnection(factory); boolean existingConnection = TransactionSynchronizationManager.hasResource(factory); preProcessConnection(conn, existingConnection); boolean pipelineStatus = conn.isPipelined(); if (pipeline && !pipelineStatus) { conn.openPipeline(); } try { RedisConnection connToExpose = (exposeConnection ? conn : createRedisConnectionProxy(conn)); T result = action.doInRedis(connToExpose); // close pipeline if (pipeline && !pipelineStatus) { conn.closePipeline(); } // TODO: any other connection processing? return postProcessResult(result, conn, existingConnection); } finally { RedisConnectionUtils.releaseConnection(conn, factory); } }
可以看到,正常情况下每次connection都是新的,那上上一段代码中得multi 就没用了。
这样。好吧 我懒得复制了,可以看下这个大神的博客:http://jimgreat.iteye.com/blog/1596058 讲的很清楚sessioncallback如何捆绑session。
http://stackoverflow.com/questions/10750626/transactions-and-watch-statement-in-redis 这段解释了watch的操作,非常明白 一看就懂,
今天太忙了,只稍微看了看事务这一快,感觉支持的不是很好,明天继续看吧 ,加油。
相关推荐
在遇到编译问题时,可以参考描述中提到的文章“Spring源码学习之路——第二天~加载Spring源码”,这将帮助你解决可能遇到的困难。 总的来说,Spring 5.0.x源码分析是一项有价值的工程,它不仅能帮助你掌握Spring...
从压缩包子文件的文件名称"day04-springboot2"来看,这可能是一个课程或训练系列的一部分,特别是第四天的内容,且专注于Spring Boot的第二部分。这可能涵盖了更深入的主题,比如微服务、云部署、持续集成/持续部署...
4. **框架应用**:Spring框架是JavaEE开发的常用工具,它提供了依赖注入(DI)和面向切面编程(AOP)等功能,简化了项目管理和事务控制。在商城系统中,Spring MVC可以用于构建前端控制器,Spring JDBC或MyBatis用于...
少儿编程scratch项目源代码文件案例素材-直升机飞行.zip
wanjunshe_Python-Tensorflow_12888_1745868924470
健康监测_Android开发_BLE蓝牙通信_心率数据采集与存储_基于小米手环2的实时心率监测应用_支持后台长时间运行的心率记录工具_可导出SQLite数据库的心率数据分析系统_适
少儿编程scratch项目源代码文件案例素材-种花模拟器.zip
嵌入式系统开发_FreeRTOS实时操作系统_STM32F103C8T6微控制器_OLED显示屏_DHT11温湿度传感器_多任务调度_多级菜单设计_万年历算法_电子闹钟功能_参数配
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
scratch少儿编程逻辑思维游戏源码-猫猫粉碎.zip
scratch少儿编程逻辑思维游戏源码-蓝胡子.zip
scratch少儿编程逻辑思维游戏源码-美食大亨.zip
scratch少儿编程逻辑思维游戏源码-洛克人.zip
scratch少儿编程逻辑思维游戏源码-龙冲刺.zip
思幻个人引导页V2.2版本11月29日更新.zip
scratch少儿编程逻辑思维游戏源码-骑士风斩法.zip
移动应用开发_H5CSS3ionicng-cordovaMVVM模式_基于HTML5和CSS3技术实现多页面布局ionic指令数据绑定ui-route单页跳转调用手机
少儿编程scratch项目源代码文件案例素材-植物大战僵尸创造版 Ver. 1.0.3.zip
scratch少儿编程逻辑思维游戏源码-日落(2).zip
动态星空背景个人主页(带后台).zip