数据库实现
Redis服务器中的数据库
保存在redisServer结构体的redisDB数组中,默认是16个数据库。 默认目标数据库是0号数据库,可以切换,SELECT 2即可切到2号数据库。
数据库键空间,保存了数据库中所有键值对,换句话说就是保存了库中的所有数据。对键可以有增删改查等操作,也可以有记录命中次数、LRU最后一次使用时间等维护操作。
Expire和过期删除策略
expire < key> < ttl>或 expireat < key> < timestamp>命令用于设置键的过期时间。
expires字典保存所有键的过期时间。可以删除过期键,也可以计算到过期时间的剩余。
过期键删除策略:
(1)定时删除:设置过期时间的同时,创建一个定时器timer。定时器在过期时间来临时删除键。
(2)惰性删除:放任键过期不管,每次从键空间获取(任意?)键时,都检查该键是否过期,过期删除否则不用。
(3)定期删除:每隔一段时间,扫描一遍过期键,删除其中过期的。
RDB持久化
Redis是内存数据库,一旦服务器进程退出,内存中的数据会消失。为避免数据意外丢失,Redis提供RDB持久化功能,将内存中的数据保存到磁盘中。
RDB持久化功能通过生成RDB文件,一个经过压缩的二进制文件,通过该文件可以还原内存中的数据。RDB文件是肯定存在磁盘里的。
RDB文件的创建于载入
Redis有两个命令生成RDB文件,一个是SAVE,另一个也是SAVE。开玩笑的,另一个是BGSAVE。 SAVE命令直接阻塞服务器进程,直到RDB文件创建完成。BGSAVE会派生一个子进程,然后子进程会负责创建。
RDB文件载入。下图来自于《Redis设计与实现》一书
自动间隔保存
BGSAVE命令由子进程执行不会阻塞服务器,所以Redis可以设计save选项,自动执行BGSAVE命令。
优缺点
AOF持久化
与RDB通过保存数据库中的键值对来记录数据库状态不同,AOF是通过保存Redis服务器所执行的写命令来记录数据库状态的。
AOF的实现
AOF功能的实现可以分为命令追加append、文件写入、文件同步sync三个步骤:将执行的写命令以协议格式追加到服务器redisServer的aof_buf缓冲区中;定时将缓冲区中内容写入aof文件;
优缺点
AOF和RDB区别
区别通过上述两张优缺点的图片即可对比看出,AOF和RDB单独选择都会有一定问题
内存淘汰策略
如同操作系统中内存中页面如果满了,就会使用页置换策略一般。Redis中内存如果满了,也会将数据项即K-V键值对淘汰以空出内存空间存储新的键值对。Redis内存淘汰同样有不同的策略:
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)。
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key,肯定是把最近最少使用的 key 给干掉更合适。
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。