Redis中BigKey的分析与优化_redis大key优化,Golang进程保活黑科技实现原理解密及方法

126 阅读4分钟

def find_big_keys(redis_conn, threshold): cursor = '0' big_keys = [] while cursor != 0: cursor, keys = redis_conn.scan(cursor=cursor, count=1000) # 分批迭代keys for key in keys: size = redis_conn.memory_usage(key) if size > threshold: big_keys.append((key, size)) return big_keys

打印出所有大于1MB的key

for key, size in find_big_keys(r, 1024 * 1024): print(f"BigKey: {key}, Size: {size}") # 还可以使用异步任务,将得到的key放到指定的地方进行存储,方便后面分析处理


这里使用SCAN命令而非KEYS命令,因为SCAN命令是基于游标的迭代器,可以分批次迭代keys,减少对内存的冲击。


这个脚本分批迭代所有的keys,并且仅在发现超过指定大小的key时才会将其信息打印出来或者进行其他操作。  
 通过设置count参数,你可以根据你的Redis服务器的具体情况来调整每批次处理的keys数量,以达到在不影响Redis性能的前提下完成BigKeys的检测。此外,这个脚本应该在Redis的负载较低时运行,以最小化其对生产环境的影响。


##### BigKey的产生原因


**1、** 不合理的数据设计  
 一个典型的例子是将用户的所有行为数据存放在一个大的List中,而不是分拆成多个小List按时间或者事件类型存储。


**2、** 业务逻辑变化  
 随着业务发展,原本预计不会存储大量数据的Key,可能因为用户量的增长或业务逻辑的变化变成了BigKey。


**3、** 缺失的监控预警  
 没有及时地监控和预警系统的话,一旦数据量异常增长,就可能产生BigKey,而未能及时发现。


##### BigKey带来了什么样的问题


**1、** 性能问题  
 由于Redis的单线程模型,BigKey的操作可能会阻塞其他命令的执行,造成明显的延迟。


**2、** 资源消耗  
 BigKey占用大量内存,可能会导致内存溢出或者其他数据的驱逐。


**3、** 数据管理问题  
 BigKey会给数据迁移工作带来挑战,特别是在使用Redis集群时。


##### BigKey的处理方案


**1、** 切割大key  
 可以将一个大的Hash表切割成多个小Hash表,每个Hash表存储一部分数据。


**2、** 删除或过期  
 可以对BigKey进行渐进式删除,避免一次性删除造成服务的长时间阻塞。



redis-cli --eval del_big_key.lua , bigkey_name


**3、** 使用合适的命令  
 使用`Scan`系列命令进行数据处理,避免一次性操作大量数据。



redis-cli scan 0 match * count 1000


##### 如何有效避免BigKey产生的策略


**1、** 合理的数据模型设计  
 根据业务需求选择合理的数据类型,例如使用小Hash代替大String。  
 Redis为Hash类型的字段使用了特殊的编码方式,如ziplist或hashtable,这些编码方式可以在保持较小内存占用的同时存储相对较小的值。  
 当Hash中的元素数量和单个元素的大小达到一定阈值时,Redis会自动从ziplist转换为hashtable,这种优化能够有效利用内存。


![ ](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b9bc051792074568a273a25d3e6d432a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771857361&x-signature=RnklzahS%2BMYZ7%2BBTQUViA4D9AsY%3D)


**2、** 强化监控预警机制  
 利用Redis自带的监控工具或第三方监控工具,如 Prometheus + Grafana,及时发现异常。


![ ](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/69d2f960b7874ea0b79f9f01e8216b13~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771857361&x-signature=H8DISJETbyn0YkmRVGW%2FWMLWBbw%3D)


**3、** 定期的性能评估与优化  
 定期进行性能评估,及时对数据模型进行调整。


**最后说一句(求关注,求赞,别白嫖我)**


最近无意间获得一份阿里大佬写的刷题笔记和面经,一下子打通了我的任督二脉,进大厂原来没那么难。


这是大佬写的, [7701页的阿里大佬写的刷题笔记,让我offer拿到手软]( )


##### 总结


BigKey问题在Redis的使用中是一个不能忽视的问题。通过合理的数据模型设计,强化监控预警机制,以及定期的性能评估,  
 可以有效地避免BigKey的产生,保持Redis的高性能。我们需要不断地学习和应对新的技术挑战,提升系统的稳定性和可用性。


**推荐几个学习 Redis 教程文章**


* [01、Redis 基础教程]( )
* [02、Redis6.0 系列教程]( )
* [03、Redis 实战教程]( )



![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5a6f782fc20e4c07b26c7bf292d90f25~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771857361&x-signature=6f1PkP%2FME39mFltZdyEcsvdWCTw%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/0bdb72ed324f47c7993ee3a8fb7d95be~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771857361&x-signature=daAyshiQITbNY7Ln7HtLvvPFApc%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2af6d06da45c48c28196061663257d7a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771857361&x-signature=r1R4bFcs2k%2Bf5oCgJTAzQ%2Fx4TOQ%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**