《Redis设计与实现》读书笔记
(重点部分加粗)
第9章 :单机NoSql
1.RedisServer有一个dbnum属性,默认值为16,所以Redis服务器会创建16个数据库。
2.SELECT命令:切换数据库
原理:通过修改RedisClient.db指针,让它指向服务器中的不同数据库,从而实现切换数据库的功能。
3.数据库键空间
dict字典保存了数据库中所有的键值对,这个字典称为"键空间"
另外的,expires字典保存了数据库中所有键的过期时间,称为"过期字典"。
4.设置键的生存时间或过期时间(重点)
EXPIRE命令:以秒为精度,为某个键设置生存时间。(Time To Live,TTL,指的是键可以存在多久)
PEXPIRE命令:以毫秒为精度,为某个键设置生存时间。
EXPIREAT:以秒为精度,为某个键设置过期时间(Expire Time,就是指键什么时候会删除)。
PEXPIREAT:以毫秒为精度,为某个键设置过期时间。
过期时间是一个Unix时间戳。
EXPIRE命令、PEXPIRE命令、EXPIREAT命令,这三个命令都是使用PEXPIREAT命令来实现的。
TTL命令和PTTL命令,接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间。
5.过期键删除策略(重点)
定时删除:在设置键的过期时间的同时,创建一个定时期,让定时器在键的过期时间来临时,立即对键进行删除操作。
定时删除的缺点是:占用太多CPU时间,影响服务器的响应时间和吞吐量。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查键是否过期。如果过期的话,就删除该键。如果没有过期,就返回该键。
惰性删除的缺点是:浪费太多内存,有内存泄漏的风险。
定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。
定期删除比前两种策略好一些,但是需要调整好删除的频率和时长。
6.当一个过期键被删除之后 ,服务器会追加一条DEL命令到现有AOF文件的末尾。
7.当主服务器删除一个过期键后,主机会向所有的从机发送一条DEL命令。
从机即使发现过期键,也不会去删除它,而是等待主机发来DEL命令,可以保证主从服务器数据的一致性。
第10章:RDB持久化(重点)
Redis的持久化是什么意思?就是从内存中,保存到磁盘里面。
1.RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据。
2.SAVE命令由服务器进程直接执行保存操作,会阻塞服务器。
3.BGSAVE命令由子进程执行保存操作,所以不会阻塞服务器。
4.RDB文件是一个经过压缩的二进制文件,由多个部分组成。
RDB文件包含:
(1)"REDIS"五个字符:检查所载入的文件是否RDB文件。
(2)db_version:记录RDB文件的版本。
(3)databases:包含多个数据库,以及各个数据库中的键值对数据。
(4)EOF:表示文件的结尾。
(5)check_sum:保存一个校验和,通过对前面几个部分的内容进行计算得出的和。服务器在载入RDB文件时,会和check_sum进行对比,以此检查RDB文件是否出错 。
5.RDB文件是保存在磁盘里面的的。
6.如果服务器开启了AOF持久化,那么服务器会优先使用AOF。因为AOF文件的更新频率通常比RDB文件的更新频率高。
7.自动间隔性保存:可以在redis.conf里面设置,让服务器每隔一段时间自动执行一次BGSAVE命令。
第11章:AOF持久化(重点)
AOF(Append Of File)持久化:通过保存Redis服务器所执行的写命令来记录数据库状态。
AOF持久化功能的实现分为:命令追加(append)、文件写入、文件同步(sync)三步。
命令追加:写命令会被追加到aof_buf缓冲区的末尾。
AOF文件的写入与同步:
appendfsync选项的设置对安全性和性能有很大影响非常重要。
appendfsync的值为always时,写入并同步,效率最慢,最安全。
appendfsync设置为everysec时,写入并同步,效率够快,就算故障停机,也只丢失一秒的命令数据。
appendfsync为no时,只将aof_buf缓冲区内容写入到AOF文件,不执行同步。
AOF文件的载入与数据还原:
Redis服务器只要读入并重新执行一遍AOF文件保存的写命令,就可以还原关闭之前的数据库状态。
AOF重写(rewrite):
AOF文件的内容越来越多,文件体积越来越大,Redis提供AOF文件重写功能。
AOF重写的原理:首先从数据库中读取键现在的值,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令。
AOF后台重写(BGREWRITEAOF命令)
为了避免线程长时间阻塞,Redis将AOF重写放到子进程里执行。
为了使得服务器当前数据库状态和重写后的AOF文件所保存的数据库状态一致,会在AOF重写期间,将写命令追加到AOF缓冲区和AOF重写缓冲区。
第12章 事件
1.Redis服务器是一个事件驱动程序。服务器要处理两类事件:
(1)文件事件:Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象。
(2)时间事件:Redsi服务器的操作(比如serverCron函数)需要在给定的时间执行。
2.Redis基于Reactor模式开发网络事件处理器。
3.IO多路复用:Redis虽然是单进程单线程,但事件处理器使用IO多路复用来同时监听多个套接字,实现高性能的网络通信模型。
IO多路复用,基于select、epoll、evport、kqueue模型。
4.文件事件处理器的组成 :
5.文件事件类型:AE_READABLE(可读)事件、AE_WRITABLE(可写)事件。
6.时间事件分两类:
(1)定时事件:在指定时间执行。(2)周期性事件:每隔一段时间执行。
7.ServerCron函数:周期性事件。它的主要工作包括:
(1)更新服务器的各类统计信息。比如内存占用。
(2)清理数据库中的过期键值对。
(3)关闭和清理失效的客户端 。
(4)尝试进行AOF或RDB持久化操作。
(5)如果服务器是主服务器,那么会对服务器进行定期同步。
(6)如果处于集群模式,会对集群进行定期同步和连接测试。
第17章 集群 (重点)
- 节点。
一个Redis集群通常由多个节点(node)组成,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群。
连接各个节点的工作可以使用CLUSTER MEET命令来完成,
通过向节点A发送CLUSTER MEET命令,客户端可以让接收命令的节点A将另一个节 点B添加到节点A当前所在的集群里面:
该命令的格式如下: CLUSTER MEET
待补充。