公司新来一个 CTO:禁止使用 Redis 中的 keys 命令,发现即开除!
公司新来一个 CTO:禁止使用 Redis 中的 keys 命令,发现即开除!
keys命令的用法:
keys pattern
查找符合正则匹配的key的列表。扫描对象是Redis服务中所有的key,想想都很慢对不对?
同时执行keys命令的同时,Redis进程将被阻塞,无法执行其他命令,假如超过了哨兵的down-after-milliseconds
配置,还会进行主从切换,切换过程中,如果主节点恢复正常,还可能出现脑裂等一系列问题。
所以,生产环境中,建议直接禁用keys命令。
Keys命令的替代方案
- scan扫描,避免阻塞
- 将需要统计的数据放入一个set中 (但是这样可能出现Big Key问题,一般数据量大就不推荐)
Keys命令在Redis Cluster中是怎样执行的?
一般来说,keys命令对于集群节点来说,是不知道路由到哪个节点的,不像 get命令。在Java的Jedis客户端的JedisClusterKeyCommands
类中,我们看到:
public Set<byte[]> keys(byte[] pattern) {
// 在每个节点执行keys命令
Collection<Set<byte[]>> keysPerNode = connection.getClusterCommandExecutor()
.executeCommandOnAllNodes((JedisClusterCommandCallback<Set<byte[]>>) client -> client.keys(pattern))
.resultsAsList();
// 合并成一个整体后返回
Set<byte[]> keys = new HashSet<>();
for (Set<byte[]> keySet : keysPerNode) {
keys.addAll(keySet);
}
return keys;
}
我们看到,Jedis是通过在每个节点上执行keys命令,并将结果合并返回的。
本文既然将keys命令的慢,那么他到底有多慢呢?另外,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。
Keys命令到底有多慢?
这是腾讯云上Redis集群服务中,慢查询的日志。我们看到,Keys命令大概执行了250ms ~ 300ms。
根据节点信息,我们看到,每个节点存储了大约153w的key,占用内存300M+,平均每个键值对占用内存0.208KB,合213个字节。
根据我的理解,既然keys命令返回的是key值,而集群中其实有一个结构slots_to_keys
记录着所有key 的, 这只与key的数量有关,与Big key
的关系不大。
按照这种猜想,假如此时Redis节点占用内存为3G,且Key数量成比例,那么Keys命令执行时间因为3s左右,这段时间Redis节点是阻塞的。
原文链接:https://blog.csdn.net/weixin_37968613/article/details/119065777
版权声明:本文为CSDN博主「c&0xff00」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
相关文章
- 【Redis 系列】redis 学习十一,redis 的哨兵模式详解和实战
- 实现安全:Redis 集群加密(redis集群加密)
- 命令基于CLI的Redis命令行操作(执行redis)
- Redis访问命令:掌握终极指令,加快技术掌握度(redis访问命令)
- Tips for Executing Redis Shutdown Command(redis关闭连接命令)
- 使用Redis时,非root用户的权限设置有哪些注意事项?(redis非root)
- 掌握Redis的订阅命令,提高数据传输效率!(redis订阅命令)
- 从Redis中取出数据的方法(怎么从redis取出数据)
- 电脑上的Redis安装一步步操作(电脑redis安装)
- 用命令重新启动Redis一招救命(用命令重新启动redis)
- 探讨Redis在做些什么(查看redis在做什么)
- 王蕊使用 Redis 助力信息处理(王蕊redis)
- 开源让Redis实现最大效能(源码连接redis)
- 断开Redis主从连接的指令探究(断开redis主从命令)
- TP5框架下优雅使用Redis实现订单缓存(TP5下单使用redis)
- 基于切片的Redis服务安全登录方式研究(切片redis登录方式)
- 如何正确关闭本地Redis服务(关闭本地redis命令)
- 红色宝石理解Redis节点(什么是redis节点)
- 探索企业领先者谁在使用Redis(哪些公司在使用redis)
- 一键命令,快速清理Redis缓存(命令清除redis缓存)
- 启动Redis集群用CLI命令实现一键式部署(启动redis集群的命令)
- 重新激活服务器,启动Redis服务(后端启动redis命令)
- 实现Redis多连接数据合并(合并redis多个连接)
- Redis集群运行状况如何(redis 集群是否正常)
- Redis限制调整命令搭配实现某目标(redis限制命令)
- 红色力量运行连续Redis命令(redis 连续命令)
- 使用Redis连接协议提高数据性能(redis 连接协议)
- 利用Redis远程链接掌握关键命令(redis 远程链接命令)
- Redis玩转命令行火速掌握运行技能(redis 运行命令大全)
- Redis实现计时功能的好助手(redis 计时命令)