• java面试题整理《redis篇》六


    Redis事务控制
    Redis事务的本质是一组命令的集合,一次执行多个指令,事务中所有命令都被序列化,其他客户端提交的命令请求不会插入到事务执行命令序列中,简单来说:要不全执行,要不全不执行。Redis中提供了简单的事务功能,需要multi和exec两个命令实现。

    事务执行流程:

    开启事务(multi)
    命令入队(…)
    执行事务(exec)| 取消事务(discard)

    在Redis的事务中的命令出现不同错误时,处理机制也会有所差异:

    编译型异常(命令错误),事务中所有命令都不会执行,因为Redis没有隔离级别的概念,队列中的命令没有提交之前都不会实际的被执行。
    运行时异常(1/0),如果事务队列中存在语法性错误,那么执行命令的时候,其它命令是可以正常执行的,错误命令抛出异常,由此看出Redis的单条命令保证原子性,但是事务并不保证原子性,不支持回滚功能。
    Redis事务支持隔离性但不保证原子性:

    Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。
    Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
    通过事务实现上锁:
    在有些应用场景需要在事务之前,确保事务中的key没有被其它客户端修改过,才执行事务,否则不执行,着类似于乐观锁的概念,在Redis中也提供了相关实现方法:

    监视、加锁(watch)
    取消监视、解锁(unwatch)
    相关命令:

    MULTI:开启一个事务,它总是返回OK。MULT执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不斜立即被执行,而是被放到个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
    EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被返回空值null
    DISCARD:客户端可以清空事务队列,并放弃执行事务,并且客户端会从事务状态中退出
    WATCH:乐观锁,可以为Reds事务提供 check-and-set(CAS)行为,可以监控一个或多个键旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令
    UNWATCH:可以取消wach对所有key的监控
     

  • 相关阅读:
    Docker 基本管理
    pta数据结构day9
    "树形List"与"扁平List"互转(Java实现)
    网络营销利器:海外IP代理如何助力你的网络营销?如何选择?
    用 AWTK 和 AWPLC 快速开发嵌入式应用程序 (5)- 自定义功能块(下)
    【C++基础】10. 指针
    如何在Ubuntu20.04上安装RDP远程
    【嵌入式设计】Main Memory:SPM 便签存储器 | 缓存锁定 | 读取 DRAM 内存 | DREM 猝发(Brust)
    数据结构 —— BellmanFord算法
    【Python数据分析工具】
  • 原文地址:https://blog.csdn.net/hutubiancheng/article/details/125413821