1、Redis服务器默认会创建16个数据库,存储在数组中。
2、每个Redis客户端都有自己的目标数据库,默认情况下客户端的目标数据库为0号数据库,可以通过执行SELECT命令来切换目标数据库。
3、数据库的内部结构
(1)数据库由redisDb结构表示,主要由dict和expires两个字典构成,dict字典负责保存键值对,expires字典则负责保存键的过期时间。
(2)键空间的键也就是数据库的键,每个键都是一个字符串对象;键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象、有序集合对象中的任意一种Redis对象。
(3)数据库常见操作有添加、删除、更新、取值、FLUSHDB(清空数据库)、RANDOMKEY(随机返回一个键)、DBSIZE(返回数据库键数量)。
4、键的生存时间和过期时间
(1)EXPIRE(秒)/PEXPIRE(毫秒):以秒或者毫秒精度为数据库中的某个键设置生存时间(TTL)。
(2)EXPIREAT(秒)/PEXPIREAT(毫秒):以秒或者毫秒精度为数据库的某个键设置过期时间(UNIX时间戳)。
(3)TTL/PTTL命令接受一个带有生存时间或者过期时间的键,返回这个键的剩余生存时间(秒/毫秒)。键不存在返回-2,键没有设置过期时间返回-1。
(4)EXPIRE、PEXPIRE和EXPIREAT三个命令都会转换成PEXPIREAT命令来执行。
(5)redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称为过期字典。过期字典的键是某个键对象,值是一个long类型的整数(毫秒精度的过期时间)。
(6)PERSIST是PRXPIREAT命令的反操作,用来移除过期时间。
5、Redis的过期键删除策略
(1)惰性删除策略:所有读写数据库的Redis命令在执行之前都会调用expireIfNeed函数对输入键进行检查,如果键已过期则将键删除。
(2)定期删除策略:周期性函数serverCron执行时,activeExpireCycle函数每次随机从一定量的数据库中取出一定数量的键进行检查,并删除其中的过期键。定时循环执行,直到服务器中的所有数据库都被检查一遍。
(3)在执行SAVE或者BGSAVE命令创建一个新的RDB文件时,已过期的键不会保存,载入RDB文件时主服务器会过滤已过期的键,从服务器不会过滤,但是数据同步的时候从服务器数据会被清空,所以过期键不会对载入有影响。
(4)在执行BGREWRITEAOF命令重写一个AOF文件时,不会包含已过期的键,在过期键被惰性删除或者定期删除之后,程序会向AOF文件追加一条DEL命令,来显示地记录该键已被删除。
(5)当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制,只有在接到主服务器发来的DEL命令之后,从服务器才会删除过期键,这样可以保证主从服务器数据的一致性。
6、当Redis命令对数据库进行修改之后,服务器会根据配置向客户端发送数据库通知。