DukeDuke
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
主页
项目文档
技术文档
  • 单机版
  • 微服务
  • 代办项目
  • 优鲜项目
项目管理
关于我们
  • 技术文档

    • 网络原理

      • 交换机
      • 路由器
      • TCP/IP协议
      • HTTP 与 HTTPS
    • 软件架构

      • 什么是软件架构
      • 分层架构
      • 微服务架构
      • 事件驱动架构
      • 领域驱动设计(DDD)
      • 架构图
      • 高并发系统
    • Vue3

      • Vue3简介
      • Vue3响应式系统
      • Vue3组合式API
      • Vue3生命周期
      • Vue3模板语法
      • Vue3组件系统
      • Vue3 路由系统
      • Vue3 状态管理
      • Vue3 性能优化
      • Vue3 TypeScript 支持
      • Vue3 项目实战
      • VUE 面试题大全
      • Node.js 安装
    • JAVA

      • JVM

        • 认识JVM
        • JVM类加载器
        • 运行时数据区
        • 执行引擎
        • 本地方法接口
        • 本地方法库
        • JVM垃圾回收
        • JVM性能监控
        • JVM调优
      • 设计模式
        • 单例模式
        • 工厂模式
        • 策略模式
        • 适配器模式
        • 建造者模式
        • 原型模式
        • 装饰器模式
        • 代理模式
        • 外观模式
        • 享元模式
        • 组合模式
        • 桥接模式
      • Java多线程

        • Java 线程基础详解
        • Java 线程池详解
        • Java ThreadLocal 详解
        • Java volatile 详解
        • Java 线程间通信详解
        • Java 线程安全详解
        • Java 线程调度详解
        • Java 线程优先级详解

        • Java 线程中断详解
        • Java 线程死锁详解
      • Java反射
      • Java 面试题

        • Java 基础概念面试题
        • Java 面向对象编程面试题
        • Java 集合框架面试题
        • Java 多线程与并发面试题
        • JVM 与内存管理面试题
        • Java I/O 与 NIO 面试题
        • Java 异常处理面试题
        • Java 反射与注解面试题
        • Java Spring 框架面试题
        • Java 数据库与 JDBC 面试题
        • Java 性能优化面试题
        • Java 实际项目经验面试题
        • Java 高级特性面试题
        • Java 面试准备建议
    • Python

      • Python简介
      • Python安装
      • Python hello world
      • Python基础语法
      • Python数据类型
      • Python数字
      • Python字符串
      • Python列表
      • Python元组
      • Python字典
      • Python日期时间
      • Python文件操作
      • Python异常处理
      • Python函数
      • Python类
      • Python模块
      • Python包
      • Python多线程
      • Python面向对象
      • Python爬虫
      • Django web框架
      • Python 面试题

        • Python 面试题导航
        • Python 基础概念
        • Python 面向对象编程
        • Python 数据结构
        • Python 高级特性
        • Python 框架
        • Python 性能优化
        • Python 项目经验
    • Spring

      • Spring
      • Springboot
      • Spring Security 安全框架
      • SpringBoot 中的事件详解
      • SpringBoot 中的定时任务详解
      • SpringBoot 自动装配原理与源码解释
    • Mybatis

      • Mybatis
      • Mybatis-Plus
    • 数据库

      • Redis

        • Redis简介
        • Redis(单机)安装
        • Redis配置
        • Redis数据结构
        • RDB、AOF 和混合持久化机制
        • Redis内存管理
        • Redis缓存一致性
        • Redis缓存穿透
        • Redis缓存击穿
        • Redis缓存雪崩
        • Redis Lua脚本
        • Redis主从复制
        • Redis哨兵模式
        • Redis集群
        • Redis数据分片
        • Redis CPU使用率过高
        • Redis面试题
      • MySQL

        • MySQL简介
        • MySQL安装
        • MySQL配置
        • MYSQL日常维护
        • MYSQL优化-慢查询
        • MYSQL优化-索引
        • MYSQL数据库设计规范
    • 消息队列

      • RocketMQ
      • Kafka
      • RabbitMQ
      • 消息队列面试题
    • 微服务

      • SpringCloud 微服务
      • Eureka 注册中心
      • Nacos 注册中心
      • Gateway 网关
      • Feign 服务调用
      • Sentinel 限流 与 熔断
      • Seata 分布式事务
      • CAP 理论
      • Redis 分布式锁
      • 高并发系统设计
    • ELK日志分析系统

      • Elasticsearch 搜索引擎
      • Logstash 数据处理
      • Kibana 可视化
      • ELK 实战
    • 开放API

      • 开放API设计
      • 开放API示例项目
    • 人工智能

      • 人工智能简介
      • 机器学习

      • 深度学习

      • 自然语言处理

      • 计算机视觉

        • CUDA与cuDNN详细安装
        • Conda 安装
        • Pytorch 深度学习框架
        • yolo 目标检测
        • TensorRT 深度学习推理优化引擎
        • TensorFlow 机器学习
        • CVAT 图像标注
        • Windows 下安装 CUDA、cuDNN、TensorRT、TensorRT-YOLO 环境
        • Windows10+CUDA+cuDNN+TensorRT+TensorRT-YOLO 部署高性能YOLO11推理
    • 大数据

      • 大数据简介
      • Hadoop 数据存储
      • Flume 数据采集
      • Sqoop 数据导入导出
      • Hive 数据仓库
      • Spark 数据处理
      • Flink 数据处理
      • Kafka 数据采集
      • HBase 数据存储
      • Elasticsearch 搜索引擎
    • 图像处理

      • 图像处理简介
      • 医学图像web呈现
      • 医学图像处理
      • 切片细胞分离问题
    • 服务器&运维

      • Linux 系统

        • Linux 系统管理
        • Linux 网络管理
        • Linux 文件管理
        • Linux 命令大全
      • Nginx Web 服务器

        • Nginx 安装 与 配置
        • Nginx 负载均衡
        • Nginx SSL证书配置
        • Nginx Keepalived 高可用
      • Docker 容器

        • Docker 简介
        • Docker 安装与配置
        • Docker 命令
        • Docker 部署 Nginx
        • Docker 部署 MySQL
        • Docker 部署 Redis
      • 服务器

        • 塔式服务器
        • 机架式服务器
        • 刀片服务器
      • Git 版本控制
      • Jenkins 持续集成
      • Jmeter 性能测试
      • Let's Encrypt 免费SSL证书
    • 简历

      • 项目经理简历
      • 开发工程师简历

Redis 数据结构详解

Redis 支持多种数据结构,每种数据结构都有其特定的用途和优势。本文档详细介绍 Redis 的各种数据结构及其应用场景。

目录

  • 基本数据结构
    • String(字符串)
    • Hash(哈希)
    • List(列表)
    • Set(集合)
    • Sorted Set(有序集合)
  • 高级数据结构
    • Bitmap(位图)
    • HyperLogLog(基数统计)
    • GEO(地理信息)
    • Stream(流)
  • 数据结构选择指南
  • 性能对比
  • 最佳实践

基本数据结构

String(字符串)

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

特点

  • 最大存储 512MB
  • 二进制安全
  • 支持原子性操作
  • 时间复杂度 O(1)

常用命令

# 基本操作
SET key value [EX seconds] [PX milliseconds] [NX|XX]
GET key
MSET key value [key value ...]
MGET key [key ...]

# 数值操作
INCR key
INCRBY key increment
DECR key
DECRBY key decrement

# 字符串操作
APPEND key value
STRLEN key
GETRANGE key start end
SETRANGE key offset value

应用场景

  • 缓存数据
  • 计数器
  • 分布式锁
  • 会话存储
  • 简单键值存储

示例

# 缓存用户信息
SET user:1001:profile '{"name":"张三","age":25}' EX 3600

# 页面访问计数
INCR page:views:homepage

# 分布式锁
SET lock:resource "locked" NX EX 30

Hash(哈希)

Hash 是一个键值对集合,适合存储对象属性。

特点

  • 每个 Hash 可存储 2^32 - 1 个键值对
  • 字段名和值都是字符串
  • 支持部分字段操作
  • 内存效率高

常用命令

# 基本操作
HSET key field value [field value ...]
HGET key field
HMSET key field value [field value ...]
HMGET key field [field ...]
HGETALL key

# 字段管理
HDEL key field [field ...]
HEXISTS key field
HKEYS key
HVALS key
HLEN key

# 数值操作
HINCRBY key field increment
HINCRBYFLOAT key field increment

应用场景

  • 存储对象属性
  • 用户配置
  • 购物车
  • 配置管理

示例

# 存储用户信息
HSET user:1001 name "张三" age 25 email "zhangsan@example.com"

# 获取用户信息
HGET user:1001 name
HMGET user:1001 name age email

# 用户积分
HINCRBY user:1001 points 100

List(列表)

List 是一个双向链表,支持在两端进行插入和删除操作。

特点

  • 有序集合
  • 支持重复元素
  • 双向操作
  • 最大长度 2^32 - 1

常用命令

# 基本操作
LPUSH key element [element ...]
RPUSH key element [element ...]
LPOP key [count]
RPOP key [count]
LRANGE key start stop

# 列表管理
LLEN key
LINDEX key index
LINSERT key BEFORE|AFTER pivot element
LREM key count element
LSET key index element
LTRIM key start stop

应用场景

  • 消息队列
  • 任务队列
  • 最新列表
  • 栈和队列实现

示例

# 消息队列
LPUSH task:queue "task1" "task2" "task3"
RPOP task:queue

# 最新文章列表
LPUSH articles:latest "article1" "article2"
LRANGE articles:latest 0 9

# 用户行为记录
LPUSH user:1001:actions "login" "view_page" "purchase"

Set(集合)

Set 是一个无序的唯一元素集合。

特点

  • 元素唯一
  • 无序存储
  • 支持集合运算
  • 最大成员数 2^32 - 1

常用命令

# 基本操作
SADD key member [member ...]
SREM key member [member ...]
SMEMBERS key
SISMEMBER key member
SCARD key

# 集合运算
SINTER key [key ...]
SUNION key [key ...]
SDIFF key [key ...]
SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
SDIFFSTORE destination key [key ...]

# 随机操作
SRANDMEMBER key [count]
SPOP key [count]

应用场景

  • 标签系统
  • 好友关系
  • 去重统计
  • 权限管理

示例

# 标签系统
SADD article:123:tags "redis" "database" "nosql"
SADD user:1001:interests "programming" "music" "travel"

# 好友关系
SADD user:1001:friends "user:1002" "user:1003"
SINTER user:1001:friends user:1002:friends

# 去重统计
SADD unique:visitors "192.168.1.1" "192.168.1.2"

Sorted Set(有序集合)

Sorted Set 是一个有序的唯一元素集合,每个元素都有一个分数。

特点

  • 元素唯一
  • 按分数排序
  • 支持范围查询
  • 最大成员数 2^32 - 1

常用命令

# 基本操作
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
ZREM key member [member ...]
ZSCORE key member
ZRANK key member
ZREVRANK key member

# 范围查询
ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]

# 统计操作
ZCARD key
ZCOUNT key min max
ZLEXCOUNT key min max

# 集合运算
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]

应用场景

  • 排行榜
  • 优先级队列
  • 范围查询
  • 时间线

示例

# 游戏排行榜
ZADD leaderboard 100 "player1" 200 "player2" 150 "player3"
ZREVRANGE leaderboard 0 9 WITHSCORES

# 优先级任务队列
ZADD tasks 1 "low_priority_task" 5 "high_priority_task" 3 "medium_priority_task"
ZRANGE tasks 0 -1

# 时间线
ZADD timeline 1640995200 "event1" 1640995300 "event2"
ZRANGEBYSCORE timeline 1640995200 1640995400

高级数据结构

Bitmap(位图)

Bitmap 是基于 String 类型的位操作,每个位只能是 0 或 1。

特点

  • 基于 String 类型
  • 位级操作
  • 内存效率极高
  • 支持位运算

常用命令

# 位操作
SETBIT key offset value
GETBIT key offset
BITCOUNT key [start end]
BITPOS key bit [start] [end]

# 位运算
BITOP AND destkey key [key ...]
BITOP OR destkey key [key ...]
BITOP XOR destkey key [key ...]
BITOP NOT destkey key

应用场景

  • 用户签到
  • 在线状态
  • 布隆过滤器
  • 大数据统计

示例

# 用户签到统计
SETBIT user:signin:2024:01:01 1001 1
SETBIT user:signin:2024:01:01 1002 1
BITCOUNT user:signin:2024:01:01

# 在线用户统计
SETBIT online:users 1001 1
GETBIT online:users 1001

HyperLogLog(基数统计)

HyperLogLog 是一种概率数据结构,用于估算集合的基数。

特点

  • 固定内存使用(12KB)
  • 误差率约 0.81%
  • 支持合并操作
  • 只支持添加和计数

常用命令

# 基本操作
PFADD key element [element ...]
PFCOUNT key [key ...]
PFMERGE destkey sourcekey [sourcekey ...]

应用场景

  • 独立访客统计
  • 去重计数
  • 大数据分析
  • 实时统计

示例

# 页面独立访客统计
PFADD page:home:visitors "user1" "user2" "user3"
PFADD page:home:visitors "user2" "user4" "user5"
PFCOUNT page:home:visitors

# 合并多个页面的访客统计
PFMERGE total:visitors page:home:visitors page:about:visitors

GEO(地理信息)

GEO 用于存储和查询地理位置信息。

特点

  • 基于 Sorted Set 实现
  • 支持距离计算
  • 支持范围查询
  • 使用 WGS84 坐标系

常用命令

# 地理位置操作
GEOADD key longitude latitude member [longitude latitude member ...]
GEOPOS key member [member ...]
GEODIST key member1 member2 [unit]
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]
GEORADIUSBYMEMBER key member radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]
GEOHASH key member [member ...]

应用场景

  • 附近的人
  • 位置服务
  • 地理围栏
  • 距离计算

示例

# 添加城市坐标
GEOADD cities 116.3974 39.9093 "北京" 121.4737 31.2304 "上海"

# 计算距离
GEODIST cities "北京" "上海" km

# 查找附近城市
GEORADIUS cities 116.4 39.9 500 km WITHCOORD WITHDIST

Stream(流)

Stream 是 Redis 5.0 引入的数据类型,用于处理流数据。

特点

  • 有序的日志数据结构
  • 支持消费者组
  • 持久化存储
  • 支持范围查询

常用命令

# 流操作
XADD key ID field value [field value ...]
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
XRANGE key start end [COUNT count]
XREVRANGE key end start [COUNT count]

# 消费者组操作
XGROUP CREATE key groupname id-or-$ [MKSTREAM]
XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
XACK key group ID [ID ...]

应用场景

  • 消息队列
  • 事件溯源
  • 日志收集
  • 实时数据处理

示例

# 添加消息到流
XADD events * user_id 1001 action login timestamp 1640995200

# 创建消费者组
XGROUP CREATE events processors $ MKSTREAM

# 消费消息
XREADGROUP GROUP processors consumer1 COUNT 1 STREAMS events >

数据结构选择指南

根据使用场景选择

场景推荐数据结构原因
简单缓存String简单高效
对象存储Hash结构化存储
队列List有序操作
去重Set自动去重
排行榜Sorted Set有序且唯一
签到统计Bitmap内存效率高
独立访客HyperLogLog固定内存
地理位置GEO专业地理功能
消息流Stream流式处理

根据操作类型选择

操作类型推荐数据结构说明
简单读写StringO(1) 复杂度
部分更新Hash字段级操作
有序插入List双向链表
集合运算Set内置运算
范围查询Sorted Set分数排序
位操作Bitmap位级操作
基数统计HyperLogLog概率统计
地理查询GEO地理计算

性能对比

内存使用效率

数据结构内存效率说明
String中等简单存储
Hash高字段共享
List低链表开销
Set中等哈希表
Sorted Set低跳表+哈希表
Bitmap极高位级存储
HyperLogLog极高固定 12KB
GEO低基于 Sorted Set

操作复杂度

操作StringHashListSetSorted Set
插入O(1)O(1)O(1)O(1)O(log N)
查询O(1)O(1)O(N)O(1)O(log N)
删除O(1)O(1)O(N)O(1)O(log N)
范围查询O(N)O(N)O(N)O(N)O(log N+M)

最佳实践

1. 数据结构选择原则

  • 简单优先:能用简单数据结构解决的不用复杂的
  • 内存效率:考虑内存使用,选择合适的数据结构
  • 操作复杂度:根据操作频率选择复杂度合适的数据结构
  • 业务需求:根据具体业务场景选择最合适的数据结构

2. 性能优化建议

  • 避免大对象:单个键值不要过大
  • 合理使用过期时间:避免内存泄漏
  • 批量操作:使用 MGET、MSET 等批量命令
  • 管道操作:使用 Pipeline 减少网络往返

3. 内存优化技巧

  • 使用 Hash 存储对象:比多个 String 键更节省内存
  • 使用 Bitmap 进行统计:内存效率极高
  • 合理设置过期时间:避免数据堆积
  • 使用 HyperLogLog 进行基数统计:固定内存使用

4. 常见陷阱

  • List 长度限制:注意 List 的最大长度
  • Set 内存使用:大 Set 会消耗大量内存
  • Sorted Set 分数精度:注意浮点数精度问题
  • Bitmap 偏移量:注意偏移量的范围限制

5. 监控和维护

  • 监控内存使用:定期检查内存使用情况
  • 监控键数量:避免键数量过多
  • 定期清理:清理过期和无用的数据
  • 性能监控:监控各种操作的性能指标

总结

Redis 提供了丰富的数据结构,每种都有其特定的用途和优势。选择合适的数据结构对于构建高性能的 Redis 应用至关重要。在实际使用中,应该:

  1. 根据业务需求选择最合适的数据结构
  2. 考虑内存使用和操作复杂度
  3. 遵循最佳实践,避免常见陷阱
  4. 定期监控和维护 Redis 实例

通过合理使用这些数据结构,可以构建出高效、可扩展的 Redis 应用系统。

最近更新:: 2025/10/9 08:31
Contributors: Duke
Prev
Redis配置
Next
RDB、AOF 和混合持久化机制