redis的数据库的num是通过配置来设置的。其实是在内存中开辟来num个长度的内存地址,所谓的切换,select 0 到select 1,其实就是把地址指针从0指到了1.
我们在存如set key value 的时候,会把key 存到一个专用的键字典中,value存到了另外一个字典里。
设置过期时间可以使用秒expire或者毫秒pexire 不管那种最后都是毫秒存入。
过期时间也会存到字典中。
过期判定:先检查给定键是否存在于过期字典,如果在取键的过期时间,再去检查当前unix时间戳是否大于键的过期时间,如果是键已过期,否则未过期。
过期键删除策略:
定时删除:创建一个定时器,让他在过期时立即执行。有可能对响应时间和吞吐量造成影响。
惰性删除:放任过期不管,但是每次从键空间获取键时,检查键是否过期,如果过期就删除,否则就返回该键。虽然好,但很多key没有操作,会占用大量内存,造成内存泄漏。
定期删除:每隔一段时间,程序就对数据库检查一次,删除一部分里面对过期键,要删多少都是通过算法决定的。是前两种但一种折中,但很难确定多长时间执行一次,也就是频次很难确定。
键值个数的参数:DEFAULT_KEY_NUMBERS = 20;
生成rdb:
当执行save或者bgsave是,如果有k1 ,k2, k3 其中k2过期,则在生成的rdb文件中不会包含k2.
如果是载入rdb,那就要分是以主服务器模式还是从服务器模式运行。
主服务器模式加载,加载的过程中,过期键会被忽略掉。
从服务器模式加载,过期键不会被忽略掉(主要是要主从同步),过期键要通过主同步过来消息删除。
生成AOF:
当服务器以AOF持久化模式运行时,如果某个键过期,但还没被定期或惰性删除,那么不会有任何影响。当过期键被惰性或定期删除后,程序会向AOF中追加append 一条DEL命令,显式记录被删。
AOF重写:
在执行AOF重写中,会对键检查,已过期不会被保存到重写后的AOF文件中。
总结:
客户端选择数据库的时候,通过指针来切换。
数据库主要是由dict和expires两个字典组成,dict负责存储键值对,expires负责保存键的过期时间。
expires字典的键指向数据库中某个键,而值记录来键的过期时间,以毫秒的unix时间戳
redis使用惰性和定期两种删除策略,惰性是碰到的时候才删除,定期是每隔一段时间主动查找并删除。
执行save或者bgsave时,过期的key不会写入rdb,
执行bgwriteaof时重写rdb也不会包含过期的键。
当一个键被删除后,服务器会追加一条del到现有的aof末尾。
当主服务器删除一个过期的键后会向所有的从发送一条del命令,显式记录。