前言
提到 Redis,很多开发者的第一反应是:“哦,那个做缓存的,速度很快。” 的确,Redis 是内存数据库的速度之王。但如果你只会在项目里用 SET key value 和 GET key,那你仅仅用到了 Redis 10% 的功力,甚至有点“暴殄天物”。
Redis 之所以强大,是因为它内置了丰富且高效的数据结构。今天我们就来通过图解+实战的方式,彻底搞懂 Redis 最基础也是最核心的 5 种数据结构:String、List、Set、Hash、ZSet。
1. String(字符串)—— 万物之源
这是 Redis 最基本的数据类型,一个 Key 对应一个 Value。虽然叫 String,但它其实可以存储字符串、数字甚至是序列化后的对象(如 JSON)。
实战场景:
- 常规缓存: 缓存用户信息、Session 会话、HTML 页面。
- 计数器(Counter): 比如视频播放量、文章点赞数。因为 Redis 是单线程的,原子性操作
INCR天然支持高并发计数,不会像数据库那样出现并发一致性问题。 - 分布式锁: 利用
SETNX(Set if Not eXists) 命令来实现互斥锁,防止秒杀超卖。
常用命令:
Bash
# 存入 SET user:1:name "Tom" # 获取 GET user:1:name # 计数器自增 INCR article:1001:views
2. Hash(哈希)—— 对象存储专家
Hash 是一个键值对集合,类似于 Java 中的 HashMap 或 Python 的 Dict。它特别适合存储对象。
很多人喜欢把对象转成 JSON 存进 String 里,这没问题。但如果你只想修改对象中的某一个字段(比如只修改用户的年龄),用 String 就需要把整个 JSON 取出来反序列化、修改、再序列化存回去,开销很大。 而 Hash 可以直接修改某个字段。
实战场景:
- 用户个人信息: ID为Key,字段包含姓名、年龄、积分等。
- 购物车: 用户ID为Key,商品ID为Field,数量为Value。
常用命令:
Bash
# 存储一个用户对象 HSET user:1 name "Tom" age 18 balance 100 # 只获取用户的余额 HGET user:1 balance # 用户消费了,余额减 10 HINCRBY user:1 balance -10
3. List(列表)—— 双向链表
Redis 的 List 实际上是一个双向链表。这意味着它支持在头部(Left)和尾部(Right)进行高效的插入和删除操作。
实战场景:
- 消息队列(Message Queue): 利用
LPUSH(左进)和RPOP(右出),可以实现一个简单的先进先出(FIFO)队列。 - 最新消息/动态: 比如微信朋友圈的时间线。新的动态
LPUSH进去,获取前10条就用LRANGE 0 9。
常用命令:
Bash
# 生产者:从左边放入消息 LPUSH msg_queue "msg1" LPUSH msg_queue "msg2" # 消费者:从右边取出消息 RPOP msg_queue # 输出:msg1 # 获取最新的5条数据 LRANGE timeline 0 4
4. Set(集合)—— 去重与社交神器
Set 是 String 类型的无序集合。它最大的特点是:自动去重。你往里面塞10个 "A",它里面还是只有1个 "A"。
此外,Set 支持强大的集合运算:交集、并集、差集。这让它成为做社交功能的首选。
实战场景:
- 抽奖活动: 把所有参与用户的ID丢进 Set,然后用
SRANDMEMBER或SPOP随机抽取幸运儿,天然保证不重复中奖。 - 点赞/收藏: 一个用户只能点赞一次。
- 共同好友(交集): 我关注的人是 Set A,你关注的人是 Set B,
SINTER A B算出来的就是共同关注。
常用命令:
Bash
# 添加元素 SADD coding_lovers "Java" "Python" "Go" "Java" # 查看数量(结果是3,Java自动去重了) SCARD coding_lovers # 计算交集(共同好友) SINTER user:1:friends user:2:friends
5. ZSet(有序集合)—— 排行榜霸主
ZSet (Sorted Set) 是 Redis 最具特色的数据结构。它在 Set 的基础上,给每个元素关联了一个分数(Score)。 Redis 会自动根据 Score 对元素进行排序。
实战场景:
- 排行榜: 游戏战力榜、电商销量榜、微博热搜。
- 带权重的消息队列: 优先级高的任务 Score 设大一点,优先被取出来。
常用命令:
Bash
# 添加元素(Score在名字前面) ZADD leaderboard 100 "Tom" ZADD leaderboard 90 "Jerry" ZADD leaderboard 105 "Spike" # 获取前三名(按分数倒序) ZREVRANGE leaderboard 0 2 # 输出:1. Spike, 2. Tom, 3. Jerry
总结
- String:简单的KV缓存,计数器。
- Hash:存对象,购物车。
- List:消息队列,时间线。
- Set:去重,抽奖,共同好友。
- ZSet:排行榜。
在技术选型时,不要手里拿着锤子(String)看什么都是钉子。根据业务场景选择合适的数据结构,能让你的系统性能和代码优雅度同时飞升。