redis事务随笔

最近在研究redis事务一致性的问题,有一点心得,随笔记录下与大家分享.

  Redis的事务和传统关系数据库的事务并不相同.在关系型数据库中,开始事务用到BEGIN,然后执行相应的操作,最后用户可以选择发送commit来确认之前的操作,也可以发送rollback来放弃之前的修改操作!

当然在Redis中也有简单的事务命令.即使用Multi为开始,之后跟着的命令会被串联,最后以EXEC结束. 但是这种方法有一种问题,就是在EXEC在调用之前不会执行任务实际操作,也就是说我们没有办法读取数据判断执行相应的业务逻辑.

当然在某种情况下这种方法也会有助于提高redis的性能.原因是redis在执行事务的过程中,会延迟执行之前的命令直到客户端发送EXEC命令为止.这种一次性发送多个命令,然后等待所有回复出现的做法通常我们称作为流水线.它可以

有效的减少redis服务器与客户端之间的网络通信次数来提升redis在执行多个命令时的性能.

watch命令: 用户使用watch命令对某一个键监视,直到用户执行EXEC命令的这段时间里,如果有其他的客户端抢先对任何被监视的键进行了替换,更新或者删除操作,那么该用户在执行EXEC命令的时候,事务将失败并返回一个错误.

通过使用此命令,我们可以确保使用到的数据不会被其他用户改动来避免出错

 unwathc命令: 此命令在watch命令之后执行,在Multi命令之前执行,用来对连接进行重置.

通过watch命令其实我们可以判定出redis是使用了乐观锁.那么为什么redis没有实现典型的加锁功能呢? 我想还是为了保证数据读取操作的高速性吧.在传统的关系型数据库中,在执行增删改操作的时候,数据库会对被访问的数据行进行加锁,

知道事务的提交(commit)或者回滚(rollback)如果有其他的客户端试图对被加锁的行数据进行更改,那么该客户端将会被阻塞,直到上一个事务执行完毕.加锁在实际使用中非常有效,但是有个很大的缺点就是上一个事务执行的时间越长,那么等待

解锁的客户端被阻塞的时间就会越长.所以redis为了减少客户端阻塞的时间,并没有在watch命令监视的键上加锁.只是在数据抢先被修改的情况下通知watch命令的客户端.这种做法我们称之为乐观锁.反之,一般的关系型数据库的加锁操作称之为悲观锁.

redis使用乐观锁极大的增加了它的查询性能,因为客户端永远不必花时间去等待上一个锁的释放.他们只需要在自己执行事务失败的时候进行重试即可.

时间: 2024-10-11 11:14:35

redis事务随笔的相关文章

Redis系列六 Redis事务

Redis事务 1.介绍 在Redis事务中可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 2.事务的作用 一个队列中,一次性.顺序性.排他性的执行一系列命令. 3.事物执行五中情况 case1:正常执行 执行exec全部成功 Case2:放弃事务 执行Discard Case3:全体连坐 在向事物队列中添加命令的时候报错,然后执行Exec会全部失败. Case4:冤头债主 在向事物队列中添加命令的时候没有报错,但在

redis事务(转载)

原文地址:http://blog.csdn.net/hechurui/article/details/49508749 Redis事务 首先,Redis本身是单线程的. redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行.Redis事务的实现需要用到 MULTI 和 EXEC 两个命令,事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXE

Redis 事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行. 一个事务从开始到执行会经历以下三个阶段: 开始事务. 命令入队. 执行事务. 实例 以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令

Redis学习笔记(4) Redis事务、生存时间及排序

1. Redis事务 Redis中的事务(transaction)是一组命令的集合,一个事务中的命令要么都执行,要么都不执行.事务的原理是先将属于一个事务的命令发送给Redis,然后再让Redis依次执行这些命令. 127.0.0.1:6379> multi OK 127.0.0.1:6379> sadd user:1:following 2 QUEUED 127.0.0.1:6379> sadd user:2:followers 1 QUEUED 127.0.0.1:6379>

(6)redis 事务

redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中.当从此连接受到exec命令后,redis会顺序的执行

redis学习之——Redis事务(transactions)

Redis事务:可以一次执行多个命令,本质是一组命令的集合.一个事务中的,所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞. 常用命令:MULTI  开启事务  EXEC 提交事务. DISCARD  放弃事务  WATCH  监控事务  UNWATCH   取消监控事务 case1:正常执行                                                   case2:放弃事务 case3:全体连坐                     

Redis事务使用方法

Redis事务 Redis事务是一组命令的集合,也是Redis的最小执行单位之一.一个事务的所有命令,要么都执行,要么都不执行.Redis能保证事务执行期间不会有其他命令插入. 相关命令 命令 格式 说明 DISCARD DISCARD 取消事务 EXEC EXEC 执行事务中的命令 MULTI MULTI 标记一个事务的开始 UNWATCH UNWATCH 取消对key的监视 WATCH WATCH key [key ...] 监视一个或多个key 执行MULTI后,在EXEC或DISCARD

Redis事务的分析及改进

Redis事务的分析及改进 Redis的事务特性 数据ACID特性满足了几条? 为了保持简单,redis事务保证了其中的一致性和隔离性: 不满足原子性和持久性: 原子性 redis事务在执行的中途遇到错误,不会回滚,而是继续执行后续命令:(违反原子性) 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作: 中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做: 比如: redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7

Redis订阅和发布模式和Redis事务

-------------------Redis订阅和发布模式------------------- 1.概念 Redis 发布订阅(pub/sub)是一种消息通信模式: 发送者(pub)发送消息, 订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 2.subscribe channel:订阅个指定频道的信息 3.publish channel message:将信息message 发送到指定的频道channel 4.应用场景 1.今日头条订阅号.微信订阅公众号.新浪微博关