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

相关文章

来自专栏肖力涛的专栏

Spark 踩坑记:数据库(Hbase+Mysql)

在上篇《spark踩坑记—— 初试》文章中,给大家讲述了spark的基本概念和简要操作 ,这篇文章将对spark操作hbase和mysql的内容进行总结,并且对...

1.4K1
来自专栏技术之路

[个人翻译]Redis 集群教程(中)

官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我...

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

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(四)调整 App.vue 和 router 路由

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(四)调整 App.vue 和 router 路由 前情回顾 在上一篇《V...

2069
来自专栏云计算

用 Cricket 在 Java 环境里构建极简的内容管理服务器

原文地址:https://dzone.com/articles/minimalistic-cms-microservice-for-java

1545
来自专栏腾讯云容器服务团队的专栏

腾讯云容器服务监控体系详解

腾讯云容器服务监控系统可以监控集群中所有的节点,服务,实例,容器的相关信息,并且以曲线的方式展示给用户,同时支持多种粒度的统计方式。本文将讲解容器监控框架和指标...

4850
来自专栏黑白安全

Linux新手渗透指南:从枚举到内核利用

许多人都认为Linux是最安全的操作系统,因此在对Linux的安全问题上也放松了警惕。那么事实真的如此吗?其实安全从来都只是相对的,Linux也不例外。虽然它加...

863
来自专栏刘远的专栏

airflow—服务失效监控(5)

因为DAG文件会在调度器和worker执行时加载,如果在DAG中引用了第三方的库或进行了DB操作,则这些操作会在DAG文件加载时被频繁调用。举个例子,如果升级了...

1203
来自专栏技术文章

资深专家深度剖析Kubernetes API Server第1章(共3章)

欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现。如...

1082
来自专栏性能与架构

Nginx 配置文件安全分析

简介 Gixy 是一个 Nginx 配置文件的分析工具,主要目标是防止由于不当的配置带来的安全问题 Gixy 是进行静态分析,只需要指定配置文件的路径,不需要启...

3129
来自专栏区块链

Web安全常见漏洞修复建议

看各大发布漏洞的平台,发现众多挖洞大神精彩的漏洞发掘过程,但在修复建议或者修复方案处,给出千奇百怪神一般的回复,故而总结一下修复建议(才疏学浅不算太全敬请谅解,...

2026

扫码关注云+社区