首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 基本架构:一个键值数据库包含什么?
02 | 数据结构:快速的Redis有哪些慢操作?
03 | 高性能IO模型:为什么单线程Redis能那么快?
04 | AOF日志:宕机了,Redis如何避免数据丢失?
05 | 内存快照:宕机后,Redis如何实现快速恢复?
06 | 数据同步:主从库如何实现数据一致?
07 | 哨兵机制:主库挂了,如何不间断服务?
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
09 | 切片集群:数据增多了,是该加内存还是加实例?
10 | 第1~9讲课后思考题答案及常见问题答疑
11 | “万金油”的String,为什么不好用了?
12 | 有一亿个keys要统计,应该用哪种集合?
13 | GEO是什么?还可以定义新的数据类型吗?
14 | 如何在Redis中保存时间序列数据?
15 | 消息队列的考验:Redis有哪些解决方案?
16 | 异步机制:如何避免单线程模型的阻塞?
17 | 为什么CPU结构也会影响Redis的性能?
18 | 波动的响应延迟:如何应对变慢的Redis?
20 | 删除数据后,为什么内存占用率还是很高?
21 | 缓冲区:一个可能引发“惨案”的地方
22 | 第11~21讲课后思考题答案及常见问题答疑
23 | 旁路缓存:Redis是如何工作的?
24 | 替换策略:缓存满了怎么办?
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
27 | 缓存被污染了,该怎么办?
28 | Pika:如何基于SSD实现大容量Redis?
29 | 无锁的原子操作:Redis如何应对并发访问?
30 | 如何使用Redis实现分布式锁?
31 | 事务机制:Redis能实现ACID属性吗?
32 | Redis主从同步与故障切换,有哪些坑?
33 | 脑裂:一次奇怪的数据丢失
34 | 第23~33讲课后思考题答案及常见问题答疑
35 | Codis VS Redis Cluster:我该选择哪一个集群方案?
36 | Redis支撑秒杀场景的关键技术和实践都有哪些?
37 | 数据分布优化:如何应对数据倾斜?
38 | 通信开销:限制Redis Cluster规模的关键因素
39 | Redis 6.0的新特性:多线程、客户端缓存与安全
40 | Redis的下一步:基于NVM内存的实践
当前位置:
首页>>
技术小册>>
Redis核心技术与实战
小册名称:Redis核心技术与实战
### 12 | 有一亿个Keys要统计,应该用哪种集合? 在Redis这个高性能的键值存储系统中,处理大规模数据集时选择合适的数据结构至关重要。当面临一亿个Keys需要统计的场景时,选择合适的集合类型不仅能显著提升性能,还能有效减少内存占用。本章节将深入探讨Redis中几种适合大规模统计的集合类型——`HyperLogLog`、`Sorted Set`(有序集合)、`Bitmaps`(位图),并对比它们在统计大规模数据集时的优缺点,帮助读者根据实际需求做出最佳选择。 #### 一、引言 在Redis中,处理大量数据时,常见的需求包括去重计数、排名统计、快速查询等。对于一亿个Keys的统计任务,传统的`String`或`List`等数据结构可能因内存占用过高或性能瓶颈而不适用。因此,我们需要寻找更适合此类场景的集合类型。 #### 二、HyperLogLog:内存效率之王 **1. HyperLogLog简介** HyperLogLog是Redis提供的一种用于基数估算的算法,它能够在非常有限的内存空间内,实现误差可控的独立元素计数。即使面对亿级别的数据量,HyperLogLog也能保持极低的内存消耗(通常每个HyperLogLog结构仅占用12KB左右内存)。 **2. 使用场景** - **UV统计**:在Web应用中统计独立访客数量。 - **数据去重后的计数**:如分析日志文件中的唯一IP地址数。 **3. 优点** - **内存效率高**:相较于存储完整数据集,HyperLogLog极大地节省了内存。 - **误差可控**:虽然存在误差,但可以通过调整参数来控制误差范围。 - **操作速度快**:添加元素和计算基数都非常迅速。 **4. 缺点** - **不支持元素检索**:HyperLogLog仅提供基数估计,无法获取具体元素或元素列表。 - **精度损失**:由于是基于概率的算法,存在一定程度的精度损失。 #### 三、Sorted Set:有序统计的利器 **1. Sorted Set简介** Sorted Set(有序集合)是Redis中一种将集合中的元素按分数进行排序的数据结构。每个元素都关联一个浮点数分数,这使得Sorted Set非常适合于需要排序的场景,如排行榜、成绩单等。 **2. 使用场景** - **排行榜**:如游戏内玩家积分排行榜。 - **带权重的元素排序**:如根据用户活跃度排序的用户列表。 **3. 优点** - **自动排序**:根据元素关联的分数自动排序,方便快速获取排序后的数据。 - **范围查询**:支持通过分数范围快速检索元素。 - **分数更新灵活**:可以轻松更新元素的分数,并重新排序。 **4. 缺点** - **内存占用较高**:相较于HyperLogLog,Sorted Set的内存占用会显著增加,因为需要存储每个元素的分数和值。 - **性能考虑**:当集合规模非常大时,虽然Redis对Sorted Set进行了优化,但频繁的操作仍可能对性能产生影响。 #### 四、Bitmaps:高效的位操作 **1. Bitmaps简介** Bitmaps是Redis提供的一种位级别的操作工具,它可以将字符串看作是一个位数组(bit array),并提供一系列位级别的操作命令。由于位操作的高效性,Bitmaps非常适合于处理大量数据但只关心存在性(即0或1)的场景。 **2. 使用场景** - **用户签到统计**:每天一个位表示用户是否签到。 - **活跃用户统计**:统计某一天内活跃的用户ID。 **3. 优点** - **内存效率高**:每个位只占用1bit,非常适合存储大量稀疏数据。 - **操作速度快**:位操作通常比字节或字符串操作更快。 - **灵活性**:可以组合多个Bitmaps来执行更复杂的操作,如并集、交集等。 **4. 缺点** - **数据表示单一**:仅适用于表示存在性(0或1)的场景。 - **位操作局限性**:虽然位操作高效,但可能不适用于所有统计需求。 #### 五、选择依据与实战建议 **1. 根据需求选择** - 如果仅需要统计独立元素的数量,且对精度有一定容忍度,HyperLogLog是最佳选择。 - 如果需要按某种规则排序元素,并频繁进行范围查询,Sorted Set更为合适。 - 若场景涉及大量稀疏数据的存在性检查,Bitmaps将是高效的选择。 **2. 实战建议** - **评估数据量**:在决定使用哪种集合之前,先评估数据量大小及增长趋势。 - **考虑内存成本**:特别是对于内存敏感的应用,需仔细计算各种集合的内存占用。 - **性能测试**:在开发初期,通过模拟实际数据进行性能测试,验证所选集合的性能表现。 - **备份与恢复**:对于重要数据,制定备份与恢复策略,以防数据丢失。 #### 六、总结 面对一亿个Keys的统计任务,Redis提供了多种高效的集合类型供我们选择。HyperLogLog以其极高的内存效率和可控的误差,成为基数统计的首选;Sorted Set则凭借其自动排序和范围查询的能力,在需要排序统计的场景中大放异彩;而Bitmaps则以其高效的位操作,在处理大量稀疏数据的存在性检查时展现出独特优势。在实际应用中,我们应根据具体需求,灵活选择最适合的集合类型,以达到最佳的性能和内存使用效果。
上一篇:
11 | “万金油”的String,为什么不好用了?
下一篇:
13 | GEO是什么?还可以定义新的数据类型吗?
该分类下的相关小册推荐:
Redis面试指南
Redis的Lua脚本编程
Redis零基础到实战