redis 支持哪几种数据结构

Redis 支持多种数据结构,每种数据结构都有其特定的用途和优势。以下是 Redis 支持的主要数据结构及其特点,并附上代码示例:


1. String(字符串)

  • 特点:

    • 最基本的数据类型,可以存储字符串、整数或浮点数。

    • 最大支持 512MB 的数据。

  • 常用命令:

    • SET:设置值。

    • GET:获取值。

    • INCR:将值加 1(适用于整数)。

  • 代码示例:

    bash

    复制代码
    SET mykey "Hello"
    GET mykey  # 输出 "Hello"
    INCR counter  # 将 counter 的值加 1

2. Hash(哈希)

  • 特点:

    • 类似于字典或对象,适合存储键值对。

    • 适合存储对象的字段和值。

  • 常用命令:

    • HSET:设置字段值。

    • HGET:获取字段值。

    • HGETALL:获取所有字段和值。

  • 代码示例:

    bash

    复制代码
    HSET user:1000 name "Alice" age 30
    HGET user:1000 name  # 输出 "Alice"
    HGETALL user:1000  # 输出所有字段和值

3. List(列表)

  • 特点:

    • 有序的字符串列表,支持从两端插入或删除元素。

    • 适合实现队列、栈等数据结构。

  • 常用命令:

    • LPUSH:从左侧插入元素。

    • RPUSH:从右侧插入元素。

    • LPOP:从左侧弹出元素。

    • LRANGE:获取指定范围的元素。

  • 代码示例:

    bash

    复制代码
    LPUSH mylist "world"
    LPUSH mylist "hello"
    LRANGE mylist 0 -1  # 输出 ["hello", "world"]
    LPOP mylist  # 输出 "hello"

4. Set(集合)

  • 特点:

    • 无序且唯一的字符串集合。

    • 支持交集、并集、差集等操作。

  • 常用命令:

    • SADD:添加元素。

    • SMEMBERS:获取所有元素。

    • SINTER:计算多个集合的交集。

  • 代码示例:

    bash

    复制代码
    SADD myset "apple"
    SADD myset "banana"
    SMEMBERS myset  # 输出 ["apple", "banana"]
    SADD myset2 "banana"
    SINTER myset myset2  # 输出 ["banana"]

5. Sorted Set(有序集合)

  • 特点:

    • 类似于 Set,但每个元素关联一个分数(score),用于排序。

    • 适合实现排行榜、优先级队列等。

  • 常用命令:

    • ZADD:添加元素及其分数。

    • ZRANGE:按分数范围获取元素。

    • ZRANK:获取元素的排名。

  • 代码示例:

    bash

    复制代码
    ZADD leaderboard 100 "Alice"
    ZADD leaderboard 200 "Bob"
    ZRANGE leaderboard 0 -1 WITHSCORES  # 输出 ["Alice", "100", "Bob", "200"]
    ZRANK leaderboard "Bob"  # 输出 1(排名从 0 开始)

6. HyperLogLog(基数统计)

  • 特点:

    • 用于统计唯一元素的数量,占用固定内存(12KB)。

    • 适合统计大规模数据的基数(如 UV 统计)。

  • 常用命令:

    • PFADD:添加元素。

    • PFCOUNT:统计基数。

    • PFMERGE:合并多个 HyperLogLog。

  • 代码示例:

    bash

    PFADD visitors "user1" "user2" "user3" PFCOUNT visitors # 输出 3 PFADD visitors2 "user3" "user4" PFMERGE all_visitors visitors visitors2 PFCOUNT all_visitors # 输出 4


7. Bitmap(位图)

  • 特点:

    • 使用字符串的位操作,适合存储布尔值或标志位。

    • 适合实现签到、用户在线状态等功能。

  • 常用命令:

    • SETBIT:设置某一位的值。

    • GETBIT:获取某一位的值。

    • BITCOUNT:统计值为 1 的位数。

  • 代码示例:

    bash

    复制代码
    SETBIT mybitmap 1 1
    SETBIT mybitmap 2 1
    GETBIT mybitmap 1  # 输出 1
    BITCOUNT mybitmap  # 输出 2

8. Geospatial(地理空间)

  • 特点:

    • 存储地理位置(经纬度),支持计算距离、范围查询等。

    • 适合实现附近的人、地点搜索等功能。

  • 常用命令:

    • GEOADD:添加地理位置。

    • GEODIST:计算两个位置的距离。

    • GEORADIUS:查询指定范围内的位置。

  • 代码示例:

    bash

    复制代码
    GEOADD cities 116.397128 39.916527 "Beijing"
    GEOADD cities 121.473701 31.230416 "Shanghai"
    GEODIST cities Beijing Shanghai km  # 输出两地距离(单位:公里)
    GEORADIUS cities 116 39 1000 km  # 查询北京 1000 公里范围内的城市

9. Stream(流)

  • 特点:

    • 类似于消息队列,支持多消费者组。

    • 适合实现日志收集、事件驱动等场景。

  • 常用命令:

    • XADD:添加消息。

    • XREAD:读取消息。

    • XGROUP:创建消费者组。

  • 代码示例:

    bash

    复制代码
    XADD mystream * name "Alice" age 30
    XREAD COUNT 1 STREAMS mystream 0
    XGROUP CREATE mystream mygroup 0

10. 总结

数据结构 特点 适用场景
String 存储字符串、整数或浮点数 缓存、计数器
Hash 存储键值对 对象存储
List 有序列表,支持两端操作 队列、栈
Set 无序且唯一的集合 标签、去重
Sorted Set 有序集合,支持按分数排序 排行榜、优先级队列
HyperLogLog 基数统计,占用固定内存 UV 统计
Bitmap 位操作,适合布尔值或标志位 签到、用户在线状态
Geospatial 存储地理位置,支持距离计算和范围查询 附近的人、地点搜索
Stream 类似于消息队列,支持多消费者组 日志收集、事件驱动
相关推荐
vvilkim34 分钟前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
虹科网络安全4 小时前
Search on Flex:用分层存储承载更大规模的 Redis 搜索索引
经验分享·redis·艾体宝·艾体宝it
数据库急诊室_阿哲4 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋4 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子5 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
阿卡好可爱5 小时前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
Joy T6 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡6 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata6 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__6 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构