# Redis哈希(Hash)
概念
Redis哈希(Hash)是一个键值对集合,用于存储字段-值(field-value)的映射结构,类似于编程语言中的 字典 或 JSON 对象。每个哈希可以存储数十亿个字段,适合存储对象类数据。
# 作用
结构化存储:将多个关联字段整合为一个逻辑单元(如用户信息、商品属性)。
高效操作:支持单个字段或批量操作,减少网络开销。
原子性:保证数据操作的原子性(如 HINCRBY 实现计数器)。
# 特性
核心特性包括:
字段唯一性:同一哈希中字段名唯一,重复写入会覆盖旧值。
高效查询:直接通过字段名访问值,时间复杂度 O(1)。
内存优化:底层使用 ziplist(小数据)或 hashtable(大数据)动态优化存储结构。
批量操作:支持
HMSET
、HMGET
等批量操作命令。
# 场景
用户信息存储:存储用户 ID 对应的姓名、邮箱、地址等字段。
商品属性管理:记录商品的名称、价格、库存等信息。
配置参数缓存:集中管理系统的动态配置参数。
计数器组合:通过 HINCRBY 实现多维度统计(如点赞数、阅读数)。
# 示例
# 1.批量设置字段
创建一个名为user的哈希,并一次性设置名称为feixiang,网站为feixiang.net,城市为guangzhou:
127.0.0.1:6379> HMSET user name feixiang web feixiang.net city guangzhou
OK
作用:一次性设置多个字段值,减少网络请求次数。
# 2.获取特定值
127.0.0.1:6379> HGET user name # 获取名称为user,键为name的哈希值
"feixiang"
# 3.批量获取字段值
127.0.0.1:6379> HMGET user name web city
1) "feixiang"
2) "feixiang.net"
3) "guangzhou"
作用:高效获取多个字段值,避免多次请求。
# 4.获取所有字段名
127.0.0.1:6379> HKEYS user
1) "name"
2) "web"
3) "city"
作用:快速查看哈希的所有字段列表。
# 5.获取所有字段和值
127.0.0.1:6379> HGETALL user
1) "name"
2) "feixiang"
3) "web"
4) "feixiang.net"
5) "city"
6) "guangzhou"
作用:完整导出哈希结构,适合数据迁移或全量展示。
# 6.检查字段是否存在
127.0.0.1:6379> HEXISTS user web
(integer) 1 # 存在返回 1
127.0.0.1:6379> HEXISTS user age
(integer) 0 # 不存在返回 0
作用:验证字段是否存在,避免无效操作。
# 7.删除指定字段
127.0.0.1:6379> HDEL user city
(integer) 1 # 删除成功返回 1
127.0.0.1:6379> HGET user city
(nil) # 字段已删除
127.0.0.1:6379> HDEL user age
(integer) 0 # 删除失败返回 0(因为不存在)
# 8.新增或修改字段
新增用户工作为程序员,修改用户城市为深圳:
127.0.0.1:6379> HSET user job programmer
(integer) 1 # 新增字段返回 1
127.0.0.1:6379> HSET user city shenzhen
(integer) 0 # 修改字段返回 0(覆盖旧值)
# 对比
Redis哈希(Hash)与字符串(String)的核心区别:
# 1.数据结构差异
特性 | Hash | String |
---|---|---|
存储形式 | 嵌套键值对(key: {field1: value1, field2: value2...} ) | 单一键值对(key: value ) |
底层实现 | 小数据用 ziplist,大数据用 hashtable | 简单动态字符串(SDS) |
操作粒度 | 支持字段级操作(如 HGET /HSET ) | 只能整体操作(如 GET /SET ) |
# 2. 操作效率与场景
场景 | Hash | String |
---|---|---|
批量读写 | 支持 HMSET/HMGET(单次操作) | 需要多次 GET/SET(高网络开销) |
原子性操作 | 字段级原子操作(如 HINCRBY) | 单个操作原子(如 INCR) |
内存占用 | 字段共享键的元数据(更紧凑) | 每个键独立存储元数据(高开销) |
# 命令集
在 Redis 客户端(如 redis-cli )可以通过help @hash
命令查找所有与哈希相关的命令,效果如下:
127.0.0.1:6379> help @hash
HDEL key field [field ...]
summary: Delete one or more hash fields
since: 2.0.0
HEXISTS key field
summary: Determine if a hash field exists
since: 2.0.0
HGET key field
summary: Get the value of a hash field
since: 2.0.0
……
以下是 Redis-x64-3.0.504 版本的哈希命令集:
命令 | 说明 | 版本 |
---|---|---|
HDEL key field [field ...] | 删除一个或多个哈希字段 | 2.0.0+ |
HEXISTS key field | 判断哈希字段是否存在 | 2.0.0+ |
HGET key field | 获取哈希字段的值 | 2.0.0+ |
HGETALL key | 获取哈希中所有字段和值 | 2.0.0+ |
HINCRBY key field increment | 将哈希字段的整数值增加指定数字 | 2.0.0+ |
HINCRBYFLOAT key field increment | 将哈希字段的浮点数值增加指定数量 | 2.6.0+ |
HKEYS key | 获取哈希中所有字段 | 2.0.0+ |
HLEN key | 获取哈希中字段数量 | 2.0.0+ |
HMGET key field [field ...] | 获取所有给定哈希字段的值 | 2.0.0+ |
HMSET key field value [field value ...] | 设置多个哈希字段为多个值 | 2.0.0+ |
HSCAN key cursor [MATCH pattern] [COUNT count] | 增量迭代哈希字段及其关联值 | 2.8.0+ |
HSET key field value | 设置哈希字段的字符串值 | 2.0.0+ |
HSETNX key field value | 仅在字段不存在时设置哈希字段的值 | 2.0.0+ |
HVALS key | 获取哈希中所有值 | 2.0.0+ |

微信公众号

QQ交流群
原创网站开发,偏差难以避免。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。