Redis常见的数据结构

Redis底层的数据结构是Redis高效存储和操作数据的基础,Redis提供了五种基本的数据类型,每种类型在底层都有对应的数据结构来实现。这五种数据类型分别是:字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。

1. 字符串(String)

字符串是Redis中最基本的数据类型,底层实现使用的是简单动态字符串(SDS),SDS具有以下特点:
1.长度与空间: SDS 维护了一个 len 字段表示已使用长度,一个 free 字段表示未使用的剩余空间,避免了每次操作都重新计算字符串长度。
2.二进制安全: SDS 可以存储任意二进制数据,不像 C 语言的字符串只能存储文本数据。
3.空间预分配: 当 SDS 扩展时,除了为新内容分配必要的空间外,还会分配额外的空间以减少未来的扩展次数。
4.惰性空间释放: 当 SDS 缩小时,并不会立即回收多余空间,而是通过 free 字段记录剩余空间,以备后续使用。

应用场景

缓存对象: 字符串类型通常用来缓存简单的对象,比如缓存用户信息、网页内容、配置信息等。
计数器: 可以使用字符串类型来实现计数器,利用 INCR、DECR 操作对数值进行原子性的加减操作。适用于统计网站访问量、点赞数等。
分布式锁: 可以使用字符串类型加上 SETNX 命令实现分布式锁。通过给字符串设置一个过期时间来确保锁的自动释放。
Session 数据: 可以将用户的会话数据存储在 Redis 中,利用字符串类型快速读取和更新会话信息。

2. 列表(List)

Redis 的列表类型底层使用了两种数据结构:双向链表 和 压缩列表(ziplist)。
双向链表: 用于存储元素较多或者元素较大的列表。双向链表的特点是支持双向遍历,插入和删除操作非常高效。
压缩列表: 是一种内存紧凑型的连续内存块,用于存储较小数量的短字符串列表。当列表中的元素较少且元素值较小时,Redis 会选择使用压缩列表来节省内存。

应用场景

消息队列: 利用列表的 LPUSH 和 RPOP(或 BRPOP)操作,可以实现简单的消息队列,支持先进先出的队列模式。
任务队列: 将待处理的任务存入列表,工作线程可以从列表中取出任务进行处理,非常适合任务调度、工作队列的场景。
日志收集: 可以使用列表来收集和存储日志信息,日志信息可以通过 LPUSH 插入到列表中,再通过 LRANGE 或 LPOP 进行读取和处理。
分页数据: 在某些场景下,可以将数据存储在列表中,并使用 LRANGE 命令进行分页显示。

3.哈希(Hash)

哈希类型的底层也使用了 压缩列表(ziplist) 和 哈希表(hashtable) 两种结构。
压缩列表: 当哈希表中的键值对较少且每个键值对的数据量都比较小时,Redis 会使用压缩列表来存储,节省内存。
哈希表: 当哈希表的元素较多时,Redis 会自动转换为哈希表结构,哈希表实现了高效的查找、插入和删除操作。

应用场景

存储对象信息: 哈希类型特别适合存储对象,例如存储用户信息、产品信息等。每个对象的字段可以作为哈希表的键,字段值作为哈希表的值。
计数器: 在某些场景下,需要为多个字段进行独立的计数操作,哈希类型可以为每个字段单独计数,例如对用户行为进行分类统计。
元数据存储: 在一些需要存储大量小数据的场景下,哈希类型可以用来存储这些元数据,例如缓存数据库中的表行数据。

4. 集合(Set)

集合类型的底层数据结构是 哈希表(hashtable),因为集合的元素是无序且唯一的。Redis 使用哈希表来确保集合元素的唯一性并提供 O(1) 的查找、插入和删除操作。

应用场景

标签系统: 集合可以用于实现标签系统,例如存储用户的兴趣标签,利用集合的无序性和唯一性,确保每个用户兴趣只被存储一次。
去重: 在需要去重的场景下,可以利用集合来存储数据并确保数据唯一性。例如,在社交媒体应用中,跟踪用户点赞的帖子。
好友推荐: 可以使用集合操作来计算两个用户的共同好友,通过 SINTER 等操作获得交集,从而推荐共同好友。
实时排名: 集合可以用于一些简单的实时排名系统,通过 SADD 和 SMEMBERS 操作,可以实现实时更新和查询。

5.有序集合(Sorted Set)

有序集合的底层数据结构是跳表(skiplist)和压缩列表(ziplist)的结合。
跳表: 用于存储大量有序的元素,支持快速的范围查询操作。跳表是 Redis 实现有序集合的核心数据结构,通过多层链表来实现快速查找。
压缩列表: 当有序集合中的元素较少时,Redis 会使用压缩列表来存储,以节省内存。

应用场景

排行榜: 有序集合广泛用于实现排行榜系统,例如根据用户的得分排序排名,使用 ZADD 添加数据,ZRANGE 获取排名。
延迟队列: 可以使用有序集合实现延迟任务队列,通过分数表示任务的执行时间,到达指定时间时执行任务。
限时活动: 在限时促销或竞拍等场景中,可以使用有序集合存储用户出价和时间,根据分数(价格或时间)排序确定优先级。
优先级队列: 有序集合也可以用来实现优先级队列,根据任务的优先级不同给定不同的分数,任务可以按照优先级执行。

6.HyperLogLog

HyperLogLog 是一种概率性的数据结构,用于计算数据的基数(即去重后元素的数量)。它的主要优点是在处理大量元素时,使用非常少的内存就能给出一个误差范围可接受的基数估计。

应用场景

大数据去重统计: 适用于大规模数据的基数统计,例如统计一个网站的日活跃用户(UV),HyperLogLog 可以在使用极少内存的情况下给出一个大致的唯一用户数。
在线统计: 可以用于实时监测和统计,例如在广告系统中统计广告点击的独立用户数。

7. 位图(Bitmap)

位图不是 Redis 的基本数据类型,而是一种基于字符串类型的高级操作。位图将字符串的每个比特位视为一个二进制位,从而可以高效地进行大规模的布尔类型操作。

应用场景

用户签到系统: 可以使用位图记录用户的签到情况,每一位表示一天,1 表示签到,0 表示未签到,可以快速统计用户的连续签到天数、缺勤次数等。
权限控制: 位图可以用于实现简单的权限控制,使用一组比特位表示不同的权限,判断某用户是否拥有某项权限。
活跃用户统计: 可以使用位图记录某段时间内用户是否活跃,每位表示一天,通过 BITCOUNT 可以快速统计某段时间内的活跃天数。

8.Geospatial(地理空间索引)

Redis 提供了一套基于有序集合的地理空间数据类型,通过 GeoHash 和有序集合实现地理位置的存储和查询。

应用场景

附近的人/店铺搜索: 可以用于 LBS(Location-Based Service)应用,存储用户或店铺的地理位置,通过 GeoHash 和有序集合来快速计算某点附近的其他点。
物流跟踪: 可以存储快递或者车辆的地理位置,并在需要时查询某个位置周围的快递或车辆。

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值