以前工作那会儿,总是在很纠结redis执行失败了怎么处理。最主要的是两个问题

  1. redis执行失败了怎么处理程序?
  2. redis事务中间有一条或者某几条数据执行失败了怎么处理?特别是redis事务,一直强调redis事务执行的时候不支持事务回滚,中间某一条命令执行失败后,后面的命令会继续执行,这导致我一直存在一个很大的疑惑,这不会导致数据偏差吗?比如一个事务三条语句,incr key三次,如果key初始值是1,incr key三次是得到的结果是4,如果有一次命令执行失败了,得到的结果就是3,这样存在的数据便宜,会导致问题都很难查找,就算找到了问题所在,要去实际生产环境种恢复数据都很麻烦,总不能先暂停生产环境,去恢复数据,然后再开系统吧。

今天认真思考了这两个问题,总结了一下redis的设计思路和执行失败后的处理,特别是第二种情况下的原因及处理。


对于问题1:

redis执行失败了怎么处理程序?

redis执行失败分两种情况,

  1. 网络问题,命令发送失败。
  2. redis本身故障导致访问不了。
  3. 命令或者数据不符合要求。

对于第一种情况和第二种情况,redis的连接一旦失败,系统不提供自动重连功能,这样的好处就是这一条连接故障,命令失败,不会导致突然又能连接上执行后面的命令,重连过程需要程序和运维来保障,不会引起数据错误。

对于第三种情况,命令或者数据不符合要求导致失败,redis的思维是把此问题抛给程序员,要在程序编写简单认真检查测试。


对于问题2:

redis事务中间有一条或者某几条数据执行失败了怎么处理?特别是redis事务,一直强调redis事务执行的时候不支持事务回滚,中间某一条命令执行失败后,后面的命令会继续执行,这导致我一直存在一个很大的疑惑,这不会导致数据偏差吗?比如一个事务三条语句,incr key三次,如果key初始值是1,incr key三次是得到的结果是4,如果有一次命令执行失败了,得到的结果就是3,这样存在的数据便宜,会导致问题都很难查找,就算找到了问题所在,要去实际生产环境种恢复数据都很麻烦,总不能先暂停生产环境,去恢复数据,然后再开系统吧。

首先我们来看redis的事务执行:

multi命令开始,exec命令结尾,这就是一个redis的完整事务。我们把问题种的事务写成语句

set key 1
multi
incr key
incr key
incr key
exec

我们来看一看发生错误的情况:

  1. exec还没执行成功的时候发生错误。
  2. exec执行成功了,但是还是发生了错误。

我们来分析这两种情况发生的原因

首先是网络或者redis本身原因,导致redis没用收到exec命令。此时redis放弃整个事务,不执行。理由很简单,事务都没用结束,故障了,没有必要执行。

其次是exec执行成功了,但是由于语句语法错误导致执行失败,那就跳过这一条失败的语句,继续执行下一条语句。一直到事务执行完成。redis不提供失败回滚的原因,首先,不会由于网络原因等其他情况导致命令没有收到,一个完整的事务所有命令都收到了,那说明redis已经有明确指示,redis按照命令执行就好。如果由于语法错误导致命令失败,那就是程序员本身代码问题,不能因为程序员自身问题,来要求redis提供更多的操作。

由此redis的哲学我们就知道得很清晰了,redis保障收到事务(一组消息),至于命令正确与否,那是程序员要保证的问题,没有收到的消息或者收到一半就放弃不执行,redis保证执行速度。所有命令和数据的正确与否有程序员把握,redis本身只负责根据数据来刷新自己管理的内存。这种设计思路就像流水线,下面的工人是不负责检查上一道工序是否合格,他觉得做得了就做,做不了就扔了。

===================================================================

留个联系方式:cata28889@gmail.com

公众号:ghost20036

公众号二维码:

如果谁有软件方面的问题,技术或者工作上的问题,可以一起探讨。

redis执行失败后的处理相关推荐

  1. Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh

    Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh前,要先清除之前的crs配置信息 # /u01/app/11.2.0/grid/crs/install/rootcr ...

  2. GitLab Runner 当一个提交执行失败后,接下来的提交一直处于等待状态 (问题解决)

    问题描述: GitLab Runner 当一个提交执行失败后,接下来的提交一直处于等待状态 (问题解决) 解决方法: 在注册Runner时候,如果有如下这一步,请选择:true # 这里选择 true ...

  3. C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败...

    /// <summary> /// 执行数据库回滚操作,用于sql语句执行失败后,恢复执行前的数据 /// </summary> /// <param name=&quo ...

  4. java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样

    1.  任务执行失败时的处理逻辑 1.1.  Worker Worker相当于线程池中的线程 可以看到,Worker有几个重要的属性: thread : 这是Worker运行的线程,可以理解为一个Wo ...

  5. Pyinstaller 打包 torch 后执行失败 OSError: could not get source code

    1. 问题现象 系统环境 Python 3.6.9 torch 1.2.0 torchvision 0.4.0 Pyinstaller 4.5.1 Pyinstaller 打包 torch 后执行失败 ...

  6. pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

    19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume) 1 引入 2 pytest-assume安装 3 assert断言 4 pytest-assume断言 1 引 ...

  7. Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

    应用场景 之前我们已经通过<Spring Cloud Stream消费失败后的处理策略(一):自动重试>一文介绍了Spring Cloud Stream默认的消息重试功能.本文将介绍Rab ...

  8. Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑

    应用场景  上一篇<Spring Cloud Stream消费失败后的处理策略(一):自动重试>介绍了默认就会生效的消息重试功能.对于一些因环境原因.网络抖动等不稳定因素引发的问题可以起到 ...

  9. 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...

    PS:本文已收录到1.3 K+ Star 数的开源项目-<大厂面试指北>,如果想要了解更多,可以看一看,项目地址如下: https://github.com/NotFound9/inter ...

最新文章

  1. Linux 引导和系统启动
  2. python使用matplotlib可视化、为可视化图像添加标题(title)、自定义标题的字体格式、字体大小、字体颜色等
  3. linux suse 安装redis,在openSuse linux上Redis安装简单步骤
  4. 自学it18大数据笔记-第三阶段Scala-day06——会持续更新……
  5. 2019你还没搭建个人博客吗?进来看看
  6. 学习linux系统到底有没捷径?
  7. mysql数据库open函数_C#访问Mysql数据库方法,以及库函数
  8. java中4种修饰符访问权限的区别
  9. 防盗系统Java_java小区防盗报警系统
  10. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年10月份最新版)
  11. 电子书 UNIX环境高级编程(第3版).pdf
  12. 网站 下载 整个_如何下载整个网站?
  13. 365天深度学习训练营-第P5周:运动鞋识别
  14. 使用ffmpeg、nvdia解码rtsp视频流,cuda做NV12-RGBA转换
  15. esp32入门手册学习
  16. IDEA搭建单模块springboot-web项目、多模块springboot-web项目
  17. python3 urllib 内存泄露_【专家专栏】张昊 | 从urllib2的内存泄露看python的GC
  18. 十二步解N-S方程之第四步
  19. 60V输入电压LDO,MST56XXB
  20. socket 科普文章

热门文章

  1. 人人美剧迅雷链接多线程和多进程爬虫分析
  2. 三角形计算c语言代码,C语言计算三角形面积代码
  3. 浅谈蚂蚁聚宝Android秒级编译
  4. cannot lock ref问题的解决
  5. 这家自动驾驶公司在招聘感知实习研究员!
  6. 思科下一代数据中心Nexus7000优势
  7. 通过C#Microsoft.Office.Interop.Word理解互操作性
  8. 何时“大庇天下寒士俱欢颜”(附笑话)
  9. 自学Python兼职赚钱靠谱吗?
  10. 从浪潮之巅到千里之行,区块链能否实现赢家通吃?