Redis内部原理简介

知道了Redis的各种数据结构,对象结构,那么Redis是如何保存数据的,又是如何操作数据的呢,Redis里面的命令是怎么实现的呢?这一系列问题值得我们思考

一.Redis维护多个数据库

Redis内部维护一个db数组,每个db都是一个数据库,默认情况下Redis会创建16个数据库。我们可以通过select命令来切换数据库,如select1切换到数据库号为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使用一个过期字典记录所有带过期时间的键,字典的键指向键空间中的某个键对象,字典的值是一个longlong类型的整数,这个证书保存了键空间所指向的数据库键的过期时间。通过过期字典,程序可以检查一个给定键是否过期,检查给定键是否存在于过期字典,如果存在,取得键的过期时间,检查当前时间戳是否大于键的过期时间,如果是的话,键已经过期,否则键未过期。

四.过期键的删除策略

如果一个键过期了,那么它什么时候被删除呢?通常我们可以用三种删除策略删除过期键

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文件追加一条删除命令,记录键已被删除。

猜你喜欢

转载自blog.csdn.net/aa1215018028/article/details/80644358