Redis大Key解决方案

简介: Redis大Key解决方案

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固定桶分,即先计算出桶的序号


hash(123456789) % 200W

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

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



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



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

目录
相关文章
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
784 61
Redis应用—6.热key探测设计与实践
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
295 7
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
368 5
|
消息中间件 监控 NoSQL
Redis脑裂问题详解及解决方案
Redis脑裂问题是分布式系统中常见的复杂问题,合理配置Redis Sentinel、使用保护模式、采用分布式锁机制以及优化网络和客户端连接策略等措施,可以有效预防和解决脑裂问题。通过深入理解Redis脑裂问题的成因和影响,采取相应的解决方案,能够提高系统的可用性和数据一致性,保障Redis集群的稳定运行。希望本文能帮助你更好地理解和应对Redis脑裂问题。
1548 2
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
1413 5
Redis中大Key与热Key的解决方案
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
865 0
Redis大Key问题如何排查?如何解决?
|
存储 NoSQL 算法
面试官:Redis 大 key 多 key,你要怎么拆分?
本文介绍了在Redis中处理大key和多key的几种策略,包括将大value拆分成多个key-value对、对包含大量元素的数据结构进行分桶处理、通过Hash结构减少key数量,以及如何合理拆分大Bitmap或布隆过滤器以提高效率和减少内存占用。这些方法有助于优化Redis性能,特别是在数据量庞大的场景下。
面试官:Redis 大 key 多 key,你要怎么拆分?