这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天。
📜📜📜今天学习的是redis
一、什么是Redis💻?
1.1为什么需要Redis?
最开始只是一个简单的webserver,浏览器后面是server,然后是Mysql数据库。随着,数据量增长,读写数据压力的不断增加,MySQL从单机演进出集群。
那如何让数据的处理更快呢——数据分冷热(热数据是经常被访问到的数据) | 将热数据存到redis内存中。
1.2Redis的基本工作原理
从内存中读写,没有保存到硬盘上,重启数据会丢失。那么,如何保证读写很快,同时数据又不会丢失呢?
redis的结构如下图:
在客户端读写redis上面的数据的时候,使用RESP协议。数据传到redis服务端,服务端收到请求后,会将数据读写到内存里面去。其实,在读写内存之前,会产生一条日志(会写到磁盘文件上),写命令追加到AOF文件。这时,假如服务器宕机,redis在重启的时候会读取这个文件,如果在redis里面没有执行这个命令,redis在重启的时候,会重放这条命令。
还有一个rdb文件,保存了redis所有的文件。实际上,启动过程是先读取RDB文件,对比RDMB文件有没有没有执行的命令,如果有,就把AOF文件的命令加载进去。
src cat dump.rdb命令在windows中是type dump.rdb
Redis单线程处理所有操作命令——如果有两条命令,在redis是排队执行,先执行先到的文件。
二、Redis应用案例
2.1Redis的实际应用场景
-
连续签到
-
消息通知
-
计数
-
排行榜
-
限流
-
分布式锁
2.2Redis常用数据结构。
- String数据结构 (数据结构- sds
- 可以存储字符串、数字、二进制数据 | 通常和expire配合使用
- 场景:存储计数、Session
- List数据结构Quicklist
Quicklist由一个双向链表和listpack实现
- Listpack数据结构
- Hash数据结构dict
- rehash: rehash操作是将ht[0]中的数据,全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[O]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。
- 渐进式rehash:为避免出现这种情况,使 用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的访问用不请求过程中。
- zset数据结构zskiplist
- 查找数字7的路径,head,3,3,7
- 结合dict后,可实现通过key操作跳表的功能
三、Redis使用注意事项
大Key、热Key | 慢查询场景 | 缓存穿透、缓存雪崩