首页 > 数据库 >Redis事务

Redis事务

时间:2023-01-05 11:47:27浏览次数:57  
标签:事务 Redis watch 命令 执行 客户端

参考资料:
https://www.cnblogs.com/wkfvawl/p/15754956.html

事务

1.1 事务定义

Redis 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其他命令插入,不许加塞。

redis是单线程为什么还要事务?
redis 利用单线程 IO多路复用 实现了 单命令操作的原子性,但是多个命令的操作就不具备原子性

1.2 事务相关指令

  • 从输入 multi 命令开始,输入的命令都会依次进入命令队列中,但不会执行,至到输入 exec 后,Redis 会将之前的命令队列中的命令依次执行。
  • 组队的过程中可以通过 discard 来放弃组队。

image

  • 组队中某个命令出现了报告错误,执行时整个的所有队列会都会被取消。

image

image

  • 如果执行阶段某个命令报出了错误(类比运行时异常),则只有报错的命令不会被执行,而其他的命令都会执行,不会回滚。

image

image

1.3事务特性

  • 单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  • 没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,在事务外查询不能看到”这个让人万分头痛的问题。

  • 不保证原子性:Redis 同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚


假设有这么一个场景:有 3 个人有你的账户,同时去参加双十一抢购
image

悲观锁&乐观锁

image

悲观锁(Pessimistic Lock),每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。这样别人想拿这个数据就会 block 直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock),每次去拿数据的时候都认为别人不会修改,所以不会上锁。但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用这种 check-and-set 机制实现事务的。

watch|unwatch

  • watch
    在执行 multi 之前,先执行 watch key1 [key2 ...],可以监视一个(或多个) key,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

image

  • unwatch
    取消 watch 命令对所有 key 的监视。如果在执行 watch 命令之后,exec 命令或 discard 命令先被执行了的话,那么就不需要再执行 unwatch 了。

pipeline和事务的区别

  • pipeline是客户端的行为,对于服务器来说是透明的:pipeline是将要发送的命令都存储在客户端,等到需要发送时将所有命令打包一起发送给服务器,pipeline没办法保证原子性

  • 事务是服务端行为:客户端向redis服务器发送MULTI指令后,服务器不会再执行该服务器的请求(除特定指令外),而是将客户端的所有请求都装入指令队列中,直到接收到客户端的EXEC指令,这时会将对应该客户端队列中的所有指令都执行并返回结果给客户端。

标签:事务,Redis,watch,命令,执行,客户端
From: https://www.cnblogs.com/d111991/p/17027081.html

相关文章

  • Redis企业云如何通过缓存轻松扩展到亿级请求?
    你是否在春运抢票过程中遇到12306APP瘫痪?你是否在双十一抢好物的时候显示系统繁忙?你是否在微博刷某个爆了的娱乐新闻时显示页面走丢了?前几天热搜上好像又说小红书又崩溃......
  • redis info 对应参数详解
    https://blog.csdn.net/qq_27342265/article/details/123094422   info命令的使用方法有以下三种:info:部分Redis系统状态统计信息。infoall:全部Redis系统状态统......
  • Mysql的事务原理
    一、持久性依靠的是redolog,重做日志,记录的是事务提交时数据也的物理修改,是用来实现事务的持久性。该日志文件由两部分组成,重做日志缓冲,(redologbuffer)和重做日志......
  • Redis-01 常用命令
    创建和获取key命令说明例子set创建一个名为key值为value键值对setviews10get获取名为key的值,存在返回值,不存在返回nilgetviewsmset一次......
  • Redis-02 Redis 类型
    RedisList命令说明例子LPush在List头插入一个或多个元素LPushmylisthelloRPush在List尾插入一个或多个元素RPushmylistworldLPop获取List......
  • Redis-03 Redis事务
    需要特别注意,Redis的命令是原子性的,而Redis的事务是非原子性的事务相关命令MULTI命令开启事务命令,Redis将操作命令逐个放到队列中,根据EXEC命令来原子化执行命令EXE......
  • Spring 事务源码(五):事务的传播特性
    1、事务传播特性Springs事务传播特性: 名称解释 REQUIRED支持当前事务,如果当前没有事务,就新建一个事务。Spring默认的事务传播特性支持外......
  • redisson连接错误 Unable to init enough connections amount Only 23 from 32 were i
    背景开发过程中遇到了这个问题,翻找了一些帖子,记录一些“可能”的解决方案。出现问题的原因可能各有不同--redis官方回复是网络问题可选择的解决方案:--将redis连接超......
  • 使用ansible-playbook自动化安装redis哨兵
    【使用自动化安装MySQL主从架构】说明:使用ansible-playbook 自动化安装redis哨兵+redis-exporter的采集数据【剧本说明】以下文件在roles目录下treeroles/redis_s......
  • redis部署手册_20221129
    1.软件版本及下载Keepalived:https://www.keepalived.org/download.htmlRedis下载地址:https://redis.io/download/本次安装版本:Redis:7.0.5Keepalived:2.2.72.主......