如果这一章理解了,Redis 后面的 API 你几乎不用背。
很多教程一上来就是:
redis.set()
redis.get()
redis.hSet()
redis.lPush()
学生最后:
String 忘了
Hash 不知道什么时候用
Set 和 ZSet 分不清
为什么?
因为不知道设计这些数据结构的原因。
Redis 为什么有五种数据结构?
先问你一个问题。
MySQL 里面只有:
数据库
↓
表
↓
字段
为什么 Redis 要搞这么多数据结构?
答案只有一句话:
不同的数据,适合不同的存储方式。
例如:
商品
商品ID
↓
商品信息
是不是一对一?
购物车:
用户
↓
多个商品
是不是一对多?
热门商品:
商品
↓
销量排序
是不是需要排序?
所以:
Redis 设计了不同的数据结构。
第一种:String(最重要)⭐⭐⭐⭐⭐
也是使用最多的。
你可以理解成:
Key
↓
一个 Value
例如:
goods:list
↓
JSON字符串
Redis:
goods:list
↓
"[{...},{...}]"
是不是特别像:
const cache = {
"goods:list": "[...]"
}
在我们的项目中
商品列表:
GET /goods
查询:
MySQL:
SELECT *
FROM goods
然后:
Redis:
goods:list
↓
[
{},
{},
{}
]
以后先查Redis->有则直接返回。没有则查:MySQL。再放 Redis。这就是:缓存。
String 可以存什么?
几乎:
什么都可以。
例如:
字符串:
hello
数字:
100
JSON:
{
"id":1,
"name":"可乐"
}
Token:
eyJhbGci...
验证码:
123456
所以:80% 的 Redis 使用都是 String。
第二种:Hash(企业使用很多)
先看:
用户:
{
"id":1,
"username":"admin",
"avatar":"..."
}
如果:
String:
存:
user:1
↓
整个JSON
以后:
修改头像。
怎么办?
是不是:
整个JSON
重新覆盖
Hash:
可以:
user:1
↓
username
↓
admin
↓
avatar
↓
abc.jpg
是不是像:
JavaScript:
{
username:"admin",
avatar:"abc.jpg"
}
这样:
修改头像:
只改:
avatar
不用:
整个:
JSON。
在点餐项目里
缓存:
用户信息。
例如:
user:18
↓
username
头像
手机号
昵称
以后:
改昵称。
只更新:
nickname
即可。
第三种:List
List:
其实就是:
数组
例如:
消息1
消息2
消息3
JavaScript:
[]
一样。
企业以前:
喜欢:
消息队列。
例如:
下单
↓
发短信
↓
发邮件
放:
List。
但是:
现在:
更多:
RabbitMQ
Kafka
Redis List 用得没以前多。
所以:
对于我们项目:
基本不用。
知道:
即可。
第四种:Set
Set:
就是:
不能重复
例如:
JavaScript:
new Set()
是不是:
一样?
例如:
收藏:
商品1
商品2
商品2
商品3
Set:
自动:
商品1
商品2
商品3
没有重复。
在点餐项目:
以后:
可以:
用户收藏商品
就很适合。
第五种:Sorted Set(ZSet)⭐⭐⭐⭐⭐
这是:
Redis:
最厉害的数据结构。
例如:
销量排行榜。
MySQL:
SELECT *
ORDER BY sales DESC
LIMIT 10
没问题。
但是:
一天:
100 万人。
全部:
排序。
数据库:
压力:
巨大。
Redis:
ZSet:
天生:
带排序。
例如:
商品1
100
商品2
90
商品3
88
自动:
排序。
在我们项目:
首页:
热销商品
是不是:
Perfect。
以后:
每卖一件。
销量:
+1
Redis:
自动:
排行榜。
不用:
SQL:
排序。
五种数据结构总结
| 数据结构 | 像什么 | 项目里的用途 |
|---|---|---|
| String | 一个变量 | 商品列表缓存、Token、验证码 |
| Hash | JS对象 | 用户信息缓存 |
| List | JS数组 | 消息队列(了解即可) |
| Set | JS Set | 收藏、去重 |
| ZSet | 排序数组 | 热门商品排行榜 |
企业项目真正常用的其实只有三个
如果你去看大部分 Node 项目:
真正大量使用的是:
★★★★★ String
★★★★☆ Hash
★★★★★ ZSet
List:
越来越少。
Set:
偶尔。
所以:
不用担心:
Redis:
API:
很多。
真正天天写的:
其实:
就:
String
Hash
ZSet