Redis哈希结构场景

Redis哈希结构场景

引言

Redis Hash(哈希)适合存储对象类数据,类似数据库单行记录。相比把对象序列化为JSON字符串存储,Hash可以单独读写某个字段,不用整体读取修改,适合用户资料、商品基础信息这类场景。

Hash基础命令

# 设置单个字段
HSET user:100 name "test" age 20

# 获取单个字段
HGET user:100 name

# 获取全部字段
HGETALL user:100

# 删除字段
HDEL user:100 age

PHP操作示例

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
$key = 'user:100';
$redis->hMSet($key,[
    'name'=>'admin',
    'phone'=>'13800138000'
]);
$info = $redis->hGetAll($key);
print_r($info);

适用与不适用场景

✅ 适合:用户资料、商品基础属性,需要局部更新字段

❌ 不适合:字段数量超大、海量对象;大量独立统计计数,推荐单独key

注意事项

Redis Hash有底层ziplist编码,字段少、值小的时候内存占用极低。当字段数量或者value超过阈值,会转为hash表,内存占用上升。不要在单个hash里面存放成千上万的字段。

总结

Hash是Redis高频数据结构,适合存储结构化小对象,可以局部读写字段,避免JSON字符串每次全量读写。根据业务字段数量合理选择,不要滥用。


emer 发布于  2026-10-18 07:17 

Redis 常用数据类型

Redis 常用数据类型

Redis 不只是简单的 key-value,有5种常用数据类型,每种适合不同场景。

1. String(字符串)

最基础的类型,存字符串、数字都可以。

# 设置
set name "张三"

# 获取
get name

# 自增
incr age

# 设置过期时间
set token "abc" ex 3600

适用场景: 缓存、计数器、Session。

2. Hash(哈希)

存对象,比如用户信息。

# 设置单个字段
hset user:1 name "张三"

# 获取单个字段
hget user:1 name

# 设置多个字段
hmset user:1 name "张三" age 20 city "北京"

# 获取所有字段
hgetall user:1

适用场景: 存储对象(用户信息、商品信息)。

3. List(列表)

有序列表,可以做消息队列。

# 左侧添加
lpush list "a" "b" "c"

# 右侧添加
rpush list "d"

# 左侧弹出
lpop list

# 查看范围
lrange list 0 -1

适用场景: 消息队列、最新列表。

4. Set(集合)

无序,不重复,做去重。

# 添加
sadd set "a" "b" "c"

# 查看所有
smembers set

# 判断是否存在
sismember set "a"

# 交集
sinter set1 set2

适用场景: 去重、共同好友、标签。

5. ZSet(有序集合)

有序,带分数排序。

# 添加
zadd rank 100 "张三" 90 "李四" 80 "王五"

# 查看排名(从高到低)
zrevrank rank "张三"

# 查看分数
zscore rank "张三"

# 查看排行榜
zrevrange rank 0 9

适用场景: 排行榜、分数排序。

总结

Redis 5种数据类型:

  • String:缓存、计数器
  • Hash:存对象
  • List:消息队列
  • Set:去重、标签
  • ZSet:排行榜

根据场景选对数据类型,用起来才高效。


emer 发布于  2026-10-8 07:29 

Redis 数据结构:五种常用类型和应用场景实战

前言

Redis 不只是简单的缓存,它有 5 种常用数据结构,每种都有特定的应用场景。用对了能解决很多问题,用错了就是浪费内存。本文讲清楚这 5 种数据结构。

一、String(字符串)

是什么

最简单的 key-value 结构,value 可以是字符串、数字、二进制。

常用命令

# 设置值
SET name "张三"

# 获取值
GET name

# 数字自增
INCR count
INCRBY count 10

# 设置过期时间
SETEX session:token 3600 "abc123"

# 批量操作
MSET name "张三" age 18 city "北京"
MGET name age city

应用场景

  1. 缓存:缓存用户信息、配置
  2. 计数器:文章阅读数、点赞数
  3. 分布式锁:SETNX 命令
  4. Session 存储:用户登录状态

二、Hash(哈希)

是什么

一个 key 对应一个 map,适合存储对象。

常用命令

# 设置单个字段
HSET user:1 name "张三"
HSET user:1 age 18

# 获取单个字段
HGET user:1 name

# 获取所有字段
HGETALL user:1

# 批量设置
HMSET user:1 name "张三" age 18 city "北京"

# 字段自增
HINCRBY user:1 age 1

应用场景

  1. 存储对象:用户信息、商品信息
  2. 购物车:key 是用户 ID,field 是商品 ID,value 是数量
# 购物车
HSET cart:1001 商品A 2
HSET cart:1001 商品B 1

三、List(列表)

是什么

有序列表,底层是双向链表,可以从左右两边 push/pop。

常用命令

# 左边插入
LPUSH messages "hello"
LPUSH messages "world"

# 右边插入
RPUSH messages "end"

# 左边弹出
LPOP messages

# 右边弹出
RPOP messages

# 查看列表范围
LRANGE messages 0 -1

# 列表长度
LLEN messages

应用场景

  1. 消息队列:LPUSH + RPOP
  2. 最新消息:比如最新评论、最新文章
  3. 朋友圈时间线:LPUSH 新内容,LRANGE 分页查看

四、Set(集合)

是什么

无序且不重复的集合,自动去重。

常用命令

# 添加元素
SADD tags "PHP" "MySQL" "Redis"

# 查看所有元素
SMEMBERS tags

# 判断元素是否存在
SISMEMBER tags "PHP"

# 集合运算
SINTER set1 set2  # 交集
SUNION set1 set2  # 并集
SDIFF set1 set2   # 差集

# 集合大小
SCARD tags

应用场景

  1. 标签系统:一篇文章的标签
  2. 共同好友:SINTER 算交集
  3. 去重:UV 统计、防止重复提交
  4. 抽奖:SRANDMEMBER 随机抽取

五、ZSet(有序集合)

是什么

每个元素都有一个 score,按 score 排序,不重复。

常用命令

# 添加元素
ZADD rank 100 "张三"
ZADD rank 90 "李四"
ZADD rank 95 "王五"

# 按分数从低到高排序
ZRANGE rank 0 -1 WITHSCORES

# 按分数从高到低排序
ZREVRANGE rank 0 -1 WITHSCORES

# 查看元素排名
ZREVRANK rank "张三"

# 查看元素分数
ZSCORE rank "张三"

# 分数范围查询
ZRANGEBYSCORE rank 90 100

应用场景

  1. 排行榜:直播间送礼排行、游戏排行
  2. 延迟队列:score 存时间戳,到点的任务处理
  3. 加权排序:搜索结果排序

六、怎么选数据结构

场景 用什么
简单 key-value String
存对象 Hash
有序列表/队列 List
去重/标签 Set
排序/排行 ZSet

七、常见坑

  1. List 太多元素:链表太长,范围查询慢
  2. Hash 字段太多:小对象还好,大对象不适合
  3. Set 当 List 用:Set 无序,要顺序用 List 或 ZSet
  4. 大 key:一个 key 存几百万数据,会阻塞

总结

Redis 5 种数据结构的核心要点:

  1. String:最简单,缓存、计数器
  2. Hash:存对象,用户信息、购物车
  3. List:有序队列,消息、时间线
  4. Set:去重集合,标签、共同好友
  5. ZSet:排序集合,排行榜、延迟队列

选对数据结构,Redis 才能发挥最大威力。


emer 发布于  2026-10-4 10:14 
'); })();