前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >大厂都是如何优化Redis大Key的?

大厂都是如何优化Redis大Key的?

作者头像
JavaEdge
发布于 2021-04-01 08:55:02
发布于 2021-04-01 08:55:02
1.2K00
代码可运行
举报
文章被收录于专栏:JavaEdgeJavaEdge
运行总次数:0
代码可运行

若一个K的V很大,则可能对Redis产生明显的性能影响。因为Redis是单线程模型,对于大K进行查询或删除,可能会导致Redis阻塞。 那我们开发时应该如何查询Redis中的大K,以及如何在设计上实现大K的拆分呢,即如何优化?

单K存储的V很大

需要整存整取的K

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

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

类似上一种方案,拆分成几个K.V;

也可将这个大对象存储在一个hash,每个field代表一个具体属性

  • hget、hmget获取部分V
  • hset,hmset更新部分属性

集群存储了大量K

若K过多,会带来更多内存空间占用:

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

如上方面在K达到上亿量级时消耗内存很严重。所以减少K的个数,即可减少内存消耗,可考虑转Hash结构存储,即原先是使用String存储的,现在改为将多个key存储在一个Hash。

key本身具备强相关性

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

key本身无相关性

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hash(123456789) % 200W

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

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

  • 存储时调用hset(key, field, value)
  • 读取时使用hget(key, field)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/03/30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis大key多key拆分方案
(如无意外,文章中所提及的hash,set等数据结构均指redis中的数据结构 )
王炸
2019/07/02
9.3K0
Redis大key多key拆分方案
Redis热点key及大key解决方案
如果Key特别热,可能Redis也无法承受,毕竟所有的访问都集中打到了一台缓存服务器。如果我们使用Redis来做缓存,那可以把一个热点Key的缓存查询压力,分散到多个Redis节点上吗?
JavaEdge
2021/03/27
5.1K0
Redis大key优化方案
由于redis是单线程运行的,如果一次操作的value很大会对整个redis的响应时间造成负面影响,所以业务上通常会以以下方式进行分拆。
春哥大魔王
2019/05/05
5.9K0
Redis大key优化方案
Redis大Key解决方案
如果一个Key的Value特别大,那么可能会对Redis产生巨大的性能影响,因为Redis是单线程模型,对大Key进行查询或删除等操作,可能会引起Redis阻塞甚至是高可用切换。 应该如何查询Redis中的大Key,以及如何在设计上实现大Key的拆分呢?
JavaEdge
2021/03/28
2.8K0
面试官:Redis 大 key 多 key,你要怎么拆分?
(如无意外,文章中所提及的hash,set等数据结构均指redis中的数据结构 )
程序员皮皮林
2024/11/20
2410
面试官:Redis 大 key 多 key,你要怎么拆分?
Redis中大key问题,热key问题的解决方案
业务场景中经常会有各种大key的情况, 比如: 1. 单个简单的key存储的value很大(例如排行榜信息,key是固定的,value排行榜几十万的数据) 2. hash、set、zset、list中存储过多的元素(以万为单位)
用户10756793
2023/09/18
7691
Redis 单key值过大 优化方式
由于redis是单线程运行的,如果一次操作的value很大会对整个redis的响应时间造成负面影响,所以,业务上能拆则拆,下面举几个典型的分拆方案。
高广超
2018/12/12
3.4K0
redis缓存使用中的大key问题
1.配送范围特别大的门店 2.促销活动特别多的门店、商家等 3.高频用户下的订单列表
名字是乱打的
2022/06/08
1.1K0
Redis大key问题
在Redis中,大key指的是key对应的value值所占的内存空间比较大,例如一个字符串类型的value最大可以存储512MB的内容,一个列表类型的value最多可以存储2的32次方-1个元素,一般情况下,我们认为字符串类型的key的value值超过10kb,就算大key。
AsiaYe
2020/07/14
11.7K0
Redis选13亿个Key,4个field还是1亿个Key,13亿*4个field?
哈希hash又称为散列、杂凑等,是将任意长度的输入通过散列算法变换为固定长度的输出,最终输出也就是哈希值。这种转换是一种压缩映射。也就是说,散列值的空间通常要远小于输入控件,不同的输入可能会散列成相同的输出,所以不可能通过散列值来确定唯一的输入值。
王知无-import_bigdata
2019/11/09
3.8K0
Redis 基本数据结构三:哈希
几乎所有的编程语言都提供了哈希(hash)类型,例如 Java 中的 Map,python 中的字典,在Redis中,哈希类型是指键的值本身又是一个键值对结构,如下图所示:
CoderJed
2019/07/12
5820
Redis 基本数据结构三:哈希
Redis教程(3)
Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个hash对象时开始是用zipmap(又称为small hash)来存储的。这个zipmap其实并不是hash table,但是zipmap相比正常的hash实现可以节省不少hash本身需要的一些元数据存储开销。尽管zipmap的添加,删除,查找都是O(n),但是由于一般对象的field数量都不太多。所以使用zipmap也是很快的,也就是说添加删除平均还是O(1)。如果field或者value的大小超出一定限制后,Redis会在内部自动将zipmap替换成正常的hash实现. 这个限制可以在配置文件中指定
py3study
2020/01/09
5670
热点Key
对于电商网站中,我们经常可以会遇到热门商品的抢购或者秒杀场景以及事先经过广告投放等措施进行定向引流,这样就会导致某个热卖商品在短时间内涌入大量流量。
翎野君
2023/05/12
6070
深入剖析Redis系列:Redis数据结构之哈希
大部分编程语言都提供了 哈希(hash)类型,它们的叫法可能是 哈希、字典、关联数组。在 Redis 中,哈希类型 是指键值本身又是一个 键值对结构。
用户5546570
2019/06/06
1K0
深入剖析Redis系列:Redis数据结构之哈希
Redis数据类型之Hash哈希类型
Hash的应用场景:(存储一个用户信息对象数据) 1、 常用于存储一个对象 2、 为什么不用string存储一个对象?
兮动人
2021/06/11
4990
Redis数据类型之Hash哈希类型
redis | 七、redis之Hash
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
雨中散步撒哈拉
2022/09/21
5150
怎么样更好的优化Redis性能?
当然在精简的同时,不要为了key的“见名知意”。对于value有些也可精简,比如性别使用0、1。
用户7353950
2022/06/23
9610
怎么样更好的优化Redis性能?
常见面试题整理(2022-11)
Java Hotspot 虚拟机中,每个对象都有对象头(包括 class 指针和 Mark Word)。Mark Word 平时存储这个对象的 哈希码、分代年龄,当加锁时,这些信息就根据情况被替换为 标记位(轻重量级锁)、线程锁记录指针、重量级锁指针、线程ID等内容。
ha_lydms
2023/08/10
2280
常见面试题整理(2022-11)
Redis 系列(3) —— Hash
Redis 的散列会将一个键和一个散列在数据库里关联起来,用户可以在散列中为任意多个字段设置值。与字符串键一样,散列的字段和值既可以是文本数据,也可以是二进制数据。
求和小熊猫
2021/09/10
4780
Redis Hash 类型操作及常用命令
Redis hash 是一个 String 类型的 field 和 value 的映射表。它的添加、删除操作都是 O(1) (平均)。hash 特别适合用于存储对象。相较于将对象的每个字段存成单个 string 类型。将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field 数量都不太多。所以使用 zipmap 也是很快的,也就是说添加、删除平均还是 O(1)。如果 field 或者 value的大小超出一定限制后, Redis 会在内部自动将 zipmap 替换成正常的 hash 实现. 这个限制可以在配置文件中指定。
Jacob丶
2020/08/05
5240
相关推荐
Redis大key多key拆分方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验