Redis——数据库

1,Redis中redis.h/redisServer结 结构的db数组中的每一项都是一个redisDb结构。dbnum属性来决定应该创建多少个数据库,这个值由服务器配置的database选项决定,默认情况下是16。

struct redisServer{
    
    
	//一个数组,保存着服务器中的所有数据库
	redisDb *db;
	//服务器的数据库数量
	int dbnum;
}

2,在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,这个属性是一个指向redisDB结构的指针。Redis是一个键值对数据库服务器,服务器中每个数据库都由一个redis.h/redisDb结构表示。redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间。实际上对数据库进行操作就是对dict进行操作,重点是要对各个数据结构的操作熟悉。
3,Redis数据库还支持设置键的生存时间或过期时间,当达到过期时间的时候,服务器就会自动从数据库中删除这个键。
设置过期时间有4个命令EXPIRE、PEXPIREAT、EXPIREAT、PEXPIREAT。前3个命令最后都是调用PEXPIREAT命令实现的。
redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典。
4,过期键的删除策略
1)定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。这种策略对内存友好,但是对CPU不太友好。
2)惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键,如果没有过期,就返回该键。对CPU友好,对内存不友好。
3)定期删除 :每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少个过期键,以及要检查多少个数据库,则由算法决定。这种是上面两种的折中策略。如果定时的时间太长就变成了惰性删除,如果定时的时长太短就变成了定时删除。
Redis服务器使用的是惰性删除和定期删除这两种策略。
5,过期键惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
1)如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除
2)如果输入键未过期,那么expireIfNeeded函数不做操作
过期键定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用。函数每次运行时都从一定数量的数据库中取出一定数量的随机键进行检查,并删除其中的过期键。
6,数据库通知可以让客户端通过订阅给定的频道或模式,来获知数据库中键的变化,以及数据库中命令的执行情况。关于数据库通知功能的详细用法,Redis的官方文档已经做了很详细的介绍。

猜你喜欢

转载自blog.csdn.net/xiaoan08133192/article/details/115298988