数据库
初始化服务器时会根据redisServer的dbnum属性来决定创建多少个数据库,默认为16
使用select切换数据库
客服端状态redisClient结构的db属性记录了当前的目标数据库
RedisDb结构的dict字典保存了数据库的所有键值对,这个字典被称为键空间。
crud实际上是对键空间字典来操作,还有flushdb,dbsize等命令也是通过对键空间操作来实现的
设置键的生存时间或过期时间
Setex(单位s),expire(s),pexpire(ms)可以设置键的生存时间,
Expirate,pexpirate设置键的过期时间(timestamp的时间戳)
Ttl和pttl返回键的剩余生存时间
RedisDb结构的expires字典保存了数据库的所有键的过期时间,称为过期字典。键是指向键对象的指针,值是longlong类型的整数,一个ms精度的unix时间戳
Persist可以移除键的过期时间
判断过期键
如果过期字典存在键,unix时间戳大于过期时间,键已经过期
过期键删除策略:定时删除,惰性删除,定期删除
Redis使用的是惰性删除,定期删除两种策略,获取键时检查是否过期,周期性检查
RDB和AOF:
生成RDB文件时,过期键被忽视。
载入RDB文件时,如果是主服务器,会忽视;如果是从服务器,不会忽视
AOF写入时会追加一条del命令表示删除
AOF重写时,过期键被忽视。
复制:通过从服务器get过期键时不会删除,通过主服务器get过期键时会删除,并向从服务器发送del命令
数据库通知:2.8版本新增的功能,可以通过订阅给定的频道或模式,来获取数据库键的变化,以及命令的执行情况
RDB持久化和AOF持久化
使用RDB文件或AOF文件,可以还原数据库状态
RDB
Rdb通过保存数据库中键值对来记录数据库状态
Rdb文件是一个经过压缩的二进制文件
使用save或者bgsave生成RDB文件,save直接阻塞服务器,bgsave派生子进程创建RDB文件(bgsave命令执行期间禁用save,bgsave)
载入RDB文件服务器处于阻塞状态
自动间隔保存:可以设置服务器的save选项,让服务器每隔一段时间自动执行bgsave命令。RedisServer的saveparams属性保存了save设置的保存条件,还有dirty计数器记录了上一次成功执行save或bgsave命令后对数据库修改的次数,lastsave记录了上一次成功执行save或bgsave命令的unix时间戳
Save 900 1 表示900秒内至少对数据库进行一次修改
周期性操作函数serverCron默认每隔100ms执行一次,它的其中一项工作就是检查save选项中的保存条件是否满足,如果满足就执行bgsave命令
RDB文件结构
Redis表示为rdb文件,db_version时版本号,databases表示所有非空数据库,EOF表示rdb文件正文结束,check_sum为校验和
Pairs保存该数据库所有的键值对,包括过期时间
不同类型的键值对,以不同的方式保存在rdb文件中
分析rdb文件:同时以ascii和十六进制打印rdb文件
AOF
Aof通过保存resdis所执行的写命令来记录数据库状态
Aof文件中所有的命令都以redis命令请求协议的格式保存
Aof持久化功能的实现可分为命令追加(append),文件写入,文件同步(sync)三步
开启aof后写命令会追加到aof_buf缓冲区末尾
服务器进程就是一个事件循环,结束一个事件循环前会考虑是否将aof_buf缓冲区的内容放到aof文件中
Appendfsync选项默认为everysec
写入与同步:数据写入文件时,通常会先写入内存缓冲区中,缓存满了或者超过时限后,才会将缓冲区的数据写入磁盘
Redis会创建一个伪客户端进行aof文件的载入,服务器读取并执行aof中的写命令恢复数据库的状态
重写
通过读取数据库状态来重写aof文件可以减少文件体积
重写:子进程创建新的aof文件,读取当前数据库状态生成写命令写入aof文件,服务器会在重写时将新的写命令追加到aof缓冲区和aof重写缓冲区。重写完成后会将aof重写缓冲区的内容写入新aof文件中,然后将新aof文件改名,原子地替换新,旧aof文件。
redis默认采用RDB持久化
AOF文件更新比RDB快,AOF持久化功能开启时优先使用AOF文件还原数据库状态