随着项目的复杂性和性能的要求,逐渐开始接触和使用到了redis。
因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。所以需要持久化功能来保存数据。
1.redis中的两种持久化
RDB持久化
RDB持久化功能就是把数据柜状态保存到磁盘里面。
有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。
SAVE: 执行同步保存,阻塞其他命令。BGSAVE: 执行异步保存,不阻塞其他命令。嗯嗯嗯,AV也会阻塞。
AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的
AOF持久化功能的实现可以分为命令追加(append)、文件写入、文件同步(sync)三个步骤。
2.Redis应用案例
1.连续签到
其中用到了redis中的SDS字符串,也就是string数据结构。
在这个数据结构中,buf是一个字节数组,len表示buf中已使用的字节的大小,如果buf中存有redis,则len=5,alloc 表示的是自己数组的长度。 Flags是这个字符串的存储的类型,涉及到底层编译的优化。
2.消息通知
Redis中的quick list本质上是一个双向链表,每个节点都包含一个压缩列表(ziplist)。压缩列表是一种紧凑的二进制数据结构,用于高效地存储小型字符串。(当然具体实现比这复杂的多。)
Quicklist 节点
每个 Quicklist 节点包含以下几个主要组成部分:
- prev:指向前一个节点的指针。
- next:指向下一个节点的指针。
- zl:指向压缩列表的指针。
- sz:压缩列表的大小(以字节为单位)。
- count:压缩列表中的元素数量。向前的指针和向后指针含有压缩列表的指针,压缩列表的大小压缩列表的元素数量。
计数
散列表是一种数组,其中每个元素都是一个链接列表的头节点
排行榜
redis 中的有序集合(Zset)使用跳跃列表和散列表的组合来实现其功能。跳跃列表提供了排序和范围查询能力,而散列表提供了快速访问特定成员的能力。
限流
在这里老师讲到的,其实只是最基本的使用redis中的string类型作为简单计数器实现限流。更加复杂的还有滑动窗口和令牌桶。
分布式锁
SET if Not eXists
但是它并能得到高可用的分布式锁