Redis 的设计与实现——之(六)Redis数据库的实现与过期机制

Redis服务器的数据库实现~

redisServer 在启动的时候默认启动16个数据库,每个redisClient有自己连接的db,记录在redisClient的db属性里,客户端可以切换自己链接的db.

不难理解,其实每个db都有一个dic字典,保存key与value,我们的set也是将key与value设置到里面,删除、更新同理。在对键进行访问时,会维护lru、更新dirty值等信息如下图所示

其他的命令,如FLUSHDB命令,其实是删除了dict中的内容。

过期机制

在db中有一个dict *expires 属性用于保存key的过期时间,可以通过PEXPIREAT命令设置,PERSIST清除。

那么过期键又应该如何清除呢?

       传统的删除策略一共有三种,定时清除(占用cpu)、惰性清除(浪费内存)、定期删除(这个期限不好确定)。而Redis采用了惰性删除与定期删除两种策略。

惰性删除:

              每次访问前先看一下是不是过期了,过期的话就进行删除,没过期就什么也不做。

定期删除:

              Redis.c文件中有一个serverCron函数,每秒调用server.hz次,执行一些定时任务,其中databasesCron()中调用了定期删除过期activeExpireCycle这个函数,按照一定策略每次对一些数据库随机检查一些键进行操作

此外,在AOF,RDB中又如何处理过期键呢?

       生成RDB时会排除过期键,载入RDB文件时,如果是主库载入则排除过期键,如果是从库载入则都载入,但是主从同步的时候也会被删除掉。、

              生成AOF的时候会对过期键生成一条DEL命令,重写的时候也不重写过期键;

              主从同步的时候,主服务器会向所有的服务器发送删除过期键的指令,从服务器只有在收到命令时才进行删除,所以如果某个键过期,访问从库时可能还能拿到它的值。

数据库发送通知功能的实现

       该功能允许用户订阅某类或者某个或者全部的键操作的通知。

 

发布了47 篇原创文章 · 获赞 8 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/nanchengyu/article/details/89337965