Redis keys命令,生产环境慎用,最好屏蔽掉

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis keys命令,生产环境慎用,最好屏蔽掉

 1. 先看下官方对keys这个命令的说明:

返回所有匹配的key.

keys的时间复杂度是O(N),N为执行该命令下的数据库的key的数量,常数。

redis扫描key的速度很快,在入门笔记本大约是40毫秒100w个。

警告⚠️:keys用在生产环境只能以极低频率执行。 在大数据库执行时会出现灾难性的性能。如果需要查询某些key,考虑使用SCAN或者sets。

2. keys命令为什么会这么慢呢?

换个问法,为什么redis需要遍历所有的key才能找到我们需要的key呢?

(1) Redis是NoSQL型数据库,以hash数据结构存储的,所以才能实现高效的数据查询。而hash结构对于精确查找是非常快的,对于模糊查询,则无能为力

(2) Redis的命令执行是单线程的,同一时间只能执行单个命令。单一长时间命令会堵塞后续。(可以通过debug sleep 0.1100ms 模拟执行长时间命令)

以上两点造成了KEYS进行key查询需要遍历当前db的所有数据,以及当该命令执行完成的时候后续命令都会被堵塞。

因此在redis中执行的命令,尽量避免长时间堵塞命令。

3. 建议使用Scan代替 keys

使用方法参考:Redis 用scan模糊匹配key,避免阻塞_梦~'-CSDN博客

用SCAN cursor [MATCH pattern] [COUNT count]命令以迭代的方式进行key遍历(限制单次查询的key数量)。

这个 count 不是限定返回结果的数量,而是限定服务器单次遍历的字典槽位数量(约等于)。

缺点:

1.同一个元素可能会被返回多次。 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上。

2.如果一个元素是在迭代过程中被添加到数据集的, 又或者是在迭代过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会,redis scan对返回结果集只提供有限的保证

3.元素如果在迭代过程中被删除了,可能不会被返回。

4.将想要禁止的命令,按以下格式加入配置文件中:

建议直接在配置文件中用redis的rename屏蔽掉这些高危命令:

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command KEYS ""
image.gif

5. SCAN和KEYS的区别:

KEYS 命令被用于处理一个大的数据库时, 又或者 SMEMBERS 命令被用于处理一个大的集合键时, 它们会锁定redis库, 可能会阻塞服务器达数秒之久。在高并发下会导致请求大量堆积进而导致服务雪崩。有些公司在生产环境直接禁用kyes *命令。但是在redis服务器key的数量不大的情况下,使用keys也是没啥问题的

SCAN 命令及其相关的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用于增量地迭代 ,它们每次执行都只会返回少量元素,不会阻塞服务器, 所以这些命令可以用于生产环境, 而不会出现像 KEYS 命令、 SMEMBERS 命令带来的问题。

SCAN一样有它自己的问题:

    • 因为是分段获取key,所以它会多次请求redis服务器,这样势必取同样的key,scan耗时更长。
    • 在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证。

    SCAN cursor [MATCH pattern] [COUNT count]

    整合以下大佬文章:

    redis 在生产环境下执行keys的危害

    Redis生产环境你还敢用keys?我劝你放下屠刀,回头是岸!

    生产环境中禁止Redis执行Keys命令

    相关实践学习
    基于Redis实现在线游戏积分排行榜
    本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
    云数据库 Redis 版使用教程
    云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
    目录
    相关文章
    |
    14天前
    |
    NoSQL Redis 数据库
    Redis的全局命令及相关误区
    Redis的全局命令及相关误区
    22 0
    |
    23天前
    |
    NoSQL Redis 数据库
    Redis中的常用命令有哪些?
    Redis常用命令包括:PING测试连接,ECHO回显,SELECT切换数据库,QUIT关闭连接;KEYS查找key,EXISTS检查存在,DEL删除key,EXPIRE设置过期时间,TTL查看剩余生存时间,TYPE检测数据类型;STRING操作如SET/GET/MSET/MGET,INCR/DECR增减计数;HASH命令如HSET/HGET/HMSET/HMGET/HGETALL管理字段;LIST操作如LPUSH/RPUSH/LPOP/RPOP/LRANGE;
    10 0
    |
    28天前
    |
    NoSQL Redis
    Redis集群(六):集群常用命令及说明
    Redis集群(六):集群常用命令及说明
    176 0
    |
    2月前
    |
    缓存 NoSQL 数据处理
    Redis事务悄然而至:命令的背后故事
    Redis事务悄然而至:命令的背后故事
    26 0
    |
    1月前
    |
    缓存 NoSQL Java
    【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
    【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
    60 0
    |
    6天前
    |
    存储 NoSQL Java
    Redis 命令
    Redis 命令
    141 0
    |
    17天前
    |
    NoSQL Redis 数据库
    通过migrate命令实现两个redis实例之间的数据迁移
    通过migrate命令实现两个redis实例之间的数据迁移
    |
    1月前
    |
    NoSQL Redis 索引
    [Redis]——Redis命令手册set、list、sortedset
    [Redis]——Redis命令手册set、list、sortedset
    |
    2月前
    |
    存储 消息中间件 NoSQL
    Redis相关命令详解及其原理
    Redis相关命令详解及其原理
    60 0
    |
    2月前
    |
    NoSQL Redis
    redis五大数据类型及其常用命令(详细)
    redis五大数据类型及其常用命令(详细)
    21 0

    热门文章

    最新文章