前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis大Key解决方案

Redis大Key解决方案

作者头像
JavaEdge
发布2021-03-28 21:47:30
2.7K0
发布2021-03-28 21:47:30
举报
文章被收录于专栏:JavaEdgeJavaEdge

2 大Key

如果一个Key的Value特别大,那么可能会对Redis产生巨大的性能影响,因为Redis是单线程模型,对大Key进行查询或删除等操作,可能会引起Redis阻塞甚至是高可用切换。 应该如何查询Redis中的大Key,以及如何在设计上实现大Key的拆分呢?

2.1 单个K存储的V很大

key分类如下:

该key需要每次都整存整取

尝试将对象分拆成几个K.V, 使用multiGet获取值。 拆分旨在降低单次操作的压力,将操作压力平摊到多个Redis实例,降低对单个redis的I/O影响。

该对象每次只需要存取部分数据

  • 类似上一种方案,拆分成几个K.V
  • 也可将这个大对象存储在一个hash,每个field代表一个具体属性
    • hget、hmget获取部分value
    • hset,hmset来更新部分属性

2.2 一个集群存储了上亿key

如果key个数过多,会带来更多内存空间占用:

  • key本身的占用 每个key 都会有一个Category前缀
  • 集群模式中,服务端需要建立一些slot2key的映射关系 这其中的指针占用在key多的情况下也是浪费巨大空间

这两方面在key个数上亿时消耗内存十分明显(Redis 3.2及以下版本均存在这个问题,4.0有优化)。所以减少K个数可以减少内存消耗,可以参考的方案是转Hash结构存储,即原先是直接使用Redis String 的结构存储,现在将多个key存储在一个Hash结构:

2.2.1 key本身具备强相关性

比如多个K代表一个对象,每个K是对象的一个属性,这种可直接按照特定对象的特征来设置一个新K——Hash结构, 原先的K则作为这个新Hash 的field。

2.2.2 key本身无相关性

预估总量,预分一个固定的桶数量: 比如现在预估K总计2亿,按一个hash存储 100个field算,需要 2亿 / 100 = 200W 个桶 (200W 个K占用的空间很少,2亿可能有近20G )。 现在按200W固定桶分,即先计算出桶的序号

代码语言:javascript
复制
hash(123456789) % 200W

最好保证该hash算法的值是个正数,否则需要调整模除的规则。

这样算出三个key 的桶分别是 1、2、2。 所以

  • 存储时调用hset(key, field, value)
  • 读取时使用hget(key, field)

注意hash取模对负数的处理,还有预分桶时, 一个hash 中存储的值最好不要超过 512,100 左右较为合适。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2 大Key
    • 2.1 单个K存储的V很大
      • 该key需要每次都整存整取
      • 该对象每次只需要存取部分数据
    • 2.2 一个集群存储了上亿key
      • 2.2.1 key本身具备强相关性
      • 2.2.2 key本身无相关性
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com