Redis大key 题目分析办理

开发者 2024-9-5 13:35:06 126 0 来自 中国
配景
双十一大促期间, 收到客服反馈关照,说 APP 领券接口痴钝。找到一个case,通过调用链路发现,是操作redis 痴钝,而且还搜到一些redis 非常。
末了定位到缘故原由:是发券场景下拿redis 做了一个缓存券批次的操作,记任命户当天领取的全部券批次
发券场景: key = userId, value = 券批次ID 列表, 而redis 查询发现多了许多大key,体现在 一个用户领取的几千乃至上万张优惠券,导致Redis 查询痴钝,乃至非常。至于为何有的用户会领取这么多优惠券呢。接洽风控发现,这些个用户是来薅羊毛的,但是风控没有拦截到,导致服务这边出现非常。
虽说最终缘故原由不是我的题目,但是Redis 大 key 题目照旧比力故意思的,下面我们就来一起熟悉下 大 key 题目对 Redis 的影响。
什么是大key
所谓的大key题目是某个key的value比力大,以是本质上是大value题目。key每每是步伐可以自行设置的,value每每不受步伐控制,因此大概导致value很大。
假想一种场景:
在线音乐app中,某个歌单有许多用户收藏,如果有如许的数据结构:

redis的key是歌单ID,redis的value是个list,list包罗了用户ID , 用户大概许多,就导致list长度不可控.
大key有什么影响
我们都知道,redis的一个典范特性就是:核心工作线程是单线程。
单线程中哀求使命的处理处罚是串行的,前面完不成,反面处理处罚不了,同时也导致分布式架构中内存数据和CPU的不均衡。
实行大key下令的客户端自己,耗时显着增长,乃至超时
实行大key干系读取大概删除操作时,会严峻占用带宽和CPU,影响其他客户端
大key自己的存储带来分布式体系中分片数据不均衡,CPU利用率也不均衡
大key偶然间也是热key,读取操作频仍,影响面会很大
实行大key删除时,在低版本redis中大概壅闭线程
如许看来大key的影响照旧很显着的,最典范的就是壅闭线程,并发量下降,导致客户端超时,服务端业务乐成率下降。
大key是怎样产生的
大key的产生每每是业务方筹划不公道,没有预见vaule的动态增长题目:
一直往value塞数据,没有删除机制,早晚要爆炸
数据没有公道做分片,将大key酿成小key
怎样找到大key
增长内存&流量&超时等指标监控
由于大key的value很大,实行读取时大概壅闭线程,如许Redis团体的qps会下降,而且客户端超时会增长,网络带宽会上涨,配置这些报警可以让我们发现大key的存在。
bigkeys下令
利用bigkeys下令以遍历的方式分析Redis实例中的全部Key,并返回团体统计信息与每个数据范例中Top1的大Key

redis-rdb-tools
利用redis-rdb-tools离线分析工具来扫描RDB长期化文件,固然实时性略差,但是完全离线对性能无影响。
redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件天生json文件大概天生报表用来分析Redis的利用详情。
集成化可视化工具
基于某些公有云大概公司内部架构的redis一样平常都会有可视化的页面和分析工具,来资助我们定位大key,当然页面底层也大概是基于bigkeys大概rdb文件离线分析的效果。
怎样办理大key题目
根据大key的现实用途可以分为两种环境:可删除和不可删除。
可删除

如果发现某些大key并非热key就可以在DB中查询利用,则可以在Redis中删掉:
当Redis版本大于4.0时,可利用UNLINK下令安全地删除大Key,该下令可以或许以非壅闭的方式,逐步地清算传入的Key。
Redis UNLINK 下令雷同与 DEL 下令,表现删除指定的 key,如果指定 key 不存在,下令则忽略。
UNLINK 下令不同与 DEL 下令在于它是异步实行的,因此它不会壅闭。
UNLINK 下令黑白壅闭删除,非壅闭删除简言之,就是将删除操作放到别的一个线程行止理。
当Redis版本小于4.0时,制止利用壅闭式下令KEYS,而是发起通过SCAN下令实行增量迭代扫描key,然后判定进行删除。
Redis Scan 下令用于迭代数据库中的数据库键。
SCAN 下令是一个基于游标的迭代器,每次被调用之后, 都会向用户返回一个新的游标, 用户在下次迭代时须要利用这个新游标作为 SCAN 下令的游标参数, 以此来连续之前的迭代过程。
压缩和拆分key
当vaule是string时,比力难拆分,则利用序列化、压缩算法将key的巨细控制在公道范围内,但是序列化和反序列化都会带来更多时间上的斲丧。
当value是string,压缩之后仍然是大key,则须要进行拆分,一个大key分为不同的部分,记录每个部分的key,利用multiget等操作实现变乱读取。
当value是list/set等聚集范例时,根据预估的数据规模来进行分片,不同的元素盘算后分到不同的片。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-23 18:53, Processed in 0.150443 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表