RedisTemplate实现事物问题剖析和解决
2017-05-22 14:10
225 查看
一、问题描述
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,Redis对事物支持不会很复杂,当一个客服端连接Redis服务时,发出了MULTI命令时,这个连接会进入事物,在执行MULTI命令之后,执行所有的命令都不会执行,会先放到一个队列中,会提示正在Query,当最后执行EXEC命令之后,Redis会按照之前的进入队列的顺序,执行命令。Spring Data Redis 是对JRedis的客服端进行很好的封装, spring Data Redis的RedisTemplate提供了MULTI、EXEC命令进行封装,但RedisTemplate先执行调用MULTI方法,然后在执行其它的命令,最后执行EXEC方法时,会出现报错:Caused by:Redis.clents.jedis.exceptions.JedisDataException:ERR EXEC without MULTI问题。
二、原因分析
Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,我们需要重新添加数据,对原先的数据进行删除,在多个线程情况下数据会丢失,所以我们需要事务完成相应的效果。Spring Data Redis的RedisTemplate提供了MULTI、EXEC命令进行封装,远看可以解决问题时,代码实现:
[java] view plain copy
stringRedisTemplate.multi();
stringRedisTemplate.delete("test");
stringRedisTemplate.opsForValue().set("test","2");
stringRedisTemplate.exec();
结果保 错误:
我们查询multi、delete等源代码,发现会执行RedisTemplate类中execute()方法进行跟踪发现 RedisCallback中doInRedis获取的RedisConnection每次都是新的,所以才导致该问题。
分析Redis源代码:
我们查看multi实现
跟踪发现RedisConnection conn每次都是新的,导致出现那个错误
三、解决方案
只能自己实现RedisCallBack底层,采用RedisTemplate的SesionCallback来完成在同一个Connection中,完成多个操作的方法:SessionCallback<Object> sessionCallback=new SessionCallback<Object>(){
@Override
public Object execute(RedisOperations operations) throws DataAccessException{
operations.multi();
operations.delete("test");
operations.opsForValue.set("test","2");
Object val=operations.exec();
return val;
}
}
StringRedisTemplate.execute(sessionCallback);
相关文章推荐
- Spring Data Redis 二:RedisTemplate实现事物问题剖析和解决
- RedisTemplate实现事物问题剖析和解决
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为(转)
- 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
- redis+cookies实现session机制(解决 手机浏览器不自动回传cookies导致session不可用问题)
- 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
- 基于redis(key分段,避免一个key过大) 和db实现的 布隆过滤器(解决hash碰撞问题)
- 一步一步SharePoint 2007之二十二:完美解决实现Form认证后无法再用SharePoint Designer编辑网站的问题
- 实现datagrid的foot中增加一个新增数据行,以解决datagrid不能新增数据的问题
- 深入剖析Java编程中的中文问题及建议最优解决方法
- 一步一步SharePoint 2007之二十:解决实现注册用户后,自动具备访问网站的权限的问题(2)——配置Role
- 动态规划解决矩阵链乘问题的java编码实现
- 深入剖析Java编程中的中文问题及建议最优解决方法--上篇 - [原创]
- 深入剖析Java编程中的中文问题及建议最优解决方法
- jsp实现文件下载与中文文件名乱码问题解决
- 一步一步SharePoint 2007之十七:解决实现Form认证后无法再用SharePoint Designer编辑网站的问题
- 深入剖析Java编程中的中文问题及建议最优解决方法
- 实现datagrid的foot中增加一个新增数据行,以解决datagrid不能新增数据的问题
- 深入剖析Java编程中的中文问题及建议最优解决方法--下篇
- 深入剖析Java编程中的中文问题及建议最优解决方法--上篇