当前位置: 首页 > news >正文

redis大key优化

1.什么是大key以及可能造成的异常

1.1 什么大key

redis是key,val型存储结构,key允许的最大大小为512MB,空字符串也是有效的键。大key是指value很大(占用大内存)。
常见的大key,大致可以这么分(根据具体redis规格以及实际压测而定):
(1)单个String类型的Key大小
(2)集合类型数量以及整体内存

1.2 大key危害

(1)影响吞吐qps
redis是单线程执行命令,大key耗时相对长,压测会发现其占用整个请求处理时间长。qps要求高的场景,影响其他接口请求,甚至可能会触发上游请求超时。
(2)占用大量带宽,甚至引发网络阻塞
例如2MB的缓存,1000qps,1秒大约2000Mb的流量。
(3)阻塞工作线程
del删除大key,造成主库较长时间的阻塞并引发同步中断或主从切换;
(4)redis内存分布不均匀
Redis集群中的某个节点内存使用量超过其余节点,数据迁移以Ke为基本单元,故无法实现均衡各个节点上的内存。

2.怎么识别大key

2.1 各个云厂商提供的监控

例如阿里云: https://help.aliyun.com/zh/redis/user-guide/view-monitoring-data?spm=a2c4g.11186623.0.0.6f3bd584t9imPV
可以从阿里云的监控得到: (1)热点key (2)慢key,延时高的key。

2.2 redis自带工具

redis-cli --bigkeys

2.3 开源工具

3.优化大key

3.1 本地缓存

将更新频率低,但是使用量高的数据使用本地缓存替代redis,还可以加快访问速度。

3.2 大key拆分

(1)对于集合类型
若业务允许,可以将集合类型拆分成一个一个string类型,同时统一前缀,通过mget和mset来访问。
拆分两个或者多个集合。
(2)string类型
存储关键数据,剔除非关键数据,例如只存储用户的id,权限id,而非整个用户信息或权限信息

3.3 删除无用的数据

(1)每条数据都设置过期时间
(2)业务删除的数据,在redis中找个合适时间,例如每次上线,业务低频时间,进行删除。

相关文章:

  • csdn上传源码资源卖钱能买房买车吗?每天最高收入200-500?
  • Docker 可用镜像源
  • Qt 技术博客:深入理解 Qt 中的 delete 和 deleteLater 与信号槽机制
  • docker内apt-get update Waiting for headers 0%
  • 音视频的Buffer处理
  • Parallelize your massive SHAP computations with MLlib and PySpark
  • NTFS和exFAT哪个性能好 U盘格式化NTFS好还是exFAT好 mac不能读取移动硬盘怎么解决
  • 深信服科技:2023网络安全深度洞察及2024年趋势研判报告
  • [实践篇]13.29 再来聊下Pass Through设备透传
  • sixLabors.ImageSharp图片截取
  • 中介子方程二十九
  • win10远程桌面连接端口,远Win10远程桌面连接端口修改及无法连接解决方案
  • Vue67-Vuex简介
  • Leetcode3185. 构成整天的下标对数目 II
  • 基于IDEA的Maven(依赖介绍和引用)
  • codis proxy处理流程
  • ComponentOne 2017 V2版本正式发布
  • exports和module.exports
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java 网络编程(2):UDP 的使用
  • JavaScript对象详解
  • JS函数式编程 数组部分风格 ES6版
  • Redux系列x:源码分析
  • 创建一个Struts2项目maven 方式
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分享一份非常强势的Android面试题
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 关于springcloud Gateway中的限流
  • 码农张的Bug人生 - 初来乍到
  • 数据仓库的几种建模方法
  • 写给高年级小学生看的《Bash 指南》
  • 正则表达式
  • 浅谈sql中的in与not in,exists与not exists的区别
  • #{} 和 ${}区别
  • #DBA杂记1
  • #Linux(帮助手册)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (1)svelte 教程:hello world
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十六)一篇文章学会Java的常用API
  • ./和../以及/和~之间的区别
  • .Net core 6.0 升8.0
  • .Net FrameWork总结
  • .Net的DataSet直接与SQL2005交互
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET面试题(二)
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [] 与 [[]], -gt 与 > 的比较
  • []C/C++读取串口接收到的数据程序
  • [Android]一个简单使用Handler做Timer的例子
  • [Android学习笔记]ScrollView的使用
  • [asp.net core]project.json(2)