《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

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PHP实战技术

你应该这个姿势学习php(3)

输出缓冲区的内容,如果你想获取缓冲区的内容要在这个函数之前使用ob_get_contents(),不然数据将会被清空

42014
来自专栏Laoqi's Linux运维专列

Memcached数据操作

1044
来自专栏python成长之路

返回固定页面的web服务器

1374
来自专栏地方网络工作室的专栏

Python3 初学实践案例(8)使用 sqlite3 数据库存储生成的密码,prettytable 的使用

Python3 初学实践案例(8)使用 sqlite3 数据库存储生成的密码,prettytable 的使用 在前面我用 python 脚本实现的 cli 版本...

2515
来自专栏博客园

功能接口

         定义对基于ClaimsPrincipal识别用户的支持以及指定验证处理程序

824
来自专栏Java呓语

第7章、备份与恢复

默认情况下mysqldump导出的是标准的SQL语法,因此你可以使用标准输出写入文件。

542
来自专栏我是攻城师

小知识之Linux系统中的最大进程数,最大文件描述,最大线程数

3334
来自专栏开发与安全

linux系统编程之文件与I/O(五):文件的内核结构file和dup实现重定向

一、打开文件内核数据结构 1、一个进程打开两个文件 ? 文件状态标志:读、写、追加、同步、非阻塞等 2、一个进程两次打开同一文件 ? 3、两个进程打开同一文...

1919
来自专栏Laoqi's Linux运维专列

初识 MongoDB 服务

973
来自专栏mySoul

ejs koa

npm https://www.npmjs.com/package/koa-static

984

扫描关注云+社区