Redis 设计与实现---第八章:数据库(一)

Redis所有数据库都保存在服务器状态RedisServer结构的db数组中,db的每一个项都是一个redisDb结构,每一个redisDb结构代表一个数据库,启动服务时,根据配置database决定创建数据库的个数

Redis 设计与实现---第八章:数据库(一)

select 命令的实现:

      在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDb结构的指针

Redis 设计与实现---第八章:数据库(一)

数据库键空间:

     Redis 设计与实现---第八章:数据库(一)

数据库的增删改查,dbsize,exists rename,keys 等操作都是对键空间进行操作完成的

读写键空间时的维护操作:

     每一次读写操作,服务器都会做一些额外的事情

    1. 根据是否存在更新键空间命中hit次数或不命中次数miss,可以使用info stats 命令查看,其中keyspace_hints就是改数据库名中次数,keyspace_misses就是未命中次数

  2. 在读取一个键后服务器会更新LRU(最后一次使用)时间,这个值可以用于计算键的闲置时间,使用 object idletime <key>命令查看

  3. 如果读取时发现键已经过期则先删除该键,再执行后续操作

  4. 如果客户端使用了watch命令监视了某个键,那么服务器在对被监视的键进行修改后,会将这个键标记为脏dirty,从而让事务程序注意到这个键已经被修改过

  5. 每做一次修改,都会对脏dirty键计数加一,这个计数器会触发服务器的持久化以及复制操作

  6. 如果服务器开启了数据库通知功能,那么在对键进行修改后服务器按配置发送响应的数据库通知

过期时间:

expire key seconds   多少秒后过期

pexpire key milliseconds   多少毫秒后过期

expireat key timestmap  到达目标时间戳过期

pexpireat  key timestmap   到达毫秒时间戳时过期

以上四个命令最终都会转换成pexpireat执行

Redis 设计与实现---第八章:数据库(一)Redis 设计与实现---第八章:数据库(一)

Redis 过期删除策略:

   删除过期键有三种策略:1. 定时删除(类似绑定定时器,到点了就调用删除,缺点耗内存);2. 惰性删除(客户端读取时,判断是否已过期,过期则删除,被动触发,缺点造成内存浪费);3. 定期删除(设置周期时间和每次处理数量,设置不好就可能沦为前两种)

   Redis的删除策略使用的是惰性和定期删除两种策略配合,合理利用cpu时间和避免内存浪费之间取得平衡。惰性策略在每次获取键之前判断是否过期,定期策略每次执行都从数据库中取出一定数量的随机键进行检测,并删除其中过期的键。一轮检查完后current_db又回到0

Redis 设计与实现---第八章:数据库(一)