redis之数据库

redis服务器将所有数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDb结构,每个redisDb代表一个数据库
在这里插入图片描述
默认情况下,redis服务器会创建16个数据库
每个redis客户端都有自己的目标数据库,默认情况下,redis客户端的目标数据库为0号数据库,但是客户端可以通过执行select命令来切换数据库。
在服务器内部,客户端状态redisClient结构的db属性记录了客户端当前的目标数据库,db时一个执行redisDb结构的指针
在这里插入图片描述
数据库的键空间
redis是一个键值对数据服务器,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典成为键空间
在这里插入图片描述
键空间和用户所见数据库是直接对应的:
1、键空间的键也就是数据库的键,每个键都是一个字符串对象
2、键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象、有序集合对象中的任意一种redis对象
在这里插入图片描述
添加新建
添加一个新键值对到数据库,实际上就是将一个新键值对添加到键空间字典里面
删除键
删除数据库中的一个键,实际上就是在键空间里面删除键所对应的键值对像
更新键
对一个数据库键进行更新,实际上就是对键空间里面键所对应的值对象进行更新
对键取值
对一个数据库键进行取值,实际上就是在键空间中取出键所对应的值对象
读写键空间时的维护操作
1、当读取一个键之后,服务器会根据键是否存在来更新服务器的键空间命中次数或键空间不命中次数
2、在读取一个键之后,服务器会更新键的LRU时间,这个值可以用于计算键的闲置时间
3、如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后才执行余下的其他操作
4、如果有客户端使用watch命令监视了某个键,那么服务器在对监视的键进行修改之后,会将这个键标记为dirty,从而让事务程序注意到这个键已经被修改
5、服务器每次修改一个键之后,都会对脏计数器增一,这个计数器会触发服务器的持久化以及复制操作
设置键的生存时间或过期时间
通过expire或者pexpire命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键
通过expireat或者pexpireat命令,以秒或者毫秒精度给数据库中的某个键设置过期时间

保存过期时间
redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典:
1、过期字典的键是一个指针,这个指针指向键空间中的某个键对象
2、过期字典的值是一个long long类型的整数,这个整数就保存了键所指向的数据键的过期时间
在这里插入图片描述
在实际中键空间的键和过期字典的键都指向同一个键对象,多以不会出现任何重复对象,也不会浪费任何空间
移除过期时间
persist命令可以移除一个键的过期时间,他会在过期字典中查找给定的键,并解除键和值在过期字典中的关联
计算并返回剩余生存时间
TTL命令以秒为单位返回键的剩余生存时间,而PTTL命令则以毫秒为单位返回键的剩余生存时间
过期键的删除策略
对于过期键的删除可能有下面三种策略:
1、定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作
2、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都会检查取得的键是否过期,如果过期的化,就删除改键;如果没有过期,就返回改键
3、定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则有算法决定
从这三种策略上来看,前两种都有比较明显的缺点:
1、定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量
2、惰性删除浪费太多内存,有内存泄漏的危险
定期删除策略是前两种策略的一种整合和折中:
1、定期删除策略每隔一段时间来执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。
2、除此之外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来地内存浪费
redis中采用的是惰性删除和定期删除的策略:
惰性删除策略的实现
所有读写数据库的redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查:
1、如果输入键已经过期,那么expireIfNeeded将输入键从数据库中删除
2、如果输入键未过期,那么expireIfNeeded不做动作
在这里插入图片描述
定期删除策略的实现
过期键的定期删除策略有activeExpireCycle函数实现,每当redis的服务器周期性操作serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键
AOF、RDB和复制功能对过期键的处理
生成RDB文件:在执行SAVE命令或者BGSAVE命令创建要给新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中
载入RDB文件:在启动Redis服务器时,如果服务器开启了RDB功能,那么服务器将对RDB文件进行载入
1、如果服务器以主服务器模式运行,那么在载入RDB文件时,程序会对文件中保存的键进行检查,为火气的键会被载入到数据库中,而过期键则会被忽略
2、如果服务器以从服务器模式运行,那么在载入RDB文件时,文件中保存的所有键,不论是否过期,都被被载入到数据库中
AOF文件写入:当服务器以AOF持久化模式运行时,如果数据库中的某个键已经过期,但他还没有被惰性删除或者定期删除,那么AOF文件不会因为这个而产生任何影响。当过期键被惰性删除或者定期删除之后,程序会向AOF文件按追加一条DEL命令,来显示的记录改键已被删除。
AOF重写:在执行AOF重写的过程中,程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中。
复制
当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值