Redis | 青训营笔记

19 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天。

📜📜📜今天学习的是redis

一、什么是Redis💻?

1.1为什么需要Redis?

最开始只是一个简单的webserver,浏览器后面是server,然后是Mysql数据库。随着,数据量增长,读写数据压力的不断增加,MySQL从单机演进出集群。

image.png

image.png 那如何让数据的处理更快呢——数据分冷热(热数据是经常被访问到的数据) | 将热数据存到redis内存中。

1.2Redis的基本工作原理

从内存中读写,没有保存到硬盘上,重启数据会丢失。那么,如何保证读写很快,同时数据又不会丢失呢?

redis的结构如下图:

image.png 在客户端读写redis上面的数据的时候,使用RESP协议。数据传到redis服务端,服务端收到请求后,会将数据读写到内存里面去。其实,在读写内存之前,会产生一条日志(会写到磁盘文件上),写命令追加到AOF文件。这时,假如服务器宕机,redis在重启的时候会读取这个文件,如果在redis里面没有执行这个命令,redis在重启的时候,会重放这条命令。

还有一个rdb文件,保存了redis所有的文件。实际上,启动过程是先读取RDB文件,对比RDMB文件有没有没有执行的命令,如果有,就把AOF文件的命令加载进去。

src cat dump.rdb命令在windows中是type dump.rdb

Redis单线程处理所有操作命令——如果有两条命令,在redis是排队执行,先执行先到的文件。

image.png

二、Redis应用案例

2.1Redis的实际应用场景

  1. 连续签到

  2. 消息通知

  3. 计数

  4. 排行榜

  5. 限流

  6. 分布式锁

2.2Redis常用数据结构。

  1. String数据结构 (数据结构- sds
  • 可以存储字符串、数字、二进制数据 | 通常和expire配合使用
  • 场景:存储计数、Session
  1. List数据结构Quicklist

Quicklist由一个双向链表和listpack实现

  1. Listpack数据结构
  2. Hash数据结构dict
  • rehash: rehash操作是将ht[0]中的数据,全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[O]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。
  • 渐进式rehash:为避免出现这种情况,使 用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的访问用不请求过程中。
  1. zset数据结构zskiplist
  • 查找数字7的路径,head,3,3,7
  • 结合dict后,可实现通过key操作跳表的功能

三、Redis使用注意事项

大Key、热Key | 慢查询场景 | 缓存穿透、缓存雪崩