在面试的时候,通常会被问到redis是如何实现分布式锁的。如果我们只知道是借助于setnx/setex ,而不了解setnx/setex底层如何实现,那基本上是无法过关的,尤其是大厂。那究竟redis是怎么实现事务的呢?

1、redis事务的用法

redis支持事务操作。它的实现依赖于multi 和exec 关键字。其中,multi表示事务开启,exec表示执行multi到exec之间的语句块。系统检测multi 语句后,会将其后的命令添加到命令队列中去,直到遇到exec时,才一并执行,不会被中断。具体使用如图所示:

1、redis 事务的过程

注意: 在multi开启的事务中,如果其它线程也修改了该key的值,那么,multi事务依旧会被执行,且multi中设定的该key的值会覆盖掉其它线程设定的值。如下图所示:

图2 其他线程修改事务中的key,不会对事务造成影响

在左图事务还没有提交的时候,右图的另一个事务修改的key的值,这个时候,修改后的值,会在事务的get key命令中体现出来。然后由于在左图的事务中又执行了set name操作,导致事务执行成功后此前设置的name值被修改。

2、watch关键字在redis事务的作用

要解决这个问题,就必须在事务开启前,添加watch关键字,对一个或多个待更新的key进行监视。一旦key的值被其他线程所修改,则事务将停止执行watch关键字的本质是一个乐观锁。如下图所示:

图3 watch事务中的多个key,其它线程修改其中的一个

在左图中,利用watch关键字监听了name 和 age这两个key, 接着用multi关键字开启事务。但是在执行exec之前,右图中所示线程修改了name的值。可以看到,exec事务执行的返回结果是nil. name的值为jacy

那如果只监听一个key呢?那事务是否可以正常执行?

答案是否!!

测试如下:

图4 事务中被监听的关键字被其它线程修改

从图中可以清楚看到,只要事务中被监听的key被其它线程修改,那整个事务都将不会被执行。原因是服务端在监听到key被修改的事件后,便执行了discard命令,它会丢弃掉该事务中的所有语句块和watch的关键字。

3、事务执行的过程中,有语句执行失败怎么办?

在redis事务语句块中,如果有部分语句执行失败,那也不影响其它的语句执行。如下图所示:

图5 事务中的语句执行失败,不会回滚

从中可以看出,事务中的第2条语句(尝试对一个字符串类型的value 执行加1操作时)失败,但是语句块中的其它语句都执行成功并生效了。

为什么事务中有语句执行失败不会回滚呢??

这是因为在作者看来,事务执行失败大多是程序的问题,而且这样的问题大多在开发和测试环境中就已经会暴露并解决了,生产上不可能出现这样的问题。而且,事务回滚与作者“简单方便高效”的设计初衷相违背。因此作者就不支持事务执行失败情况下的回滚。

redis中有key但是删不掉_一篇图文,搞定Redis事务相关推荐

  1. redis中有key但是删不掉_分布式锁用 Redis 还是 Zookeeper

    为什么用分布式锁? 在讨论这个问题之前,我们先来看一个业务场景:系统A是一个电商系统,目前是一台机器部署,系统中有一个用户下订单的接口,但是用户下订单之前一定要去检查一下库存,确保库存足够了才会给用户 ...

  2. redis中有key但是删不掉_Redis删除过期key的策略

    一.在Redis中,假如我们设置了100w个key,这些key设置了只能存活2个小时,那么在2个小时后,redis是如何来删除这些key的? 答案:定期删除 and 惰性删除. 那什么是定期删除?什么 ...

  3. redis中有key但是删不掉_Redis大 key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  4. redis中有key但是删不掉_Redis大key的发现与删除方法全解析

    个推作为国内第三方推送市场的早期进入者,专注于为开发者提供高效稳定的推送服务,经过9年的积累和发展,服务了包括新浪.滴滴在内的数十万APP.由于我们推送业务对并发量.速度要求很高,为此,我们选择了高性 ...

  5. 【干货知识】Redis:从应用到底层,一文帮你搞定

    1.基本类型及底层实现 1.1.String 用途: 适用于简单key-value存储.setnx key value实现分布式锁.计数器(原子性).分布式全局唯一ID. 底层:C语言中String用 ...

  6. 搞定 Redis 数据存储原理,别只会 set、get 了

    在上一篇通过源码编译构建出可调式环境之后,想必你想更深入了解我的整体架构.当你熟悉我的整体架构和每个模块,遇到问题才能直击本源,直捣黄龙,一笑破苍穹. 我的核心模块如图 1-10. 图1-10 图 1 ...

  7. 计算机里面的文件一直和桌面上重复,有些文件删不掉_电脑桌面上有一个文件图标老是删不掉,每次删,都......

    为什么桌面上有些文件删不掉 在电脑删除文件时为什么有些文件删不了? ①首先找到拒绝访问的文件夹,在其上鼠标右键,选择属性,之后切换到安全选项下,之后在底部可以看到有高级设置入后, ②首先点击底部的高级 ...

  8. 如何删除tmp计算机桌面,桌面上的文件删不掉_我桌面上突然多了一个tmp结尾的文件桌面删除都删除......

    桌面上的文件 删不掉怎么办 为什么桌面上有些文件删不掉 我电脑桌面上有个文件夹,删除不掉怎么办? 我的电脑桌面上文件夹删不掉 解决我的电脑桌面上文件夹删不掉的步骤如下: 1.首先在我们的电脑桌面上找到 ...

  9. websphere不释放游标_不懂别瞎搞!Redis 性能优化的 13 条军规!

    以下文章来源于Java中文社群 ,作者老王 Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了 ...

最新文章

  1. Android RelativeLayout属性
  2. 加速OA系统实施的四大要素
  3. 关于BitmapImage EndInit()时报值不在范围内的异常
  4. python工作招聘-python爬虫 智联招聘 工作地点
  5. Centos 7 技巧
  6. 肝货!普通人如何拿到 1 万年薪?看这篇文章就够了
  7. 动人配乐是如何炼成的?带您了解《花之灵》背景原声的幕后制作秘辛
  8. H.264解码器中CAVLC码表查找算法的分析与优化
  9. ios 请在设置中打开相机权限_在iOS中请求摄像头权限对话框启动(Prime权限)
  10. linux dialog详解(图形化shell)
  11. mysql(6)-mysql的视图功能和存储过程
  12. 最新用python来操作mysql完全解析
  13. 111. Minimum Depth of Binary Tree
  14. 机器学习笔记(参考吴恩达机器学习视频笔记)16_决策树
  15. 输入框中有内容才激活组件
  16. 3DMM及eos人脸重建
  17. 坚果云云盘告诉你如何保护自己的文件不被泄露?
  18. Java类和对象(未完待续,持续更新)
  19. 水木-如何解压.iso文件
  20. Oracle同义词的好处

热门文章

  1. # LeetCode集锦(四) - 第13题 Roman To Integer
  2. python:面向对象初级
  3. Android实现模块 api 化
  4. mybatis脱离项目逆向生成映射文件
  5. 黄聪:php精度计算问题
  6. 记一次数据库查询语句的优化
  7. Linux内核进程调度的时机和进程切换
  8. Direct2D (23) : 复合几何对象之 ID2D1GeometryGroup
  9. 手把手教你如何建立自己的Linux系统(二)
  10. Maven下载、安装和配置(转)