数据库
1 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组里,db数据的每个项都是redis.h/redisDb结构,每个redisDb结构代表一个数据库
2 Redis客户端redisClient结构的db属性记录了客户端当前的目标数据库,这个属性指向一个redisDb结构的指针,redisClient.Db对应的指针是redisServer.db数组其中的一个元素.
3 redis服务器中的每个数据库都由一个redis.h/redosDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对.我们将这个字典称为键空间.
1 键空间的键也是数据库的键,每个键都是一个字符串对象
2 键空间的值也是数据库的值,每个值可以是字符串对象,列表对象,哈希对象,集合对象,和有序集合对象中的任一redis对象.4 数据库对键值对的操作实际就是对键空间字典进行操作实现的
1 对键进行操作以后,服务器会根据键是否存在来更新服务器的键空间命中(hit)次数,或键空间不命中(miss)次数.
2 在读取一个键后,服务器会更新键的LRU(最后一次使用)时间
3 发现一个键已经过期,那么服务器会先删除这个过期键,然后才执行余下的操作
4 如果有客户端使用WATCH命令监视了某个键,那么服务器在对这个被监视的键进行修改之后,会将这个键标为脏.让事务程序注意到这个键已经被修改过.
5 服务器每次修改一个键后,都会对脏键计数器的值进行+1,这个计数器会触发服务器的持久化以及复制操作\5 redisDb结构的expires字典保存了数据库中的所有键的过期时间,我们称这个字典为过期字典.
1 过期字典的键是一个指针,这个指针指向了键空间中的某个键对象(也即是某个数据库键).值则是一个long类型的整数.
6 过期键删除策略共有三种: 定时删除,惰性删除,定期删除.
1 redis的过期键删除策略采用的是: 惰性删除和定期删除策略. 通过两种策略的配合,达到cpu时间与浪费内存之间取得平衡.
2 定期删除的策略: redis.c/activeExpireCycle函数实现,当redis周期性的操作 redis.c/serverCron 函数时,这个函数就会被调用,它在规定的时间内.
分多次遍历服务器中的各个数据库,从数据库的expires(过期)字典中随机检查一部分键的过期时间,并删除其中的过期键.
3 RDB影响:1 生成RDB文件文件时,会检测键是否过期,已过期的键不会存在于新创建的RDB文件中. 在载入RDB文件时,如果是主服务器,会检测键是否过期.
如果是从服务器,则都加载进去.不过因为主从服务器在进行数据同步时,从服务器数据库就会被清空,所以一般来讲.过期键对载入RDB的从服务器也无影响4 AOF影响:
1 当服务器已AOF持久化模式运行时,如果数据库的某个键已经过期,他还没有被惰性删除或者定期删除,那么AOF文件不会有任何影响.因为当键过期时,程序会向AOF文件追加一条DEL命令.来显式的记录该键已被删除.
5 主从复制:
1 键过期删除动作由主服务器决定,主主服务器删除一个键后,会显式的向所有从服务器发送一个DEL命令,告知从服务器删除这个过期键.
2 从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将其删除,正常处理.
3 从服务器只有在收到主服务器的DEL命令后,才会删除过期键.