【Redis】数据类型补充
一、Streams(流)
特性
- 有序消息队列:基于日志的持久化数据结构,支持多生产者、多消费者模式,保证消息的顺序性和可靠性。
- 持久化存储:消息会持久化到磁盘,支持数据恢复。
- 消费者组:多个消费者可以组成一个组,共同消费消息,避免重复处理。
- 消息回溯:支持通过索引(如时间戳)回溯历史消息。
应用场景
- 实时消息系统(如聊天记录、活动日志)。
- 微服务架构中的事件驱动通信。
- 日志采集与分析。
典型操作
命令 | 说明 |
---|---|
XADD key [NX/XX] [CHAINID] field value [field value ...] | 向流中添加新消息,NX 表示仅当键不存在时创建,XX 表示仅当键存在时添加 |
XLEN key | 获取流中消息的数量 |
XREAD STREAMS key [STREAMS ...] ID [ID ...] | 按指定 ID 读取流中的消息(单消费者模式) |
XGROUP CREATE key groupname ID [MKSTREAM] | 创建消费者组,ID 为起始消费位置(如 $ 表示最新消息) |
XREADGROUP GROUP groupname consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...] | 消费者组内的消费者读取消息(支持阻塞模式) |
XACK key groupname message-id [message-id ...] | 确认消息已处理,标记为完成 |
二、Geospatial(地理空间)
特性
- 地理位置存储:用于存储地理位置坐标(经度、纬度),支持距离计算、范围查询等操作。
- 底层实现:基于 ZSET(有序集合) 实现,每个地理位置点对应一个成员,分值为经纬度的有序排列。
- 精度控制:支持米级精度的距离计算和范围查询。
应用场景
- 附近的人、附近的商家等 LBS 功能。
- 物流轨迹追踪、地理围栏检测。
典型操作
命令 | 说明 |
---|---|
GEOADD key longitude latitude member [longitude latitude member ...] | 向键中添加地理位置点(经度、纬度、成员名) |
GEOPOS key member [member ...] | 获取成员的坐标 |
GEODIST key member1 member2 [unit] | 计算两个成员之间的距离(unit 支持 m 、km 、mi 、ft ) |
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] | 以给定坐标为中心,查询指定半径内的成员(支持返回距离、坐标等) |
GEORADIUSBYMEMBER key member radius unit [参数...] | 以指定成员为中心,查询指定半径内的成员 |
三、HyperLogLog(基数统计)
特性
- 基数估算:用于统计独立元素的数量(基数),例如统计 UV(独立访客数)。
- 内存高效:无论基数多大,每个 HyperLogLog 仅占用约 12KB 内存,牺牲一定精度换取空间效率。
- 概率算法:基于 HyperLogLog 算法,误差率约为 0.81%,适合不需要精确统计的场景。
应用场景
- 统计网站日活(UV)、月活用户数。
- 检测重复元素(如垃圾邮件 IP 地址统计)。
典型操作
命令 | 说明 |
---|---|
PFADD key element [element ...] | 向 HyperLogLog 中添加元素 |
PFCOUNT key [key ...] | 返回 HyperLogLog 的基数估算值 |
PFMERGE destkey sourcekey [sourcekey ...] | 合并多个 HyperLogLog 到目标键中 |
四、Bitmaps(位图)
特性
- 位操作:基于字符串类型实现,每个字符(8 位)对应一个二进制位,用于高效存储布尔值(0/1)。
- 内存高效:存储百万级布尔值仅需约 125KB 内存(100万位 ≈ 125KB)。
- 支持按位操作:如 AND、OR、NOT、XOR 等逻辑运算,以及统计二进制位中
1
的数量(BITCOUNT
)。
应用场景
- 用户签到系统(每日对应一个位,1 表示签到,0 表示未签到)。
- 状态标记(如用户是否在线、任务是否完成)。
- 布隆过滤器(结合多个 Bitmaps 实现去重过滤)。
典型操作
命令 | 说明 |
---|---|
SETBIT key offset value | 设置指定偏移量(offset)的位值(0 或 1) |
GETBIT key offset | 获取指定偏移量的位值 |
BITCOUNT key [start end] | 统计指定范围内(以字节为单位)1 的数量 |
BITOP operation destkey key [key ...] | 对一个或多个键执行位运算(operation 可选 AND 、OR 、NOT 、XOR ) |
五、BitFields(位域)
特性
- 精细化位操作:在 Bitmaps 的基础上,支持对二进制位进行分组(域),直接操作指定长度的位域。
- 多域操作:一个键中可定义多个位域,每个域有独立的偏移量和长度。
- 原子性:支持对多个位域进行原子性读取和修改。
应用场景
- 存储结构化的二进制数据(如协议字段、状态标志)。
- 高效压缩存储枚举值(如用户角色、状态码)。
典型操作
命令 | 说明 |
---|---|
BF.SET key field value [OVERFLOW WRAP FAIL SATURATE] | 设置指定位域的值,OVERFLOW 处理溢出策略 |
BF.GET key field | 获取指定位域的值 |
BF.INFO key | 获取键的位域定义信息 |
BF.INCRBY key field increment [OVERFLOW ...] | 对指定位域的值进行原子递增/递减 |
BF.GET_RO key [field ...] | 原子性读取多个位域的值(只读模式) |
总结
数据类型 | 核心功能 | 典型场景 | 内存特点 |
---|---|---|---|
Streams | 有序消息队列、消费者组 | 实时日志、消息系统 | 持久化,按消息量存储 |
Geospatial | 地理位置存储与查询 | LBS 服务、附近功能 | 基于 ZSET,按成员数存储 |
HyperLogLog | 基数估算(去重统计) | UV 统计、重复检测 | 固定 12KB/键,低精度 |
Bitmaps | 位级存储与统计 | 签到系统、状态标记 | 按位存储,超高效 |
BitFields | 精细化位域操作 | 结构化二进制数据、枚举压缩 | 按位域定义存储,灵活 |