《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结

时间:2022-05-03
本文章向大家介绍《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

《Redis设计与实现》读书笔记(十三) ——Redis数据库其他内容与总结

(原创内容,转载请注明来源,谢谢)

一、RDB、AOF、复制对过期键的处理

1、RDB

创建RDB:在执行bgsave或save命令创建一个新的rdb文件时,redis会对数据库中的所有的键进行检查,已经过期的键不会被加入新的rdb文件中。因此过期键对创建RDB没有影响。

载入RDB:载入rdb文件时,会区分载入的这个redis服务器是主服务器还是从服务器。如果是主服务器,会检查所有的键,仅载入未过期的键;如果是从服务器,则无论是否过期都不载入,因为服务器会从主服务器上同步数据。

2、AOF

AOF写入:当一个键过期,但是键还没被惰性删除或定期删除,则AOF仍会将其写入到AOF文件中。当redis程序触发到删除该过期键的时候,会同时向AOF发送一条删除键的追加命令,就类似于正常的键被客户端通过del删除一样。

AOF载入:在载入AOF文件时,过期的键不会被载入,redis会检查键是否有过期,避免载入过期的键。

3、复制

当服务器运行在复制模式,从服务器过期键的删除由主服务器进行控制:

1)当主服务器要删除过期键,会显式向从服务器发送一条del指令,要求从服务器删除相应的键。

2)当客户端读取到从服务器的过期键,从服务器不会删除键,而是当作正常的键返回。从服务器只有接到主服务器del指令才会删除键,其自身不会删除键。

因此,redis的机制是通过主服务器控制从服务器的过期键,统一管理,统一删除。

大致流程如下图所示:

1)客户端访问从服务器的过期键,从服务器不会判断键是否过期,也不会删除过期的键,并且还会将键的结果返回给客户端。

2)当访问主服务器的键,主服务器会检查键是否过期,如果过期则删除过期的键,给客户端返回nil(空),并且给从服务器发送del key的指令,要求所有从服务器都删除该键。

二、数据库通知

1、设置方式

redis2.8开始新增的数据库通知功能,客户端可以通过监控给定的频道或者模式,来获取数据库中键的变化,以及数据库中命令的执行情况。

通知分为键空间通知和键事件通知,键空间是指某个键被哪些命令操作,键事件是指某个命令执行过几次的具体情况。

键空间通知:subscribe __keyspace@0__:key,监控0号数据库key键的操作情况;键事件通知:subscribe__keyevent@0__:del,监视del命令在0号数据库的执行情况。

除此之外,在redis配置文件中的选项notify-keyspace-events,可以配置服务器发送通知的类型:发送所有的键和事件通知,则值设置成AKE;发送所有键,设置成AK;发送所有事件,设置成AE;只发送和字符串有关的键空间通知,设置成K$;只发送列表事件,设置成El。

可以看出,A表示all,K表示key,E表示event,另外redis五大对象也有分别的字符表示。

2、发送通知实现

redis通过文件notify.c的函数notifyKeySpaceEvent实现发送通知,定义如下:

         void notifyKeySpaceEvent(int type, char*event, robj *key, int dbid)

type是通知类型,根据redis配置文件的notify-keyspace-events属性决定;event是事件的名称;key是事件的键;dbid是事件对应的数据库编号。

每当调用redis命令,redis都会先检查服务器的配置是否有开启通知,有的情况下,调用notifyKeySpaceEvent函数,再检查type类型,分别查看是否需要键空间通知和键事件通知,如果有,则执行通知。

三、总结

redis服务器的所有数据库都保存在redisServer结构的db属性中,数据库数量保持在dbnum属性中,用户通过修改数据库目标指针指向db的不同位置,实现数据库的切换。

数据库主要由dict和expires两个部分组成,dict保存数据库的键值对,expires保存键和键的过期时间,其中expires的键是指针指向dict的,并没有开辟新的空间存储键。

数据库是由字典构成,操作都是基于字典,键值对的键总是字符串对象,值可以是字符串、哈希、列表、集合、有序集合五种对象的任一种。

expires的键是指向数据库的键,其用unix的毫秒存储过期时间。并且redis中使用懒惰删除和定期删除两种策略,懒惰删除是访问到键且键校验过期才删除,定期删除是通过设定校验频率和校验数量来定期检查键是否过期,并删除过期的键。

当rdb备份时,无论是导出还是导入都会过滤掉过期的键,aof导入也会校验,aof的保存则不校验键过期,只有当收到删除键命令的时候追加del命令到aof文件。

主从结构中,从服务器不检查键是否过期,客户端对从服务器键的操作无论键是否过期,只要从服务器中有该键,就正常操作;主服务器会通过懒惰删除或定期删除来校验键,并且在删除过期键的时候,通知所有的从数据库同步删除,以确保主从结构的数据一致性。

当redis的键被修改或在数据库中执行某些命令,如果键、命令是被监听的,则监听的客户端会收到redis发来的通知。

——written by linhxx 2017.09.03