跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言java算法

Redis Hash 与 List 实战:数据结构、指令与场景优化

Redis Hash 结构适合存储对象属性,支持字段级原子操作;List 结构基于双端队列,常用于消息队列与分页查询。核心指令、内部编码机制(ziplist/quicklist)及实际应用场景,帮助理解内存权衡与性能优化策略。

乱七八糟发布于 2026/3/27更新于 2026/9/1157 浏览
Redis Hash 与 List 实战:数据结构、指令与场景优化

Redis 哈希(Hash)

核心概念

Hash 结构对应 key-hash 关系,内部是 field-value 对。它非常适合存储对象属性,比如用户信息 user:1000 包含 name、age 等字段。

相比 String 存 JSON,Hash 在修改单个字段时效率更高,无需反序列化整个对象。例如修改年龄,直接操作 field 即可,避免了整体解析再写入的开销。

基础操作指令

HSET:设置字段值。支持一次设置多个字段(Redis 4.0+),时间复杂度 O(1)。

HSET user:1000 name "Alice" age 30 email "[email protected]"

注意:若字段已存在会被覆盖。

HGET:获取指定字段值。不存在返回 nil。

HGET user:1000 name

HDEL:删除一个或多个字段。返回实际删除的数量。

HDEL user:1000 age

HEXISTS:检查字段是否存在,O(1) 复杂度。

HEXISTS user:1000 name

HSETNX:仅当字段不存在时设置,原子操作。返回 1 表示成功,0 表示已存在。

HSETNX user:1000 gender "female"

批量与统计

HMSET:批量设置字段。Redis 4.0+ 后推荐直接用 HSET 替代,功能一致但更通用。

HMGET:批量获取字段值。按请求顺序返回列表,缺失字段返回 nil。

HMGET user:1000 name email

HGETALL:获取所有字段和值。大数据量时可能阻塞 Redis,建议用 HSCAN 替代。

HGETALL user:1000

HKEYS / HVALS / HLEN:分别获取所有字段名、所有值及字段数量。HLEN 为 O(1),适合快速检查规模。

HSTRLEN:获取字段值的字符串长度。

数值操作

HINCRBY:整数自增。支持负数增量。

HINCRBY stats:2023 page_views 1

HINCRBYFLOAT:浮点数自增。注意 IEEE 754 精度问题,建议客户端处理舍入。

高级遍历

HSCAN:增量迭代哈希表。解决 HGETALL 阻塞问题,适合大 Key 场景。

HSCAN user:1000 0 MATCH n* COUNT 10

参数说明:游标从 0 开始,MATCH 用于模式匹配,COUNT 控制单次返回数量。

编码与优化

Redis 底层会根据数据大小自动选择编码:

  • ziplist:小 Hash(字段少、值小)使用紧凑存储,节省内存。
  • hashtable:超过阈值(由 hash-max-ziplist-entries 等配置控制)自动转为哈希表,查询更快但内存占用高。
  • 最佳实践:

    1. 避免 HGETALL,改用 HSCAN 分批获取。
    2. 冷数据优先压缩,热数据优先性能。
    3. 频繁更新字段可用 HINCRBY 聚合计数。

    Redis 列表(List)

    核心特性

    List 是双端队列(deque),有序且支持两端插入弹出。最多存储 2³² - 1 个元素。内部编码随版本演进,现代 Redis 默认使用 Quicklist(多个 ziplist 连接)。

    常见指令

    LPUSH / RPUSH:左侧或右侧插入元素。支持批量插入,O(1) 复杂度。

    LPUSH tasks "task1" "task2"
    RPUSH messages "hello" "world"
    

    常用于实现栈(后进先出)或队列(先进先出)。

    LPOP / RPOP:左侧或右侧弹出元素。Redis 6.2+ 支持 count 参数批量弹出。

    LPOP tasks 2
    RPOP messages 3
    

    空列表返回 nil。

    BLPOP / BRPOP:阻塞式弹出。若列表为空则等待指定时间(timeout),超时返回 nil。适合生产者 - 消费者模型。

    BLPOP tasks 5
    

    注意:多个 key 时从左到右查找,任一非空即返回;超时单位为秒(Redis 6 支持小数)。

    LLEN:获取列表长度,O(1)。

    LINDEX:通过索引取值。支持负数索引(-1 为最后一个)。

    LRANGE:获取指定范围元素(闭区间)。常用于分页,如 LRANGE user:1:mblogs 0 9 取前 10 条。

    LINSERT:在指定元素前后插入。语法 LINSERT key BEFORE|AFTER pivot value。

    LPUSHX / RPUSHX:仅当 key 存在且为 List 类型时才插入,否则返回 0。

    LREM:移除匹配元素。count 正数从左删,负数从右删,0 表示全部移除。

    LTRIM:修剪列表,保留指定范围,删除其余部分。常用于限制列表长度,如只保留最新 100 条。

    LSET:修改指定索引位置的元素。

    应用场景

    消息队列: 利用 LPUSH + BRPOP 实现阻塞队列。生产者推入任务,消费者阻塞等待。多消费者可公平轮询,避免空轮询消耗 CPU。

    分频道队列: 不同业务通道使用不同 key,解耦风险。例如弹幕、点赞、视频流分开存储,互不影响。

    微博 Timeline:

    1. 微博内容存 Hash(title, content, timestamp)。
    2. 用户时间线存 List(存储微博 ID),LPUSH 保证倒序。
    3. 分页用 LRANGE 获取 ID 列表,配合 Pipeline 批量获取详情。

    小结

    Hash 适合对象属性存储,支持字段级操作;List 基于双端队列,擅长队列、栈及分页。合理选择编码(ziplist/quicklist)与命令组合,能显著提升内存效率与读写性能。

    目录

    1. Redis 哈希(Hash)
    2. 核心概念
    3. 基础操作指令
    4. 批量与统计
    5. 数值操作
    6. 高级遍历
    7. 编码与优化
    8. Redis 列表(List)
    9. 核心特性
    10. 常见指令
    11. 应用场景
    12. 小结

    更多推荐文章

    查看全部
    • MinIO 分布式对象存储介绍及与 SeaweedFS 对比
    • AI 小说生成器本地部署与配置指南
    • 开箱即用的 AI 写作工具:蛙蛙写作 AI 功能介绍
    • IDEA 中 AI 编程插件对比:Copilot、TRAE、灵码实测
    • 前端数据库 IndexedDB 详解:构建离线 Web 应用
    • AIGC 人脸资产标准化生产方案:Face3D.ai 技术实践
    • 数据结构:查找算法与二叉排序树详解
    • Z-Image:无需登录、无需注册的免费AI图像生成工具深度评测
    • C# 业务异常处理:BusException 类设计与使用
    • AM32 无人机电调源码架构与工作原理解析
    • Spring AOP 核心原理与实战指南
    • ChatGPT 记忆功能详解:使用、管理与隐私保护
    • 使用 Ollama 本地部署 Llama 3.1 大模型完整指南
    • OpenHarmony 4.0 RK3566 基于 RKNN 服务化架构的 YOLO11 推理实践
    • ROS C++ 程序编译与运行流程
    • Xilinx FPGA 使用 LVDS 的电源与电平指南
    • Linux 基础开发工具(中):GCC 编译与 Make 构建详解
    • FPGA 实时图像处理指南:流水线架构与系统优化
    • CentOS 系统定时执行 Python 邮件发送任务的五种方案
    • 数据结构:图的存储结构与核心算法解析

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online