[转帖]redis中的bigkey问题

redis,bigkey,问题 · 浏览次数 : 0

小编点评

**什么是 bigkey?** bigkey 是 Redis 中一个问题,当存储在 Redis 中的大值数据量过大时,会造成阻塞。 **常见的 bigkey 类型:** * String * Hash * List * Set * Sorted Set **问题的原因:** * 由于 Redis 单线程,操作 bigkey 通常比较耗时,容易阻塞服务。 * 大值数据的获取流程较大,对于千兆网卡的服务器来说,可以导致网络拥塞。 * 由于 Redis 的内存空间不均匀,访问大值数据可能会导致性能下降。 **解决方案:** *合理优化数据结构,拆、压缩等。 *选择其他存储方案,例如 MongoDB。 *删除大key使用 UNLINK 命令,异步删除。 *在业务低峰期使用 scan 命令查找大key,使用脚本逐一删除元素。

正文

https://cdn.modb.pro/db/459810

 

什么是bigkey

bigkey就是redis key/value体系中的大value问题。我们知道redis的底层数据存储结构中,有多种数据结构的实现。

String: 简单动态字符串

List: 双向链表、压缩列表 

Hash: 哈希表、压缩列表 

Sorted Set: 跳表、压缩列表 

Set: 整数列表

一般来说,bigkey在value是字符串类型时,表现为字符串的长度过长;value为复合类型(hash、list、set、zset)时,表现为包含的元素个数过多,或者成员总大小过大。

bigkey的危害

  1. 超时阻塞。由于redis单线程的特性,操作bigkey通常比较耗时,也就意味着阻塞redis的可能性很大,这样会造成客户端阻塞,造成慢查。

  2. 网络拥塞。bigkey意味着每次获取数据产生的网络流程较大。假设一个bigkey为1MB,客户端每秒访问1000,那么每秒产生1000MB的流量,对于千兆网卡(128MB/s)的服务器来说,可以说是灾难了。

  3. 内存空间不均匀。在集群模式下,由于bigkey的存在,会造成主机节点的内存不均匀,这样不利于集群对于内存的统一管理。

  4. 阻塞删除。删除一个大key造成主库较长时间的阻塞。

bigkey产生的原因

主要原因:程序设计地不合理。

常见的几种业务场景

社交类:粉丝列表,如果某些明星或者大V不精心设计的情况下,就是bigkey。

统计类:例如按天存储某项功能或者网站的用户集合,除非没几个人用,否则也会是bigkey。

缓存类:将数据从数据库load出来序列化放在redis里,这个方式经常用,但是有两个地方需要注意:第一,是不是要把所有字段都缓存;第二,有没有关联的数据。

怎么应对:在程序设计中,我们要对数据量的增长和边界有一个基本性的评估,做好技术选型和技术架构。

bigkey的发现和监控

痛点:监控程序带来redis性能损耗。

redis内置命令

debug object:阻塞其他请求

 MEMORY USAGE:时间复杂度O(N) 

获取key长度命令:STRLEN、HLEN、SCARD、ZCARD、LLEN、XLEN

MEMORY USAGE

给出一个key和它在RAM中占用的字节数,是一种内存维度的抽样算法, 计算key大小是通过抽样部分field来估算总大小。

时间复杂度O(N),N是抽样的个数。

返回的结果是key的值以及为管理该key分配的内存总字节数。

127.0.0.1:6379> MEMORY usage runoobkey samples 5
(integer) 160

memory usage默认抽样5个field来循环累加计算整个key的内存大小,样本的数量决定了key的内存大小的准确性和计算成本,样本越大,循环次数越多,计算结果更精确,性能消耗也越多。

redis-cli客户端

redis-cli --bigkeys

Redis提供了bigkeys参数能够使redis-cli以遍历的方式分析整个Redis实例中的所有Key并汇总以报告的方式返回结果。

优点:在线扫描,不阻塞服务。缺点:分析结果不可定制化。只能计算每种数据结构的top1。

bigkeys仅能分别输出Redis六种数据结构中的最大Key,如果你想只分析STRING类型或是找出全部成员数量超过10的HASH Key,那么bigkeys在此类需求场景下将无能为力。

开源工具

RDB文件扫描

redis-rdb-tools

https://github.com/sripathikrishnan/redis-rdb-tools?spm=a2c6h.12873639.article-detail.7.6e225a65k3bqC8

使用redis-rdb-tools工具以定制化方式找出大Key。

redis-rdb-tools 是一个 python 的解析 rdb 文件的工具,在分析内存的时候,我们主要用它生成内存快照。

主要有以下三个功能:

生成内存快照

转储成 json 格式

使用标准的 diff 工具比较两个 dump 文件

图片来源:https://www.cnblogs.com/cheyunhua/p/10598181.html

可以将CSV的数据导入到MySQL,这样就可以利用sql语句对Redis的内存数据进行各种分析。

rdr

https://github.com/xueqiu/rdr

./rdr show -p 8080 *.rdb

redis-rdb-cli

https://github.com/leonchen83/redis-rdb-cli

RDB持久化:是一种内存快照的形式,按照一定的频次进行快照落盘。

 

优点:这是一种理想化的选择,不会影响redis服务的进行。缺点:有些redis服务没有采用RDB持久化,不具有普遍性。时效性更差。

定制化

手动使用SCAN + TYPE并配合STRLEN等命令自己实现一个Redis实例级的大Key分析工具。

支持固定key值和key patten。在key patten中,通过scan pattern得到一定范围的key,再通过length函数对每种类型的key("HLEN""LLEN""SCARD""ZCARD""PFCOUNT""STRLEN")取值,得到对应的key的length。

如何优化big key?

1.合理优化数据结构。拆:将大的key,拆成小的key。压缩:对较大的数据进行压缩处理。

2.选择其他存储方案。比如文档性数据库MongoDB。

如何删除big key

推荐使用 UNLINK 命令,异步删除 bigkey,不影响主线程执行其他命令。在业务的低峰期使用 scan 命令查找 big key,对于类型为集合的key,可以使用脚本逐一删除里面的元素。

 

 

参考: 

https://segmentfault.com/a/1190000039953951

https://github.com/sripathikrishnan/redis-rdb-tools?spm=a2c6h.12873639.article-detail.7.6e225a65k3bqC8 

https://github.com/xueqiu/rdr

https://github.com/leonchen83/redis-rdb-cli

与[转帖]redis中的bigkey问题相似的内容:

[转帖]redis中的bigkey问题

https://cdn.modb.pro/db/459810 什么是bigkey bigkey就是redis key/value体系中的大value问题。我们知道redis的底层数据存储结构中,有多种数据结构的实现。 String: 简单动态字符串 List: 双向链表、压缩列表 Hash: 哈希表

[转帖]炸了~Redis bigkey导致生产事故-bigkey问题全面分析

文章首发于公众号:BiggerBoy 原文链接 一个Redis生产事故的复盘,整理这篇文章分享给大家。本期文章分析Redis中的bigkey相关问题,主要从以下几个点入手: 文章目录 什么是bigkey?bigkey的危害bigkey的产生如何发现bigkey实际生产的操作方式 如何优化bigkey

[转帖]炸了~Redis bigkey导致生产事故-bigkey问题全面分析

https://blog.csdn.net/ibigboy/article/details/124216874 文章首发于公众号:BiggerBoy 原文链接 一个Redis生产事故的复盘,整理这篇文章分享给大家。本期文章分析Redis中的bigkey相关问题,主要从以下几个点入手: 文章目录 什么

[转帖]redis bigkey 删除问题

一、慢操作分析 redis 的慢操作已经有了,如果没有,我们可以自己去 redis 服务器查看历史的慢日志操作,或者有对应的慢操作监控系统也可以发现问题,这里不做展开。 接下来我们就要看一看为什么这么慢。 看了下项目中的实现代码,结合日志一分析,发现是一个 redis bigkey。 一个 redi

[转帖]一文详解 Redis 中 BigKey、HotKey 的发现与处理

https://baijiahao.baidu.com/s?id=1709288518127882966&wfr=spider&for=pc 一 前言 在Redis的使用过程中,我们经常会遇到BigKey(下文将其称为“大key”)及HotKey(下文将其称为“热key”)。大Key与热Key如果未

[转帖]Redis中的Lua脚本

最近琢磨分布式锁时接触到的知识点,简单记一下。 文章目录 1. Redis中的Lua2. 利用Lua操作Redis3. Lua脚本的原子性4. 关于 EVALSHA5. 常用`SCRIPT` 命令6. 脚本本地化 1. Redis中的Lua Redis支持Lua,代码直接发送完整脚本即可。基本语法(

[转帖]Redis key 乱码问题(springboot)

保存到redis中的key 前半段会出现乱码问题 原来配置: @Configuration@EnableCachingpublic class RedisCacheConfig { @Bean public CacheManager cacheManager(RedisTemplate

[转帖]Redis持久化-RDB和AOF

持久化的功能: Redis是内存数据库, 数据都是存储在内存中, 为了避免进程退出导致数据的永久丢失, 需要定期将Redis中的数据以某种形式(数据或命令) 从内存保存到硬盘。 当下次Redis重启时, 利用持久化文件实现数据恢复。 除此之外, 为了进行灾难备份, 可以将持久化文件拷贝到一个远程位置

[转帖]Redis系列(十七)、Redis中的内存淘汰策略和过期删除策略

我们知道Redis是分布式内存数据库,基于内存运行,可是有没有想过比较好的服务器内存也不过几百G,能存多少数据呢,当内存占用满了之后该怎么办呢?Redis的内存是否可以设置限制? 过期的key是怎么从内存中删除的?不要怕,本篇我们一起来看一下Redis的内存淘汰策略是如何释放内存的,以及过期的key

[转帖]Redis故障检查:识别慢查询操作

https://weibo.com/ttarticle/p/show?id=2309404650615585505652 使用SLOWLOG命令查看Redis中的慢查询操作。 ​​前几篇日志总结了下对Redis部署时的一些配置,Redis启动后,面对各种请求,数据持久化到硬盘,很可能会出现内存不足等