这是我参加「第五届青训营 」伴学笔记创作活动的第 4 天
redis 的工作原理:
- 数据从内存中读写
- 数据保存到硬盘上防止重启数据丢失
- 增量数据保存在AOF文件。比如,如果服务器宕机,重启时会去读取AOF文件。如果有命令没有在Redis中被执行,那么就会重放这些命令。
- 全量数据RDB文件。存放了redis的所有信息。每次启动时都最先读取RDB文件,再读取AOF文件。
- 单线程处理所有操作命令。比如,有两条命令顺序到达redis,则redis会顺序执行这些命令。
redis例子——通过例子了解redis的能力和数据结构
- 连续签到
redis具有使数值+1和设置过期时间
redis的数据结构:string
- 消息通知
redis的能力:向消息队列中推入消息、从消息队列中读出消息
推入信息:
读出消息:
redis的数据结构:list(实际叫做Quicklist)
quicklist由一个双向链表和listpack组成
- 计数
redis具有一次性接收或发送多条命令的功能,可以减少网络传输。使用pipe达到目的。
redis的数据结构:hash结构。hash结构类似于结构体,可以在一个key中记录多种数据。比如一条user数据可以记录文章被点赞的次数和粉丝数等等。
hash结构体的实现:hash结构体实际就是dictch+槽位进行存储。如下图中,key的hash值与sizemask与运算,得到槽位。可能有多条结果都计算在同一个槽位,那么就使用dictEntry顺序存储。
比如有三个槽位且三个槽位都存了很多数据时,可以使用rehash将ht[0]中的部分数据迁移到ht[1]中,分担查询压力。rehash又一般使用渐进式rehash,如图中所述。
- 排行榜
应用场景就是大量的用户都有分数,分数又要有排行。
redis中的zset可以很好的实现这个排行的功能。
zset这种数据结构可以对在这种数据结构中存储的数据进行 顺序逆序排序、查找排名、查找值。
zset的数据结构实现是一个叫做zskiplist的东西+hash结构共同实现。
zskiplist数据结构,如下图实现的:
zset的实现如下图所示,具体如何排名、如何查找等此处没有详细介绍,同学们自行百度:
- 限流
要求一秒内访问请求数小于n,大于n的被限流
最简单的思想就是key被当前时间戳拼接而成,然后去访问这个key(即该秒内)有多少流量访问过。
- 分布式锁