redisServer数据结构来表示服务器中的数据库,默认16个数据库,可以通过select命令进行数据库切换
![](https://img.haomeiwen.com/i13526929/d86f33444ba05a03.png)
服务器内部使用redisClient结构来表示客户端,其中redisDb记录客户端当前的目标数据库
![](https://img.haomeiwen.com/i13526929/9153081a8637230a.png)
服务器中的每个数据库都由一个redisDb结构表示,其中的dict字典保存了数据库中的所有键值对,可以对相应的键值对进行取值,增加,删除等操作。
![](https://img.haomeiwen.com/i13526929/f3ed14c2a947c186.png)
同样还可以使用EXPIRE,PEXPIRE等命令给数据库中的兼职对设置过期时间。对于过期的键,redis有三种不同的删除策略:
- 定时删除(主动删除):设置键的过期时间时就启动定时器,定时器在键过期时执行对键的删除操作
- 惰性删除(被动删除):每次从键空间中获取键时,如果过期就删除,没有过期就返回
- 定期删除(主动删除):每隔一段时间检查数据库,删除里面的过期键
其中定时删除对CPU不友好,惰性删除对内存不友好,定期删除是一种折中的策略。
对于定期检查,redis通过调用activeExpireCycle函数,在每次运行的时候都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键,同时通过current_db记录当前的检查进度,以便下次调用的时候能够继续检查。当服务器中的所有数据库都被检查一遍的时候,current_db变量重置为0,然后再次开始新一轮的检查工作。
![](https://img.haomeiwen.com/i13526929/6944d4dab59d426f.png)
网友评论