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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
    目录
    相关文章
    |
    1月前
    |
    NoSQL Java Redis
    redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
    这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
    50 1
    redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
    |
    18天前
    |
    存储 NoSQL Java
    Redis命令:列表模糊删除详解
    通过本文的介绍,我们详细探讨了如何在Redis中实现列表的模糊删除。虽然Redis没有直接提供模糊删除命令,但可以通过组合使用 `LRANGE`和 `LREM`命令,并在客户端代码中进行模糊匹配,来实现这一功能。希望本文能帮助你在实际应用中更有效地操作Redis列表。
    32 0
    |
    1月前
    |
    缓存 NoSQL 测试技术
    Redis如何解决频繁的命令往返造成的性能瓶颈!
    Redis如何解决频繁的命令往返造成的性能瓶颈!
    |
    1月前
    |
    缓存 NoSQL Redis
    Redis命令:列表模糊删除详解
    Redis命令:列表模糊删除详解
    55 3
    |
    1月前
    |
    NoSQL 关系型数据库 MySQL
    Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
    本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
    254 0
    Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
    |
    1月前
    |
    NoSQL Redis 数据安全/隐私保护
    Redis 命令
    10月更文挑战第15天
    28 0
    |
    2月前
    |
    监控 NoSQL Redis
    redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
    redis-server --service-install redis.windows.conf --loglevel verbose 命令的作用是什么?
    114 3
    |
    2月前
    |
    存储 缓存 NoSQL
    Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
    Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
    71 0
    |
    3月前
    |
    SQL 缓存 NoSQL
    【Azure Redis 缓存】使用Azure Redis服务时候,如突然遇见异常,遇见命令Timeout performing SET xxxxxx等情况,如何第一时间查看是否有Failover存在呢?
    【Azure Redis 缓存】使用Azure Redis服务时候,如突然遇见异常,遇见命令Timeout performing SET xxxxxx等情况,如何第一时间查看是否有Failover存在呢?
    |
    3月前
    |
    缓存 监控 NoSQL
    【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤
    【Azure Redis 缓存】Azure Redis出现了超时问题后,记录一步一步的排查出异常的客户端连接和所执行命令的步骤
    下一篇
    无影云桌面