8.1.2 数据类型总览与适用场景
数据类型总览与适用场景#
本节快速梳理 Redis 核心与扩展数据类型的定位与选型方法,并给出可执行示例、安装验证、排错与练习。后续各类型的详细命令在子节展开,这里只做总览与关键命令入口。
原理草图:类型与场景映射
环境准备与安装验证(示例)#
仅用于本节命令演示,生产安装与优化在“安装部署与配置优化”章节详述。
CentOS/RHEL
sudo yum install -y redis
sudo systemctl enable --now redis
redis-cli ping
# 预期输出:PONG
Ubuntu/Debian
sudo apt update
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
redis-cli ping
# 预期输出:PONG
类型速览与最小命令示例#
String(字符串)
适用:缓存简单值、计数器、分布式锁、会话信息。
示例(写入与自增):
redis-cli set cache:user:1 "tom"
redis-cli get cache:user:1
# 预期输出:tom
redis-cli incr counter:login
redis-cli get counter:login
# 预期输出:1
命令解释:SET 写入字符串,INCR 原子自增,常用于计数器。
Hash(哈希)
适用:对象型数据(用户、订单),支持字段级更新。
示例(写入字段与读取):
redis-cli hset user:1 name "tom" age 18 city "beijing"
redis-cli hget user:1 name
# 预期输出:tom
redis-cli hgetall user:1
命令解释:HSET 设置多字段,HGETALL 获取所有字段。
List(列表)
适用:消息队列、最新列表、时间线。
示例(双端写入/弹出):
redis-cli lpush queue:task "job1" "job2"
redis-cli rpop queue:task
# 预期输出:job1(右端弹出)
命令解释:LPUSH 左侧入队,RPOP 右侧出队,形成 FIFO。
Set(集合)
适用:去重、共同好友/标签、权限集合。
示例(去重与集合运算):
redis-cli sadd tag:post:1 "linux" "redis" "ops"
redis-cli sadd tag:post:2 "redis" "devops"
redis-cli sinter tag:post:1 tag:post:2
# 预期输出:redis
命令解释:SADD 去重写入,SINTER 取交集。
ZSet(有序集合)
适用:排行榜、延迟队列、权重排序。
示例(排行与区间查询):
redis-cli zadd rank:game 100 "alice" 120 "bob" 110 "tom"
redis-cli zrevrange rank:game 0 2 withscores
# 预期输出:bob 120 / tom 110 / alice 100
命令解释:ZADD 以分值排序,ZREVRANGE 逆序排行。
Bitmap
适用:签到、在线状态、访问统计(0/1)。
示例(签到与统计):
redis-cli setbit sign:2025-01-01 1001 1
redis-cli getbit sign:2025-01-01 1001
# 预期输出:1
redis-cli bitcount sign:2025-01-01
# 预期输出:1
命令解释:SETBIT 设置位,BITCOUNT 统计位为1的数量。
HyperLogLog
适用:UV/DAU 近似去重统计。
示例(多用户去重):
redis-cli pfadd uv:2025-01-01 "u1" "u2" "u3" "u2"
redis-cli pfcount uv:2025-01-01
# 预期输出:3(近似值)
命令解释:PFADD 添加元素,PFCOUNT 近似基数统计。
Geo
适用:地理位置查询与范围检索。
示例(附近搜索):
redis-cli geoadd shop 116.404 39.915 "beijing" 121.473 31.230 "shanghai"
redis-cli georadius shop 116.404 39.915 1500 km withdist
# 预期输出:beijing 0 / shanghai ~1060
命令解释:GEOADD 添加坐标,GEORADIUS 半径查询。
选型建议(可执行判断)#
- 简单值/计数/锁:String +
INCR/SETNX - 对象字段更新:Hash +
HSET/HGET - 队列:List +
LPUSH/RPOP(复杂消费语义改用 Streams) - 集合运算:Set +
SINTER/SUNION - 排行/延迟:ZSet +
ZRANGE/ZREVRANGE - 二值统计:Bitmap +
BITCOUNT - 近似去重:HyperLogLog +
PFCOUNT - 地理检索:Geo +
GEORADIUS
常见问题与排错#
redis-cli连接失败
bash redis-cli -h 127.0.0.1 -p 6379 ping # 若失败,检查服务状态 sudo systemctl status redis || sudo systemctl status redis-server- 命令不可用(如 GEO/HLL)
bash redis-cli info server | grep redis_version # 版本过低需升级,Geo/HLL 需较新版本 - 数据结构误用导致性能差
- 使用TYPE key确认类型
bash redis-cli type key:name # 预期输出:string/hash/list/set/zset
练习#
- 用 Hash 保存用户
id=1的name/age/city,并只更新age。 - 用 Set 计算两个文章标签的交集。
- 用 ZSet 实现三人排行榜,取前二名并带分数。
- 用 Bitmap 记录 1 月 1 日签到用户 1001 和 1002,并统计签到人数。
- 用 HyperLogLog 统计 1 月 1 日 UV,加入重复用户后核对数量变化。