Redis学习之Redis服务器数据库实现

本文内容:

1.Redis服务器保存数据库的方法

2.客户端切换数据库的方法

3.数据库保存键值对的方法

4.数据库的添加,删除,查看,更新操作的实现方法

5.服务器保存键的过期时间的方法

6.服务器自动删除过期键的方法

7.服务器的复制模式

8.数据库通知功能的实现方法

1.服务器中的数据库

1.在redis.h文件中,有一个redisServer的结构体,该结构体中存在一个db数组,数组中存放的是一个个的数据库,为redisDb结构

2.Redis服务器默认会创建16个数据库

graphviz-6d5a23554720addffde00d34f9f6212498203291

2.切换数据库

1.每个Redis客户端都有自己的目标数据库,每当客户端执行对数据库的读写命令时,目标数据库就会成为这些命令的操作对象

2.默认情况下,Redis客户端的目标数据库为0号数据库,但是客户端可以通过select命令来进行数据库切换

QQ图片20190728152609

3.数据库键空间

键空间:

Redis是一个键值对数据库服务器,一个数据库由一个redisDb结构表示,redisDb结构的dict字典保存了该数据库所有的键值对,我们将这个字典叫做键空间

键空间的每个键都是一个字符串对象

键空间的键对应的值是五种对象中的任意一种(字符串对象,列表对象,哈希表对象,集合对象,有序集合对象)

graphviz-b1bea528da9b180dc035546f23f8956a242fc0f5

因为数据库的键空间是一个字典,所以对数据库的增删改查都是在该字典上进行的

4.读写键空间时的维护操作

1.在读取一个键之后,服务器会更具键是否存在来更新服务器的键空间命中次数或者键空间不命中次数

2.在读取一个键后,服务器会更新键的LRU时间,这个时间可以用来计算键的闲置时间

3.如果服务器在读取一个键时发现这个键已经过期,那么服务器会先删除这个过期键,然后才执行其他操作

4.如果客户端使用WATCH命令监视了某个键,那么服务器在对被监视的键进行修改之后,会将这个键标记为脏,从而让事物程序注意到这个键已经被修改过

5.服务器每次修改一个键之后,都会对脏键计数器的值增加1,这个计数器会触发服务器的持久化及复制操作

6.如果服务器开启了数据库通知功能,那么在对键进行了修改之后,服务器将按照配置发生相应的数据库通知

5.过期键删除策略

键的过期时间都保存在过期字典中

三种不同的删除策略:定时删除,惰性删除,定期删除

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作

惰性删除:放任键过期不管,只有当每次取得键的时候,如果键过期了就删除该键然后进行其他操作

定期删除:每隔一段时间,程序就对数据库进行一次检测,删除里面过期的键,至于删除多少个过期键,检测多少个数据库,则由算法决定

三种删除策略的优劣分析:

1)定时删除:

1.1)对内存友好,但是对CPU时间不友好,在内存不紧张但是CPU时间紧张的情况下,会对服务器的响应时间和吞吐量造成影响

1.2)定时删除需要定时器,每一个键就需要一个定时器,而且当前时间的实现方式是无序链表,查找一个时间事件的复杂度是O(N),这种无序链表的方式不能处理大量的时间事件

因此,要让服务器创建大量的定时器,从而实现定时删除策略的方式不合适,没有被redis采用

2)惰性删除

2.1)对CPU时间友好,但是对内存不友好

2.2)当键空间中存在大量的过期键,但是这些键一直都没有被访问的话,会造成内存泄漏,比如假设存储在redis中的是日志信息

3)定期删除-定时删除和惰性删除的折中策略

每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响

定期策略最难的就是确定删除操作执行的时长和频率

如果删除操作执行的太频繁或者执行的时间太长,那么定期删除策略就会退化成定时删除策略

如果删除操作执行的太少或者执行的时间太短,那么定期删除策略就会退化成惰性删除策略

所以,服务器必须根据自己的情况合理设置删除操作的执行时间和执行频率

redis服务器实际使用的是惰性删除策略和定期删除策略

6.RDB文件以及AOF文件

RDB文件:Redis持久化的一种方式,通过制定好的策略,按期将内存中的数据以镜像的方式转存到RDB文件中

生成RDB文件:已过期的键不会被保存到RDB文件中

载入RDB文件:生成RDB文件的时间和载入RDB文件的时间之间存在一定的时间差,这个时间差可能会导致某些键过期

当服务器以主服务器的模式运行时,那么载入RDB文件中过期的键会被忽略

当服务器以从服务器的模式运行时,那么载入RDB文件中过期的键不会被忽略

AOF文件:存储的是Redis每次执行的写命令

生成AOF文件:当服务器以AOF文件持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生任何影响,但是当过期键删除,程序会向AOF文件添加一条删除命令,来显示的记录该键已经被删除同时,数据库中包含过期的键不会对AOF的重写造成任何影响

7.服务器的复制模式

当服务器运行在复制模式下时,从服务器的过期键删除动作由主服务器控制,从服务器没有删除键的权利

1)主服务器删除一个过期键之后,会显式的向所有从服务器发送DEL命令,告知从服务器删除这个过期键

2)从服务器在执行客户端命令时,即使遇到过期键也不会处理,而是将过期键当作未过期的键一样使用

服务器采用复制模式的目的就是为了保证主从服务器数据一致性

8.数据库通知

通知功能:可以让客户端通过订阅给定的频道或模式,来获知数据库中键的变化,以及数据库中命令的执行情况

通过分为两类:键空间通知和键事件通知

键空间通知:某个键执行了什么命令

键事件通知:某个命令被什么键执行了

 

posted @ 2019-08-19 21:11  西*风  阅读(726)  评论(0编辑  收藏  举报