redis执行失败后的处理
以前工作那会儿,总是在很纠结redis执行失败了怎么处理。最主要的是两个问题
- redis执行失败了怎么处理程序?
- redis事务中间有一条或者某几条数据执行失败了怎么处理?特别是redis事务,一直强调redis事务执行的时候不支持事务回滚,中间某一条命令执行失败后,后面的命令会继续执行,这导致我一直存在一个很大的疑惑,这不会导致数据偏差吗?比如一个事务三条语句,incr key三次,如果key初始值是1,incr key三次是得到的结果是4,如果有一次命令执行失败了,得到的结果就是3,这样存在的数据便宜,会导致问题都很难查找,就算找到了问题所在,要去实际生产环境种恢复数据都很麻烦,总不能先暂停生产环境,去恢复数据,然后再开系统吧。
今天认真思考了这两个问题,总结了一下redis的设计思路和执行失败后的处理,特别是第二种情况下的原因及处理。
对于问题1:
redis执行失败了怎么处理程序?
redis执行失败分两种情况,
- 网络问题,命令发送失败。
- redis本身故障导致访问不了。
- 命令或者数据不符合要求。
对于第一种情况和第二种情况,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
我们来看一看发生错误的情况:
- exec还没执行成功的时候发生错误。
- exec执行成功了,但是还是发生了错误。
我们来分析这两种情况发生的原因
首先是网络或者redis本身原因,导致redis没用收到exec命令。此时redis放弃整个事务,不执行。理由很简单,事务都没用结束,故障了,没有必要执行。
其次是exec执行成功了,但是由于语句语法错误导致执行失败,那就跳过这一条失败的语句,继续执行下一条语句。一直到事务执行完成。redis不提供失败回滚的原因,首先,不会由于网络原因等其他情况导致命令没有收到,一个完整的事务所有命令都收到了,那说明redis已经有明确指示,redis按照命令执行就好。如果由于语法错误导致命令失败,那就是程序员本身代码问题,不能因为程序员自身问题,来要求redis提供更多的操作。
由此redis的哲学我们就知道得很清晰了,redis保障收到事务(一组消息),至于命令正确与否,那是程序员要保证的问题,没有收到的消息或者收到一半就放弃不执行,redis保证执行速度。所有命令和数据的正确与否有程序员把握,redis本身只负责根据数据来刷新自己管理的内存。这种设计思路就像流水线,下面的工人是不负责检查上一道工序是否合格,他觉得做得了就做,做不了就扔了。
===================================================================
留个联系方式:cata28889@gmail.com
公众号:ghost20036
公众号二维码:
如果谁有软件方面的问题,技术或者工作上的问题,可以一起探讨。
redis执行失败后的处理相关推荐
- Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh
Oracle 11g RAC 第二节点root.sh执行失败后再次执行root.sh前,要先清除之前的crs配置信息 # /u01/app/11.2.0/grid/crs/install/rootcr ...
- GitLab Runner 当一个提交执行失败后,接下来的提交一直处于等待状态 (问题解决)
问题描述: GitLab Runner 当一个提交执行失败后,接下来的提交一直处于等待状态 (问题解决) 解决方法: 在注册Runner时候,如果有如下这一步,请选择:true # 这里选择 true ...
- C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败...
/// <summary> /// 执行数据库回滚操作,用于sql语句执行失败后,恢复执行前的数据 /// </summary> /// <param name=&quo ...
- java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样
1. 任务执行失败时的处理逻辑 1.1. Worker Worker相当于线程池中的线程 可以看到,Worker有几个重要的属性: thread : 这是Worker运行的线程,可以理解为一个Wo ...
- 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 后执行失败 ...
- pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)
19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume) 1 引入 2 pytest-assume安装 3 assert断言 4 pytest-assume断言 1 引 ...
- Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)
应用场景 之前我们已经通过<Spring Cloud Stream消费失败后的处理策略(一):自动重试>一文介绍了Spring Cloud Stream默认的消息重试功能.本文将介绍Rab ...
- Spring Cloud Stream消费失败后的处理策略(二):自定义错误处理逻辑
应用场景 上一篇<Spring Cloud Stream消费失败后的处理策略(一):自动重试>介绍了默认就会生效的消息重试功能.对于一些因环境原因.网络抖动等不稳定因素引发的问题可以起到 ...
- 存储过程没有执行完后没有释放锁_【大厂面试07期】说一说你对synchronized锁的理解?...
PS:本文已收录到1.3 K+ Star 数的开源项目-<大厂面试指北>,如果想要了解更多,可以看一看,项目地址如下: https://github.com/NotFound9/inter ...
最新文章
- Linux 引导和系统启动
- python使用matplotlib可视化、为可视化图像添加标题(title)、自定义标题的字体格式、字体大小、字体颜色等
- linux suse 安装redis,在openSuse linux上Redis安装简单步骤
- 自学it18大数据笔记-第三阶段Scala-day06——会持续更新……
- 2019你还没搭建个人博客吗?进来看看
- 学习linux系统到底有没捷径?
- mysql数据库open函数_C#访问Mysql数据库方法,以及库函数
- java中4种修饰符访问权限的区别
- 防盗系统Java_java小区防盗报警系统
- 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2021年10月份最新版)
- 电子书 UNIX环境高级编程(第3版).pdf
- 网站 下载 整个_如何下载整个网站?
- 365天深度学习训练营-第P5周:运动鞋识别
- 使用ffmpeg、nvdia解码rtsp视频流,cuda做NV12-RGBA转换
- esp32入门手册学习
- IDEA搭建单模块springboot-web项目、多模块springboot-web项目
- python3 urllib 内存泄露_【专家专栏】张昊 | 从urllib2的内存泄露看python的GC
- 十二步解N-S方程之第四步
- 60V输入电压LDO,MST56XXB
- socket 科普文章