【学习Redis系列】Redis中的数据库
redisServer中dbnum,db数组记录了服务器中数据库相关的数据。

bnum为创建的数据库数量,通常默认配置为16,即下图conf配置文件中的databases值。

redisDb * db; 这个db数组,保存着服务器中所有的数据库,数组大小由dbnum决定.
redisDb数据库使用字典作为底层实现的,Redis中字典的实现。

成员dict,这个字典称为键空间。这个键空间的键是一个字符串对象,键空间的值可以是五种数据库对象的任意一种。
成员expires,这个字典记录的是带有过期时间的数据库键,这个键空间的键是一个指向数据库键的指针,这个键空间的值是一个longlong类型的整数,即数据库键的过期时间。毫秒精度的UNIX时间戳。
成员blocking_keys, ready_keys放到后文说队列时候说。
成员watched_keys,这个字典的键是被WATCH命令监视的数据库键,字典的值是监视这个数据库键的客户端组成的链表. 这个也放到后面说事务的时候说(又一个放到后面的0.0)
成员id,这个就是当前数据的ID
数据库进行操作:
1.对数据库键的CRUD操作就是对dict这个字典进行操作,FLUSHDB即删除字典中所有的键值对。
2.为数据库键添加一个过期时间
EXPIRE <key><ttl> 为key设置ttl秒后过期(从当前时间算起ttl秒后过期)
PEXPIRE<key><ttl> 为key设置ttl毫秒后过期(从当前时间算起ttl毫秒后过期)
EXPIREAT<key><ttl> 为key设置时间戳到达时间ttl秒后过期
PEXPIREAT<key><ttl> 为key设置时间戳到达时间ttl毫秒秒后过期
这四个命令都用来设置过期时间
本质都是调用PEXPIREAT为这个键设置一个毫秒级别的过期时间戳,像expires字典中添加这个键值对 。
PERSIST移除过期时间 PERSIST<key>,TTL<key>计算并返回剩余生存时间
2.1 过期键的几种删除策略。
1).定时删除 : 设置键的过期时间时,设置定时器,当键的过期时间来临时,删除该键。
定时删除能够保证过期键尽快删除,节约内存,但是在过期键比较多的情况下,删除操作可能会占用大量的cpu时间,在内存不紧张cpu紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,
将对服务器的响应时间和吞吐量造成影响。
服务器的cpu资源应该着重于服务上,而不是大量的删除操作中。同时,定时器要用到Redis服务器中的时间事件,时间事件使用的无序链表保存(通常只有一个serverCron时间事件),查找一个事件的复杂度为O(n)。不能高效处理大量时间事件。
2).定期删除:每隔一段时间,进行一次数据库检查,删除过期键。时间太久,删除太多。则会与定时删除相仿。时间过少,删除太少,则会与惰性删除相仿。所以删除策略的把控比较重要
3).惰性删除:占用大量内存空间,只有用到该键才进行过期判定,对CPU友好,不会额外占用CPU执行删除。
Redis的过期键删除策略:采用定期删除+惰性删除配合的策略
Redis惰性删除流程:先对读写的输入数据库键进行过期检测。通过调用函数db.c / expireIfNeeded(redisDb *db, robj *key)。如果键过期则删除过期键。

Redis定期删除流程 redis.c / activeExpireCycle函数实现 void activeExpireCycle(int type),只截取了部分代码段,中间也删掉了很多代码。
备注的部分是大致的流程,具体的细节可结合代码细品,我是没品动,择日再品。


浙公网安备 33010602011771号