redis-避免生产环境使用keys命令
redis作为内存数据库, 有着很高的性能, Redis能读的速度是110000次/s, 写的速度是81000次/s;
除了进行持久化操作时, redis采用的是单线程架构, 所以如果我们在开发中不恰当的使用一些命命令, 就很有可能导致意料之外的结果, 比如如果redis中有千万级别的key, 而我们在程序中使用keys pattern命令来匹配相关的键, 那么大概率会导致redis的阻塞设置宕机;
测环境中模拟生产环境, 快速生成百万级别的key-value键值对
注意, 下面的命令仅用于测试, 不要再生产环境使用
127.0.0.1:6379> debug populate 2000000
OK
(1.29s)
127.0.0.1:6379> DBSIZE
(integer) 2000001
通过上面的命令, 在redis中生成了200万个key, 竟然是测试, 那么执行下keys *也无妨, 执行完后, 通过slowlog get 5来查看最近5条执行速度慢的命令, 因为redis是单线程的, 所以这命令会导致redis阻塞, 图中也可看出, KEYS *输入完并回车等了一段时间, 屏幕上才开始输出结果


使用scan命令代替KEYS
ps: scan命令需要保证redis的版本在2.8以上
SCAN 命令用于迭代当前数据库中的数据库键
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
个人觉得SCAN的COUNT参数的设置是比较重要的, 大了, 会导致单次命令执行时间太长; 小了, 会导致需要迭代的次数太多, 导致耗时太久;
下面先通过slowlog reset清空慢日志记录, 然后执行SCAN 0 MATCH 'key:2000*' COUNT 50000去匹配key, 然后再去查看慢执行日志
127.0.0.1:6379> SLOWLOG reset
OK
127.0.0.1:6379> SCAN 0 MATCH 'key:2000*' COUNT 50000
1) "1623648"
2) 1) "key:200004"
127.0.0.1:6379> SLOWLOG get 1
1) 1) (integer) 18
2) (integer) 1600503739
3) (integer) 35363
4) 1) "SCAN"
2) "0"
3) "MATCH"
4) "key:2000*"
5) "COUNT"
6) "50000"
5) "127.0.0.1:42434"
6) ""
可以看到, 设置了COUNT为50000时, slowlog记录了这条命令, 那么再把COUNT调小进行测试, 在我的电脑上的将COUNT参数设置为12500时, SCAN命令不会出现在slowlog中
C#使用StackExchange.Redis通过SCAN命令来模式匹配KEY
建立控制台项目
安装nuget包
StackExchange.Redis代码:
class Program
{
static void Main(string[] args)
{
var redis = ConnectionMultiplexer.Connect("localhost, password=123456789");
var db = redis.GetDatabase();
var server = redis.GetServer(redis.GetEndPoints(true).FirstOrDefault());var sw = new Stopwatch();
sw.Start();
var keys = server.Keys(pattern: "key:2000*", pageSize: 5000, database: db.Database);
sw.Stop();
Console.WriteLine($"time used: {sw.ElapsedMilliseconds}ms, matched keys: {keys.Count()}"); Console.ReadLine();
}
}
执行结果
time used: 1ms, matched keys: 111
注意下: var keys = server.Keys(pattern: "key:2000*", pageSize: 5000, database: db.Database); 这句, 这个方法的pageSize参数, 就对应了SCAN命令的COUNT参数, 我这边测试下来, 设置为5000时命令不会出现在slowlog的记录中
总结
redis中如果要通过模式匹配的方式来查询某个字符串, 有KEYS命令和SCAN命令, 这两个命令的时间复杂度都是O(N), 而redis又是单线程的设计, 使用不当会导致阻塞严重的话甚至宕机, 所以生产环境如果redis中key的数量在百万或千万级别(如果用户量很大的话, 这个量级应该很容易达到的), 要避免使用KEYS命令, 谨慎使用SCAN命令; 对于KEYS命令, 生产环境中, 它是比较危险的一个命令, 可以将它重命名, 使其无法轻易使用rename-command KEYS eIiGXix4A2DreBBsQwY6YHkidcDjoYA2DreBBsQ
参考
redis-避免生产环境使用keys命令的更多相关文章
- Redis线上环境做Keys匹配操作!你可以离职了!
转自:https://blog.csdn.net/bntx2jsqfehy7/article/details/84207884一.一个新闻 新闻内容如下:php工程师执行redis keys * 导致 ...
- Redis 千万不要乱用KEYS命令,不然会挨打的
Redis现如今使用的场景越来越多?如何批量删除key呢? 有人说用KEYS命令,刚开始学Redis的时候就是用这个命令列出库中键. KEYS命令要谨慎使用. 为何?客观别急,我们先一步步来看. KE ...
- redis的生产环境中的部署?
使用的是redis cluster 10台机器,5台机器部署了redis主实例,另外5台机器部署了redis 的从实例,每个主实例挂了一个从实例,5个节点对外提供读写服务,每个节点的读写高峰qps可能 ...
- 生产环境Linux常用命令【随时更新】
1. 查询文件中的关键字并高亮显示[查询当前目录关键字为elasticsearch的日志文件] find ./ -name "my-elasticsearch.log" | xar ...
- Redis 的 KEYS 命令不能乱用啊
KESY 命令 时间复杂度: O(N) , 假设Redis中的键名和给定的模式的长度有限的情况下,N为数据库中key的个数. Redis Keys 命令用于查找所有符合给定模式 pattern 的 k ...
- Redis的KEYS命令引起宕机事件
摘要: 使用 Redis 的开发者必看,吸取教训啊! 原文:Redis 的 KEYS 命令引起 RDS 数据库雪崩,RDS 发生两次宕机,造成几百万的资金损失 作者:陈浩翔 Fundebug经授权转载 ...
- 7. 单机版Redis的安装以及Redis生产环境启动方案
安装单机版redis redis的生产环境启动方案redis cli的使用 1. 安装单机版redis 大家可以自己去官网下载,当然也可以用课程提供的压缩包 wget http://downloads ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- MySQL 系列(四) 主从复制、读写分离、模拟宕机、备份恢复方案生产环境实战
本章内容: 主从复制 简介原理 备份主库及恢复从库,配置从库生效 读写分离 如果主宕机了,怎么办? 双主的情况 MySQL 备份及恢复方案 备份单个及多个数据库 mysqldump 的常用参数 如何增 ...
随机推荐
- 风炫安全WEB安全学习第十八节课 使用SQLMAP自动化注入(二)
风炫安全WEB安全学习第十八节课 使用SQLMAP自动化注入(二) –is-dba 当前用户权限(是否为root权限) –dbs 所有数据库 –current-db 网站当前数据库 –users 所有 ...
- 痞子衡嵌入式:MCUBootUtility v3.0发布,开始支持LPC, Kinetis啦
-- 痞子衡维护的NXP-MCUBootUtility工具距离上一个版本(v2.4.0)发布过去2个半月了,这一次痞子衡为大家带来了全新版本v3.0.0,从这个版本开始,NXP-MCUBootUtil ...
- .NET 云原生架构师训练营(模块二 基础巩固 RabbitMQ 工作队列和交换机)--学习笔记
2.6.4 RabbitMQ -- 工作队列和交换机 WorkQueue Publish/Subscribe Routing EmitLog WorkQueue WorkQueue:https://w ...
- Angular入门到精通系列教程(4)- 开发环境搭建以及入手项目
1. 本地开发环境搭建 1.1. node.js 1.2. Angular CLI 2. 开发工具 - Visual Studio Code 第一个Anuglar项目 创建第一个anuglar项目 A ...
- db_install.rsp dbca.rsp netca.rsp 详解【转】
db_install.rsp详解 #################################################################### ## Copyright(c ...
- SpringBoot同时接收单个对象和List<object>参数
最近做项目的有个需求,是把多个文件移动到另一个文件夹下,这需要把 新的文件夹id -- Long类型 多个文件的信息 -- List< Object > 类型 这两个参数传给后台,我的后台 ...
- 深入理解nodejs中的异步编程
目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...
- 【Linux】centos7中 root家目录中perl5文件夹无法删除问题解决
由于新项目上线,安装了一些perl的一些包 但是发现,在/root下有一个perl5/的文件夹,删除后,重新登录又会出现,很是烦人,而且他还没有内容,就是一个空文件 那么着手搞掉他 环境:centos ...
- markdown编写文件目录结构
1.先全局安装tree cnpm i tree-node-cli -g 然后输入: tree --help -L 是确定要几级目录,-I是排除哪个文件夹下的,然后我是要在README里面生成项目结构树 ...
- vue href url地址写法