前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis缓存使用中的大key问题

redis缓存使用中的大key问题

作者头像
名字是乱打的
发布2022-06-08 13:03:57
1K0
发布2022-06-08 13:03:57
举报
文章被收录于专栏:软件工程软件工程

大key问题

何为大key?

1.单个简单的key存储的value很大

  1. hash, set,zset,list 结构中存储过多的元素

可能出现大key的业务场景

1.配送范围特别大的门店 2.促销活动特别多的门店、商家等 3.高频用户下的订单列表

  1. 等 ……

大key的危害

  1. OPS低也会导致内存占用多、流量大,比如一次取走100K的数据,当OPS为1000时,就会产生100M/s的流量
  2. 如果为list,hash等数据结构,大量的elements需要多次遍历,多次系统调用拷贝数据消耗时间
  3. 主动删除、被动过期删除、数据迁移等,由于处理这一个KEY时间长,导致服务端发生阻塞

如何找到大key?

  1. jimdb管理端,拓扑Tab页,点击实例可以使用大key扫描功能,该功能底层使用scan扫描所有key,会影响实例性能,选择业务低峰进行
  2. redis 可使用redis-cli的“--bigkeys”选项查找大Key

如何解决大key?

  1. 对于需要整取value的key,可以尝试将对象分拆成几个key-value, 使用multiGet获取值,这样分拆的意义在于分拆单次操作的压力,将操作压力平摊到多个实例中,降低对单个实例的IO影响
  2. 对于每次需要取部分value的key,同样可以拆成几个key-value,也可以将这些存储在一个hash中,每个field代表具体属性,使用hget,hmget来获取部分value,使用hset,hmset来更新部分属性
  3. 对于value中存储过多元素的key,同样可以将这部分元素拆分,以hash为例,正常的流程是:hget(hashKey, field);hset(hashKey, field, value)。 现在可以固定一个桶数量,比如1w,每次存取的时候,先在本地计算field的hash值,对1w取模,确定field落在哪个key上,newHashKey = hashKey + ( hash(field) % 10000); hset (newHashKey, field, value) ; hget(newHashKey, field),set,zset,list做法类似

参考资料

  1. https://cloud.tencent.com/developer/article/1420342
  2. https://juejin.im/post/5d8f0f7de51d4578323d51d0
  3. https://www.javazhiyin.com/41124.html
  4. http://tigcms.jd.com/details/S11dBQ5M7.html
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 何为大key?
  • 可能出现大key的业务场景
  • 大key的危害
  • 如何找到大key?
  • 如何解决大key?
  • 参考资料
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档