以前工作那会儿,总是在很纠结redis执行失败了怎么处理。最主要的是两个问题
- redis执行失败了怎么处理程序?
- redis事务中间有一条或者某几条数据执行失败了怎么处理?特别是redis事务,一直强调redis事务执行的时候不支持事务回滚,中间某一条命令执行失败后,后面的命令会继续执行,这导致我一直存在一个很大的疑惑,这不会导致数据偏差吗?比如一个事务三条语句,incr key三次,如果key初始值是1,incr key三次是得到的结果是4,如果有一次命令执行失败了,得到的结果就是3,这样存在的数据便宜,会导致问题都很难查找,就算找到了问题所在,要去实际生产环境种恢复数据都很麻烦,总不能先暂停生产环境,去恢复数据,然后再开系统吧。
今天认真思考了这两个问题,总结了一下redis的设计思路和执行失败后的处理,特别是第二种情况下的原因及处理。
对于问题1:
redis执行失败了怎么处理程序?
redis执行失败分两种情况,
- 网络问题,命令发送失败。
- redis本身故障导致访问不了。
- 命令或者数据不符合要求。
对于第一种情况和第二种情况,redis的连接一旦失败,系统不提供自动重连功能,这样的好处就是这一条连接故障,命令失败,不会导致突然又能连接上执行后面的命令,重连过程需要程序和运维来保障,不会引起数据错误。
对于第三种情况,命令或者数据不符合要求导致失败,redis的思维是把此问题抛给程序员,要在程序编写简单认真检查测试