struct redisServer{
//一个数组,保存着数据库的所有数据库
redisDb *Db;
//服务器的数据库数量(默认16个数据库)
itt dbnum;
}
切换数据库
SELECT命令
键空间
键空间的键对应数据库的键,每个键即一个子字符串对象。
键空间的值对应数据库的值,每个值即一个Redis对象。
设置键的生存时间和过期时间
生存时间
EXPIRE key ttl 秒/毫秒
PEXPIRE
TTL 接受一个带有生存时间的键,返回键的剩余时间
过期时间
EXPIREAT key timestamp 秒/毫秒
PEXPIREAT
PTTL 接受一个带有过期时间的键,返回键的剩余时间
SETEX 设置一个字符串键的同时为键设置过期时间
保存过期时间
expires字典保存着数据库所有键的过期时间
移除过期时间
PERSIST命令
反操作:PEXPIREAT
过期键的判定
1. 检查给定键是否存在过期字典,如果存在,取得键的过期时间。
2.检查当前UNIX时间戳是否大于键的过期时间;如果是的话,那么键已经过期,否则,键未过期。
过期键删除策略
1.定时删除
设置建的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行対键的的删除操作。
2.惰性删除
放任键过期不管,但是每次从键空间获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,则返回该键。
3.定期删除
每隔一段时间,对数据库进行检查,删除数据库里的过期键。
1.定时删除
对内存友好,对CPU时间不友好:在过期键比较多的情况下,删除过期键会占用大量CPU时间,在内存不紧张但是CPU紧张的情况下,将CPU时间用于删除与当前任务无关的过期键上,会对服务器的响应时间和吞吐量造成影响。
2.惰性删除
对CPU最友好,对内存不友好,浪费太多内存,会产生内存泄露的风险。
3.定期删除
折中方案,每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率减少删除操作对CPU时间的影响。
而且有效地减少了内存浪费。
惰性删除策略的实现
定期删除策略的实现
AOF,RDB和复制功能对过期键的处理
生成RDB文件
save/bgsave命令创建一个新的RDB文件时,对数据库中的键进行检查,已过期的键不会保存到新创建的RDB文件中。
载入RDB文件
AOF文件写入
AOF重写
复制
数据库通知
客户端通过跟定的模式,来获取数据库键的变化,以及数据库中命令的执行情况。
“某个键执行了什么命令”的通知称为键空间通知。(某个命令被什么键执行了)