Redis敢于在线上进行常规匹配!你可以走了!

发布者:上海IT外包来源:http://www.lanmon.net点击数:854

在行业中,redis开发规范中有一个铁律,如下所示。
在线Redis禁止使用Keys常规匹配操作
但是,每个人都知道,但一直都忘记了,所以事故将继续发生。
让我们来谈谈在线执行常规匹配操作的原因,导致缓存雪崩并最终导致数据库崩溃。
分析原因
好吧,让我们先说两个废话。
1,redis是单线程的,它的所有操作都是原子的,不会因并发而产生数据异常
2,使用高成本的Redis命令非常危险,会占用单个线程的大量处理时间,导致所有请求都变慢。 (例如,生产环境中严格禁止时间复杂度为O(N)的KEYS命令)
上述两句话的原因很明显。
(1)操作和维护人员执行键*操作,这是耗时的,并且因为redis是单线程的,所以redis被锁定。
(2)此时,QPS相对较高,并且有数以万计的redis读写请求。因为redis被锁定,所有Hang都在那里。
(3)因为有太多的线程挂起,CPU正在飙升,导致服务器的redis关闭。
(4)所有线程都无法获取redis中的数据,并且一直到数据库获取数据,数据库将被关闭。
应该注意的是,相同的危险命令不仅具有键*,而且还具有以下组
Flushdb命令用于清除当前数据库中的所有键。
Flushall命令用于清除整个Redis服务器的数据(删除所有数据库的所有密钥)
CONFIG客户端连接后的可配置服务器
因此,一个合格的redis操作或开发,你应该知道如何禁用上面的命令。所以我一直认为新闻情况的原因一般是人员水平。
如何禁用这些命令?
在redis.conf中,在SECURITY部分中,我们添加以下命令:
重命名命令FLUSHALL''
重命名命令FLUSHDB''
重命名命令CONFIG''重命名命令KEYS''
另外,对于FLUSHALL命令,需要在配置文件中设置appendonly no,否则服务器将无法启动。
请注意,上述命令可能会丢失,您可以查看官方文档。除了与redis安全风险相关的Flushdb等命令外,如果发现时间复杂度为O(N)的命令,请小心谨慎,不要随意在生产中使用它。例如,hgetall,lrange,smembers,zrange,sinter等,它们不是不可用的,但这些命令的时间复杂度是O(N)。要使用这些命令,您需要知道N的值,否则将出现缓存停机时间。
改进建议
业界建议使用scan命令来改进密钥和SMEMBERS命令。
在redis2.8版本之后,有一个新的命令扫描,可用于批量扫描redis记录。这肯定会导致整个查询消耗的总时间变大,但不会影响Redis服务并影响服务使用。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部