【Redis】Redis数据库

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

当redis命令对数据库进行读写时,服务器不仅会对键空间执行指定的读写操作,还会执行一些额外的维护操作

  • 在读取一个键之后(读写都会对键进行读取),服务器会根据键是否存在,来更新服务器的键空间命中(hit)次数或键空间不命中(miss)次数
  • 在读取一个键之后,服务器会更新键的LRU(最后一次访问时间),这个值可以用于计算键的空闲时间
  • 如果服务器发现这个键过期了,会先删除这个过期键,然后才会执行其他操作
  • 如果有客户端使用WATCH命令监视了某个键,那么服务器在对被监视的键进行修改之后,会将这个键标记为脏(dirty),从而让事务程序注意到这个键已经被修改过.
  • 服务器每次修改一个键之后,都会对脏(dirty)键计数器的值增1,这个计数器会触发服务器的持久化及复制操作
  • 如果服务器开启了数据库通知功能,那么在对键进行修改之后,服务器将按配置发送相应的数据库通知。

过期时间

redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典;

  • 过期字典的键是一个指针,这个指正指向键空间中的某个键对象(就是也是 键,跟键空间的键指向同一个;例如键都是 a, 过期字典的键和键空间的键 都是指向 a 这个键对象的,所以不会浪费内存)
  • 过期字典的值是一个 long long类型的整数,这个整数保存了键所指向的数据库键的过期时间---- 一个毫秒精度的unix时间戳

移除过期时间

将过期字典中的键值对移除掉就行了

计算并返回剩余生存时间

计算键的过期时间与当前时间差 就行了

过期键的删除策略

  • 定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作
    优点:对内存最友好,通过定时器能让国企键尽可能快的被删除
    缺点:对CPU时间很不友好,在过期键很多的情况下,删除过期键这一行为可能会占用相当一部分cpu时间,在内存不紧张但是cpu时间紧张的情况下,会对服务器相应时间和吞吐量造成影响

  • 惰性删除: 放任键过期不管,但是每次从键空间中获取键的时候,都检查取到的键是否过期,如果过期就删除;
    优点:对CPU友好
    缺点:对内存最不友好,如果一个键一直不去读取,那么就一直存在不会被删除

  • 定期删除:每隔一点时间,陈旭就对数据库进行一次检查,删除里面的过期键,至于要删除多少过期键,以及要检查多少个删除库,由算法决定;
    定期删除策略难点在于确定删除操作执行的时长和频率,服务器必须根据情况,合理的设置执行时长和频率

Redis的过期删除策略

惰性删除+定期删除组合策略

猜你喜欢

转载自blog.csdn.net/u010634066/article/details/88723143