Redis学习笔记三:redis事物及锁的应用

来源:互联网 发布:单页面网站seo 编辑:程序博客网 时间:2024/06/02 05:33
Redis和MySQL一样,也支持简单的事物,并且redis还可以对key进行加锁,防止同时对某一key操作而导致数据错误


一、 Redis与MySQL事物比较:


 MySQLRedis开启语句start transactionmuitl事物语句普通sql普通Redis命令执行失败rollback 回滚discard 取消执行成功commitexec

二、 redis事物模拟:


1、 正确执行的事物


127.0.0.1:6379> set ticket 10       #设置初始值OK  127.0.0.1:6379> set money 500       #设置初始值OK127.0.0.1:6379> multi               #事物开始OK127.0.0.1:6379> decr ticket         #命令操作,ticket减1QUEUED  # 加入队列  127.0.0.1:6379> decrby money 100    #命令操作,money减100QUEUED  # 加入队列127.0.0.1:6379> exec                # 执行事物,保证原子性1) (integer) 92) (integer) 400


2、 事物执行过程中,若语句出现语法错误,则事物操作失败


127.0.0.1:6379> mget ticket money1) "9"2) "400"127.0.0.1:6379> multi              OK127.0.0.1:6379> decr ticketQUEUED127.0.0.1:6379> wrong-conmmand   # 错误的命令 (error) ERR unknown command 'wrong-conmmand'127.0.0.1:6379> decrby money 100QUEUED127.0.0.1:6379> exec(error) EXECABORT Transaction discarded because of previous errors.  # 事物取消127.0.0.1:6379> mget ticket money1) "9"     # 结果不变2) "400"


3、如果事物中的语句没有语法错误,但是有不适当的语句,比如与事物不相关的语句,exec之后,会执行正确的语句,并跳过有不适当的语句.


127.0.0.1:6379> multiOK127.0.0.1:6379> decr ticketQUEUED127.0.0.1:6379> lpush tmp_list 123  # 语法没有错QUEUED # 正常加入队列127.0.0.1:6379> exec 1) (integer) 82) (integer) 1127.0.0.1:6379> mget ticket money1) "8"  # 执行后对原有结果有影响2) "400"


三、Redis的事物锁机制


       当Redis事物语句中操作了一个key的值,在exec之前,如果有其他原因导致该key的值改变就会引起数据不同步或其他错误(如秒杀导致商品数量为负数),对于这种问题,Redis提供了锁机制(watch),Redis事物中启用的是乐观锁,只负责检测key的值有没有被改动

redis 127.0.0.1:6379> watch ticket    # 对ticket进行监控OKredis 127.0.0.1:6379> multiOKredis 127.0.0.1:6379> decr ticketQUEUEDredis 127.0.0.1:6379> decrby money 100QUEUEDredis 127.0.0.1:6379> exec   # 执行前我们启动了另一个终端,并且改变了ticket的值(nil)   # 返回nil,说明监视的ticket已经改变了,事务就取消了.
原创粉丝点击