Redis的常用数据结构

文章目录

Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。

String

字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。

使用场景

  • 缓存:存储临时数据,如用户会话、页面缓存。
  • 计数器:用于统计访问量、点赞数等,通过原子操作增加或减少。

Hash

哈希是一个键值对集合,适合存储对象的属性。Redis内部使用哈希表实现,适合小规模数据。

使用场景

  • 商品详情:存储商品的各个属性,方便快速检索。

List

列表是有序的字符串集合,支持从两端推入和弹出元素,底层实现为双向链表。

使用场景

  • 消息队列 :用于简单任务调度、消息传递等场景,通过LPUSHRPOP操作实现生产者消费者模式。
  • 历史记录:存储用户操作的历史记录,便于快速访问。

Set

集合是无序且不重复的字符串集合,使用哈希表实现,支持快速查找和去重操作。

使用场景

  • 标签系统:存储用户的兴趣标签,避免重复。
  • 唯一用户集合:记录访问过某个页面的唯一用户,方便进行分析。

Sorted Set

有序集合类似于集合,但每个元素都有一个分数(score),用于排序。底层使用跳表实现,支持快速的范围查询。

使用场景

  • 排行榜:存储用户分数,实现实时排行榜。
  • 任务调度:根据任务的优先级进行排序,方便调度执行。

四种高级数据类型

随着 Redis 版本的更新,后面又增加 BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。

BitMap

BitMap 是一种以位为单位存储数据的高效方式,适合用来表示布尔值(如存在性、状态等)。每个 bit 可以表示一个状态(0 或 1),使用空间少且操作快速。

使用示例:假设要统计每天用户的在线状态,可以用 Bitmap 记录每个用户是否在线:

redis 复制代码
SETBIT user:online:2024-09-27 12345 1  # 用户 ID 12345 在 2024-09-27 在线
GETBIT user:online:2024-09-27 12345    # 获取用户 ID 12345 在该日期的在线状态
HyperLogLog

HyperLogLog 是一种概率性数据结构,主要用于估算基数(不同元素的数量),内存占用固定,适合处理大规模数据的去重和计数。

使用示例:假设要估算访问网站的独立用户数量:

redis 复制代码
PFADD unique:visitors user1 user2 user3  # 添加用户 ID
PFCOUNT unique:visitors                  # 估算独立用户数量
GEO

GEO 是 Redis 提供的一种用于存储地理位置信息的数据结构,可以存储经纬度信息并支持空间查询,例如计算距离和获取范围内的坐标。

使用示例:假设要存储城市的位置并查找距离某个城市在一定范围内的其他城市:

redis 复制代码
GEOADD cities 13.361389 38.115556 "Palermo"      # 添加城市
GEOADD cities 15.087269 37.502669 "Catania"      # 添加城市
GEODIST cities "Palermo" "Catania" "km"          # 计算两个城市之间的距离
GEORADIUS cities 15.0 37.5 100 km                # 查找指定范围内的城市
Stream

Stream 是 Redis 提供的一种日志数据结构,适合于存储时间序列数据或消息流。支持高效的消息生产和消费模式,具有持久性和序列化特性。

使用示例:假设要存储传感器数据流,可以使用 Stream 进行数据插入和消费:

redis 复制代码
XADD sensor:data * temperature 22.5 humidity 60  # 向 Stream 添加传感器数据
XRANGE sensor:data - +                           # 获取 Stream 中的所有数据
XREAD COUNT 10 STREAMS sensor:data $             # 读取新的传感器数据

Redis 9 种常见的基本数据类型应用场景汇总

  • String :缓存对象、计数器、分布式锁、分布式 session 等
  • List:阻塞队列、消息队列(但是有两个问题:1. 生产者需要自行实现全局唯一 ID;2. 不能以消费组形式消费数据)等
  • Hash:缓存对象、购物车等
  • Set:集合聚合计算(并集、交集、差集)的场景,如点赞、共同关注、收藏等
  • Zset:最典型的就是排行榜,这个也是面试中经常问到的点
  • BitMap(2.2 版新增):主要有 0 和 1 两种状态,可以用于签到统计、用户登录态判断等
  • HyperLogLog(2.8 版新增):海量数据基数统计的场景,有一定的误差,可以根据场景选择使用,常用于网页 PV、UV 的统计
  • GEO(3.2 版新增):存储地理位置信息的场景,比如说百度地图、高德地图、附近的人等
  • Stream(5.0 版新增):这个主要就是消息队列了,可以实现一个简单的消息,其相比 list 多了两个特性,分别是自动生成全局唯一消息ID以及支持以消费组形式消费数据(同一个消息可被分发给多个单消费者和消费者组),相比 pub/sub 它是可以被持久化。
相关推荐
zxrhhm5 分钟前
SQLServer限制特定数据库的CPU使用率,确保关键业务系统有足够的资源
数据库·sqlserver
夏乌_Wx16 分钟前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
刘~浪地球28 分钟前
Redis 从入门到精通(十三):哨兵与集群
数据库·redis·缓存
dyyshb1 小时前
PostgreSQL 终极兜底方案
数据库·postgresql
minji...1 小时前
Linux 线程同步与互斥(二) 线程同步,条件变量,pthread_cond_init/wait/signal/broadcast
linux·运维·开发语言·jvm·数据结构·c++
他们叫我技术总监1 小时前
零依赖!FineReport11 快速对接 TDengine 数据库:从驱动部署到报表实现
大数据·数据库·ai·tdengine
TDengine (老段)1 小时前
TDengine IDMP 可视化 —— 定时报告
大数据·数据库·人工智能·物联网·时序数据库·tdengine·涛思数据
曹牧1 小时前
Oracle:
数据库·oracle
kobel281 小时前
Linux x86快速部署openGauss3.1.1指南
数据库
一个有温度的技术博主2 小时前
Lua语法详解:从变量声明到循环遍历的避坑指南
redis·缓存·lua