若一个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代表一个具体属性
集群存储了大量K
若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固定桶分,即先计算出桶的序号
hash(123456789) % 200W
最好保证该hash算法的值是个正数,否则需要调整模除的规则。
这样算出三个key 的桶分别是 1、2、2。所以
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有