Redis学习

如果这一章理解了,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