Redis数据库的实现原理

知道了Redis的各种数据结构,对象结构,那么Redis是如何保存数据的,又是如何操作数据的呢,Redis里面的命令是怎么实现的呢?这一系列问题值得我们思考
一.Redis维护多个数据库
Redis内部维护一个db数组,每个db都是一个数据库,默认情况下Redis会创建16个数据库。我们可以通过select命令来切换数据库,如select 1切换到数据库号为1的数据库。select实现是通过修改客户端的db指针,通过指针指向不同的数据库来实现数据库的切换操作的。
需要注意的是,为了不造成操作数据库号错误,最好执行命令之前,手动select一下数据库。
二.数据库键空间
Redis是一个键值对数据库服务器,Redis通过字典保存了数据库中的所有键值对,我们将这个字典称为键空间。键空间的每个键都是一个字符串对象,键空间的值也就是数据库的值,可以是字符串对象,列表对象,哈希表对象,集合对象,有序集合对象中的任何一种。
1.添加新键
每次添加一个新键就是将一个新键值对添加到键空间里面,其中键为字符串对象,值为任意一种类型的Redis对象。
2.删除键
删除键就是在键空间里删除键所对应的键值对对象。
3.更新键
更新键就是对键空间里面键所对应的值对象进行更新。
4.查找键
查找键就是在键空间中取出键所对应的值对象。
每次在键空间读取一个键之后,服务器会更新键的LRU时间,用于计算键的闲置时间。如果服务器在读取一个键时发现该键已经过期,那么服务器会先删除这个过期键,然后才执行后续操作。如果有客户端使用watch命令监视了某个键,那么服务器在对被监视的键进行修改之后,会将这个键标记为dirty,从而让事务注意到这个键被修改过。服务器每次修改一个键之后,都会对键计数器的值+1,这个计数器用来触发服务器的持久化操作。如果服务器开启了数据库通知功能,那么在对键进行修改之后,服务器将按配置发送相应的数据库通知。
三.设置键的生存时间和过期时间
我们知道expire命令或者pexpire命令可以对一个键设置生存时间,经过指定的时间之后,服务器会自动删除生存时间为0的键。那么Redis是如何实现删除过期键的操作的呢?
Redis有四个命令可以设置键的过期时间,包括expire,pexpire,expireat,pexpireat,不过这四个命令最后都会转化成pexpireat命令来实现。
Redis使用一个过期字典记录所有带过期时间的键,字典的键指向键空间中的某个键对象,字典的值是一个long long类型的整数,这个证书保存了键空间所指向的数据库键的过期时间。通过过期字典,程序可以检查一个给定键是否过期,检查给定键是否存在于过期字典,如果存在,取得键的过期时间,检查当前时间戳是否大于键的过期时间,如果是的话,键已经过期,否则键未过期。
四.过期键的删除策略
如果一个键过期了,那么它什么时候被删除呢?通常我们可以用三种删除策略删除过期键
1.定时删除:在设置键过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,删除键
2.惰性删除:放任键过期不管,但是每次动键空间获取键时,都会检查键是否过期,如果过期,则删除。
3.定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。
这几种方式各有利有弊,首先定时删除对内存最友好,当一个键过期时,一定会删除这个键,释放内存。不过定时删除对CPU最不友好,在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间。此外,创建定时器需要用到Redis服务器中的时间时间,而当前时间时间的实现方式-无序链表查找一个事件的时间复杂度为O(N),不能高效地处理大量时间事件。
惰性删除策略对CPU是最友好的,但是对内存最不友好。如果一个键已经过期,这个键又保留在数据库中,那么内存就会一直占用不释放。
定期删除算是前两种策略的一种整合和折中,定期策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率减少删除操作对CPU时间的影响。定期删除过期键可以有效地减少因为过期键带来的内存浪费。
Redis过期键的删除使用惰性删除和定期删除两种策略配合使用。惰性策略比较好理解,所有读写数据库的命令执行之前都会对输入键进行检查,如果键过期,那么从数据库中删除键。定期删除策略的实现由Redis的serverCron函数来执行,这个函数每100ms执行一次,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,删除其中的过期键。
五.复制功能对过期键的处理
Redis复制主要包括RDB复制和AOF复制,在RDB复制中,每次执行SAVE或BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。载入RDB文件时,服务器也会对保存的键进行检查,如果键已过期,则不会载入。当使用AOF持久化模式运行时,当过期键被惰性删除或者定期删除之后,程序会向AOF文件追加一条删除命令,记录键已被删除。
参考内容:Redis设计与实现-黄健宏
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值