zoukankan      html  css  js  c++  java
  • Redis基础之事务

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

    Redis事务涉及命令

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

    事务基本操作

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

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

    取消事务

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

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

    事务部分执行

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

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

    事务终止

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

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

    Redis锁

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

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

    WATCH监控

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

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

    Redis事务的特性

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

    备注

    早发白帝城

    作者:李白(唐代)

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

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


    作者:Alan.hsiang
    出处:http://www.cnblogs.com/hsiang/
    本文版权归作者和博客园共有,写文不易,支持原创,欢迎转载【点赞】,转载请保留此段声明,且在文章页面明显位置给出原文连接,谢谢。

  • 相关阅读:
    设计模式JS中的单例模式应用(一)
    SSD5_ Exercise 4分析
    JavaEE学习笔记
    SSD5_Exercise5分析
    SSD5_Optional Exercise6分析
    ACM相关网站
    hdu 2066 一个人的旅行【Dijkstra 12级新生训练—图论E】
    新队员图论基础_【CSUST_12级训练】
    hdu 2112 Today【F map + Floyd 入门训练】
    turtle库笔记
  • 原文地址:https://www.cnblogs.com/hsiang/p/14311126.html
Copyright © 2011-2022 走看看