`
fantaxy025025
  • 浏览: 1311609 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Redis EXISTS DEL命令耗时过长问题排查

 
阅读更多

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. 查看代码

 

[cpp] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. void existsCommand(redisClient *c) {  
  2.     expireIfNeeded(c->db,c->argv[1]);  // 检查该key是否过期,如果过期就delete掉  
  3.     if (dbExists(c->db,c->argv[1])) {  
  4.         addReply(c, shared.cone);  
  5.     } else {  
  6.         addReply(c, shared.czero);  
  7.     }  
  8. }  

在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基本命令-封装redis常用基本命令.zip

    封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip封装redis常用基本命令.zip...

    redis-cli 命令总结

    Redis 命令总结 Redis 提供了丰富的命令对数据库和各种数据类型进行操作,这些命令可以在 Linux 终端使用。在编程时,比如使用 Redis 的 Java 语言包,这些命令都有对应的方法。下面将 Redis 提供的命令做一总结。 ...

    Redis命令参考手册完整版

    在本文中,我们详细介绍了 Redis 的 DEL、KEYS、RANDOMKEY、TTL 等命令的格式、可用版本、时间复杂度、返回值和示例代码。这些命令是 Redis 中最基本的操作单元,掌握这些命令是使用 Redis 的基础。

    redis命令大全

    ### Redis命令大全详解 #### 一、Keys命令 Redis提供了丰富的键管理命令,这些命令能够帮助用户有效地管理和操作键。 **1. DEL key** - **功能**: 删除已存在的键。 - **示例**: `DEL mykey` 如果键 `mykey` 孌在...

    redis 命令手册 命令实践

    在Redis命令手册中,你可以找到关于常用键命令的详细说明,如SET、GET、DEL等命令,它们用于操作和管理键值对数据。这些命令使用户能够设置键的值、获取键的值以及删除键及其对应的值。 此外,Redis命令手册还介绍...

    Redis命令参考手册完整版.txt

    ### Redis命令参考手册知识点概述 #### 一、DEL 命令详解 ...以上内容详细介绍了Redis中DEL、KEYS、RANDOMKEY和TTL四个命令的功能、使用方法以及示例代码。这些命令对于管理和查询Redis中的数据非常重要。

    redis-cli命令二进制包,linux环境独立可运行

    这是基于官方的redis5.0.9版本源码包在linux系统中编译出来的redis-cli,用户远程连接其他的redis,运行命令,处理大key和热hey等等,软件4.5M。 如果你自己通过安装redis来使用里面的redis-cli,首先55M的磁盘没了...

    redis获取命令字典的方法及全部的group命令.txt

    本地安装redis,通过安装目录下的redis客户端程序可以连接任意Redis服务(只要服务端是启动着的),命令 redis-cli -h ip -p port。如果服务端要求认证资格,可能还要输入用户名密码等参数。 Redis命令十分丰富,...

    java-redis的常用命令

    关于java-redis的常用命令使用以及配置信息设置的构造池创建

    Redis完整命令参考手册_redis命令大全_

    以下是Redis常用的一些命令及其详细解释: 1. **基本操作**: - `SET key value`:设置key对应的值为value。 - `GET key`:获取key的值。 - `DEL key [key ...]`:删除一个或多个key。 - `EXISTS key`:检查key...

    Redis 命令参考手册中文完整版chm

    - 限流:使用`LIMIT`命令可以限制操作速率,防止过快的操作导致服务压力过大。 - 分布式锁:利用`SETNX`和`EXPIRE`等命令可以实现简单的分布式锁机制。 以上只是Redis命令参考手册中的一部分内容,完整的CHM文档...

    redis的基本操作命令.docx

    Redis 基本操作命令详解 Redis 是一个基于键值对的 NoSQL 数据库,具有高性能、低延迟和高可扩展性的特点。Redis 提供了多种数据类型,如字符串、哈希、列表、集合、有序集合等,并支持事务、发布订阅、 Lua 脚本等...

    redis-cli命令

    用于在 redis 服务上执行操作的命令格式。文档列出了常用的命令。

    redis命令集合,redis命令详解

    redis命令集合,redis命令详解 适合全体类型的命令 EXISTS key 判断一个键是否存在;存在返回 1;否则返回0; DEL key 删除某个key,或是一系列key;DEL key1 key2 key3 key4 TYPE key 返回某个key元素的数据类型 ( none:...

    Redis性能问题排查解决手册.rar

    本手册将详细探讨Redis性能问题的排查与解决方法。 一、Redis性能瓶颈分析 1. 内存管理:Redis的数据全部存储在内存中,因此内存使用效率是关键。当内存不足时,Redis可能会启用LRU(最近最少使用)或LFU(最不...

    Redis 命令参考手册完整版

    在数据操作方面,Redis提供了丰富的命令集,这些命令在执行时可能会涉及不同的时间复杂度。命令参考手册是了解和使用Redis功能的关键途径,能够帮助开发者快速掌握Redis的使用方法。 1. DEL命令:DEL命令用于删除...

    redis常用命令集合.pdf

    - exists命令用于检查指定的键是否存在。 - del命令用于删除指定的键。 - expire命令设置键的过期时间。 - ttl命令查看键的剩余过期时间。 - move命令用于将键移动到其他数据库中。 - select命令切换当前操作...

    Redis命令参考手册完整版.pdf

    本文详细介绍了Redis中的四个常用命令:`DEL`、`KEYS`、`RANDOMKEY`以及`TTL`。这些命令分别用于键的删除、查找、随机获取以及查看键的剩余生存时间。每个命令均附带了示例代码,便于理解与实际应用。通过这些命令,...

    Redis命令参考手册

    对于键(Key)的操作,Redis提供了DEL、DUMP、EXISTS、EXPIRE、EXPIREAT、KEYS、MIGRATE、MOVE、OBJECT、PERSIST、PEXPIRE、PEXPIREAT、PTTL、RANDOMKEY、RENAME、RENAMENX、RESTORE、SORT、TTL、TYPE和SCAN等命令。...

    redis4.0中文命令参考手册+完整文档

    该文档是 Redis Command Reference 和 Redis Documentation 的完整中文翻译HTML离线版,包含了Redis4.0的所有命令、Redis 的事务、持久化、复制、Sentinel、集群等。新手最佳入门教程、老手必备参考手册!

Global site tag (gtag.js) - Google Analytics