您的位置:首页 > 数据库 > Redis

redis的一些知识-redis事务multi

2018-01-16 10:33 351 查看
redis是有事务的,但是不同于mysql的事务。
redis的事务是由multi和exec包围起来的部分,当发出multi命令时,redis会进入事务,redis会进入阻塞状态,不再响应任何别的客户端的请求,直到发出multi命令的客户端再发出exec命令为止。那么被multi和exec包围的命令会进入独享redis的过程,直到执行完毕。
事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行。而一旦客户端发送了EXEC命令,所有的命令就都会被执行,即使此后客户端断线也没关系,因为Redis中已经记录了所有要执行的命令。

那么在事务过程中出错了怎么办?注意,这里只考虑运行时错误,不考虑redis语法错误,因为通过redis的api进行的命令是没有语法上的错误的。如果需要执行1,2,3个步骤,其中2在运行时出错了,那么不像mysql的事务那样会回滚,redis是继续往下执行,直到执行完毕,该事务算结束。
注意,redis是不会回滚的。
通过这种简单的独享型的事务机制,redis能避免多个客户端同时访问时,出现读写不一致的情况,来完成原子性事务。
spring data redis提供的RedisTemplate中有使用事务的方法,代码如下:
//execute a transaction
List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
operations.multi();
operations.opsForSet().add("key", "value1");

// This will contain the results of all ops in the transaction
return operations.exec();
}
});
System.out.println("Number of items added to set: " + txResults.get(0));即是在SessionCallback回调方法中,通过multi和exec来包围的部分。
和pipeline类似,返回值也是一个List,就是执行的各命令结果的集合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: