《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 条评论
登录 后参与评论

相关文章

来自专栏Java帮帮-微信公众号-技术文章全总结

Linux常用命令

Linux常用命令 常用指令 ls   显示文件或目录 -l 列出文件详细信息l(list) -a ...

3586
来自专栏用户2442861的专栏

push到github时,每次都要输入用户名和密码的问题

http://blog.csdn.net/yuquan0821/article/details/8210944

591
来自专栏专注研发

linux常用命令

     -a          列出当前目录下所有文件及目录,包括隐藏的a(all)

1011
来自专栏大数据学习笔记

Java程序设计(Java9版):第1章 Java开发环境配置 (Set up Java development environment)

第1章Java开发环境配置(Set up Java development environment) 工欲善其事,必先利其器。 — 《论语·卫灵公》 ...

27110
来自专栏逆向技术

逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复

           逆向实战第一讲,寻找OllyDbg调试工具的Bug并修复 首先我们要知道这个OD的Bug是什么. 我们调试一个UNICODE的窗口,看下其...

1947
来自专栏州的先生

在Django 2.0中定义Web服务API接口

1202
来自专栏扎心了老铁

Kazoo Python Zookeeper 选主

本文讲述基于zookeeper选主与故障切换的方法。我们的例子使用的是python。 使用的库是kazoo,安装方式 pip install kazoo  应用...

4274
来自专栏Java架构沉思录

一文读懂分布式Session常见解决方案

沉思君在之前的文章《谈谈HTTP状态保持》里介绍了有关HTTP状态保持的知识点,我们知道HTTP协议本身是无状态的,因此在使用HTTP协议进行通信的过程中,需要...

592
来自专栏我和PYTHON有个约会

Django来敲门~第一部分【4. 创建第一个模块应用】

**大成若缺,其用不弊。大盈若冲,其用不穷。大直若屈。大巧若拙。大辩若讷。静胜躁,寒胜热。清静为天下正 ** ——老子《道德经》

691
来自专栏java 成神之路

window 查找 java 进程中占用cpu比较高的线程

3529

扫码关注云+社区