Redis EXISTS DEL命令耗时过长问题排查
问题发现:
44) 1) (integer) 993502
2) (integer) 1482239898
3) (integer) 114521
4) 1) "EXISTS"
2) "data_**Facade_load**k**Stack_sale_day_null_null_null_null"
33) 1) (integer) 993513
2) (integer) 1482253748
3) (integer) 133532
4) 1) "DEL"
2) "comment_loadCommentsBy**Id_459902_11"
参考:Redis EXISTS命令耗时过长case排查http://blog.csdn.net/chosen0ne/article/details/50543335
一、背景
redis慢日志分析平台上线后,随便看了一下,发现onestore使用的缓存集群,存在大量的EXISTS命令慢查询的情况:
平均每个EXISTS命令需要13ms,最大耗时近20ms。这个结果很不科学啊,EXISTS命令只是执行一次hash查找操作,应该是us级别。
和相关同学了解业务背景如下:
- 业务是userfeed,存放用户发表的动态
- 使用zset存储一个用户发表的所有动态,key是用户id,集合中对应的是feedid。如果用户发表的动态很多,zset也很大
- redis集群作为onestore的缓存,过期时间是10分钟
- 在访问cache前会调用EXISTS查看是否命中,如果不命中就用onestore回填cache
由于一些用户发表的动态很多(2W+),所以存在很多的ZADD慢查询。
二、排查
1. redis的清除过期key的策略
- 被动方式:在事件循环中,每秒执行约10次,尽力删除过期的key,会有漏掉的情况
- 从expire set中随机检查20个key
- 删除到过期的key
- 如果超过25%的key都是过期了,就重复第一步(超过25%说明过期的key占比很多)
- 主动方式:
- 如果该key在被动方式中漏过,在其再次被访问时检查并清除
2. 查看代码
- void existsCommand(redisClient *c) {
- expireIfNeeded(c->db,c->argv[1]); // 检查该key是否过期,如果过期就delete掉
- if (dbExists(c->db,c->argv[1])) {
- addReply(c, shared.cone);
- } else {
- addReply(c, shared.czero);
- }
- }
在EXISTS命令处理函数中实现了清除过期key的主动策略,会先调用expireIfNeeded函数检查要访问的key是否过期,如果过期就delete掉这个key。del命令在删除元素很多的复合数据类型(list、hash、zset、set)时是一个很耗时的操作。由于存在元素很多的zset,和ZADD一样,在删除zset时需要一个一个遍历所有元素,时间复杂度是大O(n)。由于这个删除操作在EXISTS命令的处理函数中执行,所以导致EXISTS耗时过长。
3. redis慢日志验证
通过慢日志可以验证上述结论
- EXISTS先检查‘user:94479529:feed’是否存在,该key已经过期,触发主动过期机制,将该key删除
- 从onestore获取该key的数据,然后通过ZADD回填
三、风险
该集群单个实例qps达到8k+,同时每天有10W+的慢查询。在redis存在大量慢查询时,会存在个别客户端超时的情况,导致请求失败。
四、后续处理
1. 增加过期时间,由10分钟到20分钟
2. 对redis集群扩容(试增加过期时间的效果而定)
对于redis删除大key耗时的问题,redis作者提供了解决方案,具体就是使用异步线程对大key进行删除操作,避免阻塞主线程。(中文翻译:如何优雅地删除Redis大键)
如何优雅地删除Redis大键
from:http://blog.csdn.net/wsliangjian/article/details/52329320
-
-
-
=
=
=
相关推荐
封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip...
Redis 命令总结 Redis 提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以在 Linux 终端使用。在编程时,比如使用 Redis 的 Java 语言包,这些命令都有对应的方法。下面将 Redis 提供的命令做一总结。 ...
在本文中,我们详细介绍了 Redis 的 DEL、KEYS、RANDOMKEY、TTL 等命令的格式、可用版本、时间复杂度、返回值和示例代码。这些命令是 Redis 中最基本的操作单元,掌握这些命令是使用 Redis 的基础。
### Redis命令大全详解 #### 一、Keys命令 Redis提供了丰富的键管理命令,这些命令能够帮助用户有效地管理和操作键。 **1. DEL key** - **功能**: 删除已存在的键。 - **示例**: `DEL mykey` 如果键 `mykey` 孌在...
在Redis命令手册中,你可以找到关于常用键命令的详细说明,如SET、GET、DEL等命令,它们用于操作和管理键值对数据。这些命令使用户能够设置键的值、获取键的值以及删除键及其对应的值。 此外,Redis命令手册还介绍...
### Redis命令参考手册知识点概述 #### 一、DEL 命令详解 ...以上内容详细介绍了Redis中DEL、KEYS、RANDOMKEY和TTL四个命令的功能、使用方法以及示例代码。这些命令对于管理和查询Redis中的数据非常重要。
这是基于官方的redis5.0.9版本源码包在linux系统中编译出来的redis-cli,用户远程连接其他的redis,运行命令,处理大key和热hey等等,软件4.5M。 如果你自己通过安装redis来使用里面的redis-cli,首先55M的磁盘没了...
本地安装redis,通过安装目录下的redis客户端程序可以连接任意Redis服务(只要服务端是启动着的),命令 redis-cli -h ip -p port。如果服务端要求认证资格,可能还要输入用户名密码等参数。 Redis命令十分丰富,...
关于java-redis的常用命令使用以及配置信息设置的构造池创建
以下是Redis常用的一些命令及其详细解释: 1. **基本操作**: - `SET key value`:设置key对应的值为value。 - `GET key`:获取key的值。 - `DEL key [key ...]`:删除一个或多个key。 - `EXISTS key`:检查key...
- 限流:使用`LIMIT`命令可以限制操作速率,防止过快的操作导致服务压力过大。 - 分布式锁:利用`SETNX`和`EXPIRE`等命令可以实现简单的分布式锁机制。 以上只是Redis命令参考手册中的一部分内容,完整的CHM文档...
Redis 基本操作命令详解 Redis 是一个基于键值对的 NoSQL 数据库,具有高性能、低延迟和高可扩展性的特点。Redis 提供了多种数据类型,如字符串、哈希、列表、集合、有序集合等,并支持事务、发布订阅、 Lua 脚本等...
用于在 redis 服务上执行操作的命令格式。文档列出了常用的命令。
redis命令集合,redis命令详解 适合全体类型的命令 EXISTS key 判断一个键是否存在;存在返回 1;否则返回0; DEL key 删除某个key,或是一系列key;DEL key1 key2 key3 key4 TYPE key 返回某个key元素的数据类型 ( none:...
本手册将详细探讨Redis性能问题的排查与解决方法。 一、Redis性能瓶颈分析 1. 内存管理:Redis的数据全部存储在内存中,因此内存使用效率是关键。当内存不足时,Redis可能会启用LRU(最近最少使用)或LFU(最不...
在数据操作方面,Redis提供了丰富的命令集,这些命令在执行时可能会涉及不同的时间复杂度。命令参考手册是了解和使用Redis功能的关键途径,能够帮助开发者快速掌握Redis的使用方法。 1. DEL命令:DEL命令用于删除...
- exists命令用于检查指定的键是否存在。 - del命令用于删除指定的键。 - expire命令设置键的过期时间。 - ttl命令查看键的剩余过期时间。 - move命令用于将键移动到其他数据库中。 - select命令切换当前操作...
本文详细介绍了Redis中的四个常用命令:`DEL`、`KEYS`、`RANDOMKEY`以及`TTL`。这些命令分别用于键的删除、查找、随机获取以及查看键的剩余生存时间。每个命令均附带了示例代码,便于理解与实际应用。通过这些命令,...
对于键(Key)的操作,Redis提供了DEL、DUMP、EXISTS、EXPIRE、EXPIREAT、KEYS、MIGRATE、MOVE、OBJECT、PERSIST、PEXPIRE、PEXPIREAT、PTTL、RANDOMKEY、RENAME、RENAMENX、RESTORE、SORT、TTL、TYPE和SCAN等命令。...
该文档是 Redis Command Reference 和 Redis Documentation 的完整中文翻译HTML离线版,包含了Redis4.0的所有命令、Redis 的事务、持久化、复制、Sentinel、集群等。新手最佳入门教程、老手必备参考手册!