经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Redis » 查看文章
Redis基础之事务
来源:cnblogs  作者:Alan.hsiang  时间:2021/1/25 11:06:19  对本文有异议

如果Redis需要执行一组命令,为了保持数据的一致性,连续性,需要用到事务(Transaction),本文以一些简单的小例子,简述Redis事务相关内容,仅供学习分享使用,如有不足之处,还请指正。

Redis事务涉及命令

  • DISCARD:取消事务,且DISCARD是与MULTI成对出现,不可以单独使用。
  • MULTI:标记一个事务块的开始。
  • EXEC:顺序执行所有事务内的命令。
  • WATCH:监视一个或多个key。
  • UNWATCH:取消监视。

 

事务基本操作

基本事务以MULTI开始,以EXEC结束,中间是一组Redis命令,如下所示:

  1. 1 127.0.0.1:6379> MULTI
  2. 2 OK
  3. 3 127.0.0.1:6379> SET NAME HSIANG
  4. 4 QUEUED
  5. 5 127.0.0.1:6379> SET AGE 20
  6. 6 QUEUED
  7. 7 127.0.0.1:6379> SET SEX MALE
  8. 8 QUEUED
  9. 9 127.0.0.1:6379> SET ADDR SHENZHEN
  10. 10 QUEUED
  11. 11 127.0.0.1:6379> EXEC
  12. 12 1) OK
  13. 13 2) OK
  14. 14 3) OK
  15. 15 4) OK
  16. 16 127.0.0.1:6379>

 

取消事务

取消事务,则恢复数据到事务执行之前的状态,以MULTI开始,以DISCARD结尾,如下所示:

  1. 1 127.0.0.1:6379> GET AGE
  2. 2 "20"
  3. 3 127.0.0.1:6379> MULTI
  4. 4 OK
  5. 5 127.0.0.1:6379> INCR AGE
  6. 6 QUEUED
  7. 7 127.0.0.1:6379> INCR AGE
  8. 8 QUEUED
  9. 9 127.0.0.1:6379> INCR AGE
  10. 10 QUEUED
  11. 11 127.0.0.1:6379> DISCARD
  12. 12 OK
  13. 13 127.0.0.1:6379> GET AGE
  14. 14 "20"

 

事务部分执行

Redis事务中,如果要执行的一组命令中,没有语法错误,但是有数据类型错误,在进行EXEC的时候,则其他命令执行成功,错误数据执行失败,即为部分成功。如下所示:

  1. 1 127.0.0.1:6379> MULTI
  2. 2 OK
  3. 3 127.0.0.1:6379> INCR AGE
  4. 4 QUEUED
  5. 5 127.0.0.1:6379> INCR ADDR
  6. 6 QUEUED
  7. 7 127.0.0.1:6379> INCR AGE
  8. 8 QUEUED
  9. 9 127.0.0.1:6379> EXEC
  10. 10 1) (integer) 21
  11. 11 2) (error) ERR value is not an integer or out of range
  12. 12 3) (integer) 22
  13. 13 127.0.0.1:6379> GET AGE
  14. 14 "22"

 

事务终止

如果要执行的Redis命令,存在语法错误,则在进行EXEC的时候回滚,如下所示:

  1. 1 127.0.0.1:6379> MULTI
  2. 2 OK
  3. 3 127.0.0.1:6379> INCR AGE
  4. 4 QUEUED
  5. 5 127.0.0.1:6379> SET ADDR
  6. 6 (error) ERR wrong number of arguments for 'set' command
  7. 7 127.0.0.1:6379> INCR AGE
  8. 8 QUEUED
  9. 9 127.0.0.1:6379> EXEC
  10. 10 (error) EXECABORT Transaction discarded because of previous errors.
  11. 11 127.0.0.1:6379> GET AGE
  12. 12 "22"

Redis锁

锁分为乐观锁,悲观锁,以下分别介绍:

  • 悲观锁(Pessimistic Lock):正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。
  • 乐观锁(Optimistic Locking):是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。

WATCH监控

当监控的key的值在事务之前发生变化了,则事务不被执行。只有取消监控后,事务才会执行,如下所示:

  1. 1 127.0.0.1:6379> WATCH balance
  2. 2 OK
  3. 3 127.0.0.1:6379> set balance 300
  4. 4 OK
  5. 5 127.0.0.1:6379> MULTI
  6. 6 OK
  7. 7 127.0.0.1:6379> INCRBY balance 10
  8. 8 QUEUED
  9. 9 127.0.0.1:6379> DECRBY debt 10
  10. 10 QUEUED
  11. 11 127.0.0.1:6379> EXEC
  12. 12 (nil)
  13. 13 127.0.0.1:6379> GET balance
  14. 14 "300"
  15. 15 127.0.0.1:6379> UNWATCH
  16. 16 OK

Redis事务的特性

  1. 单独的隔离操作:事务中的所有命令,都会被序列化,按顺序执行。事务在执行过程中,不会被其他的命令请求中断。
  2. 没有隔离级别的概念:队列中的命令,没有提交之前,都没有实际的被执行,也就不存在事务内查看事务内的更新。
  3. 不保证原子性:redis同一事务中,如果有某一条命令执行失败,则其他命令会被执行,不会回滚(与关系型数据库不同)。

备注

早发白帝城

作者:李白(唐代)

朝辞白帝彩云间,千里江陵一日还。

两岸猿声啼不住,轻舟已过万重山。

原文链接:http://www.cnblogs.com/hsiang/p/14311126.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号