redis设计与实现(四)服务器中的数据库

服务器中的数据库

Redis服务器将所有数据库都保存在服务器状态server.h结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。

在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库:

dbnum属性的值由服务器配置的database选项决定,默认情况下,该选项的值为16,所以Redis服务器默认会创建16个数据库

每个Redis客户端都有自己的目标数据库,每当客户端执行数据库写命令或者数据库读命令的时候,目标数据库就会成为这些命令的操作对象。默认情况下,Redis客户端的目标数据库为0号数据库,但客户端可以通过执行SELECT命令来切换目标数据库。

redis> SET msg "hello world"
OK
redis> GET msg
"hello world"
redis> SELECT 2
OK
redis[2]> GET msg
(nil)
redis[2]> SET msg"another world"
OK
redis[2]> GET msg
"another world"

数据库的键空间

Redis是一个键值对(key-value pair)数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key space):

  • 键空间的键也就是数据库的键,每个键都是一个字符串对象。

  • 键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。

在这里插入图片描述

  • 在读取一个键之后(读操作和写操作都要对键进行读取),服务器会根据键是否存在来更新服务器的键空间命中(hit)次数或键空间不命中(miss)次数,这两个值可以在INFO stats命令的keyspace_hits属性和keyspace_misses属性中查看。

  • 在读取一个键之后,服务器会更新键的LRU(最后一次使用)时间,这个值可以用于计算键的闲置时间,使用OBJECT idletime命令可以查看键key的闲置时间。

设置键的生存时间或过期时间

通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL),在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。TTL命令和PTTL命令返回这个键的剩余生存时间

过期删除策略:

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

  • 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。

定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用的内存。

时删除策略的缺点是,它对CPU时间是最不友好的:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间。

惰性删除策略对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何CPU时间。

在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB)

定期删除策略是前两种策略的一种整合和折中:

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

  • 除此之外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。

惰性删除策略的实现:

  • 如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除。

  • 如果输入键未过期,那么expireIfNeeded函数不做动作。

定时删除策略的实现:

过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。

AOF、RDB和复制功能对过期键的处理

在执行SAVE命令或者BGSAVE命令创建一个新的RDB文件时,程序会对数据库中的键进行检查,已过期的键不会被保存到新创建的RDB文件中。

举个例子,如果数据库中包含三个键k1、k2、k3,并且k2已经过期,那么当服务器启动时:

  • 如果服务器以主服务器模式运行,那么程序只会将k1和k3载入到数据库,k2会被忽略。

  • 如果服务器以从服务器模式运行,那么k1、k2和k3都会被载入到数据库。

当服务器以AOF持久化模式运行时,如果数据库中的某个键已经过期,但它还没有被惰性删除或者定期删除,那么AOF文件不会因为这个过期键而产生任何影响。

举个例子,如果客户端使用GET message命令,试图访问过期的message键,那么服务器将执行以下三个动作:1)从数据库中删除message键。2)追加一条DEL message命令到AOF文件。3)向执行GET命令的客户端返回空回复。

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

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

  • 从服务器在执行客户端发送的读命令时,即使碰到过期键也不会将过期键删除,而是继续像处理未过期的键一样来处理过期键。

  • 从服务器只有在接到主服务器发来的DEL命令之后,才会删除过期键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/700909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS从入门到精通——背景样式

目录 背景颜色 任务描述 相关知识 背景色 编程要求 背景图片 任务描述 相关知识 背景图片 设置背景图片 平铺背景图像 任务要求 背景定位与背景关联 任务描述 相关知识 背景定位 背景关联 简写背景 编程要求 背景颜色 任务描述 本关任务:在本关…

PHP框架详解- symfony框架

GPT-4 (OpenAI) Symfony 是一个用 PHP 语言编写的开放源代码的 web 应用框架。Symfony 提供了一组可重用的组件和一个标准化、可扩展的框架,用于构建 web 应用、API、微服务等。它跟其他流行 PHP 框架(比如 Laravel)一样,旨在加快…

MySQL查询ab字段相同取时间最大的一条数据

MySQL是一个开源的关系型数据库管理系统,被广泛用于各种Web应用程序和大型企业级数据库系统。在实际应用中,经常会遇到需要查询某个字段相同的多条数据中,取时间最大的一条数据的需求。本文将通过代码示例来详细介绍如何使用MySQL实现这一功能…

内网Docker镜像无法使用?Debian/Ubuntu离线安装Dokcer

离线安装Docker Centos7停止技术支持,Dockerhub国内镜像也用不了,该教程只解决debian/ubuntu如何离线安装docker 卸载冲突的包 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done先…

Kafka生产者消息发送流程原理及源码分析

Kafka是一个分布式流处理平台,它能够以极高的吞吐量处理数据。在Kafka中,生产者负责将消息发送到Kafka集群,而消费者则负责从Kafka集群中读取消息。本文将探讨Kafka生产者消息发送流程的细节,包括消息的序列化、分区分配、记录提交等关键步骤。 先看一个生产者发送消息的代…

【QT】记录一次QT程序发布exe过程

记录一次QT程序发布exe过程 使用windeploy与enigma发布独立的QT程序第一步 QT编译输出 **release** 版本第二步 QT 自带 windepoyqt 补全链接库第三步 enigma virtual box压缩打包为单一exe最后【2024-06-07 17】- 【补充】 贴一个自己用的bat脚本【**QtDeploy2exe.bat**】半自…

python数据分析--- ch3-5 python数字类型、算术运算符及流程控制语句

python数据分析--- ch3-5 python数字类型、算术运算符及流程控制语句 1.Ch3--数字类型的数据1.1 Python中的数据类型1.1.1整数类型(int)1.1.2 浮点类型(float)1.1.3复数类型(complex)1.1.4 布尔类型(bool) 1.2 数字类型的相互转换1.2.1 隐式类型的转换1.2.2 显式类型的转换 2. …

Python编程基础5

邮件编程 SMTP(Simple Mail Transfer Protocol)简单邮件传输协议,使用TCP协议25端口,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。…

惠州惠城:可燃气体报警器定期校准检测,安全更放心

在惠州惠城这片繁华的土地上,工业发展日新月异,安全问题愈发受到重视。其中,可燃气体报警器作为预防火灾和爆炸事故的重要设备,正在越来越多的场所得到应用。 今天,佰德就来探讨一下可燃气体报警器在惠州惠城的重要性…

实测 WordPress 最佳优化方案:WP Super Cache+Memcached+CDN

说起 WordPress 优化加速来可以说是个经久不衰的话题了,包括明月自己都撰写发表了不少相关的文章。基本上到现在为止明月的 WordPress 优化方案已经固定成型了,那就是 WP Super CacheMemcachedCDN 的方案,因为这个方案可以做到免费、稳定、安…

计算机网络知识CIDR(无类别域区间路由)

目录 介绍 基本信息 优点与关联 如何计算判定范围(你应该是来看这个的,前面是水字数的) 省流版 介绍 无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配IP地址以及在互联网上有效地路由…

STM32项目分享:智能蓝牙手环

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片: 哔哩哔哩视频链接: https://www.bilibili.c…

PCA与LDA

共同点 降维方法: PCA和LDA都是数据降维的方式,它们都能通过某种变换将原始高维数据投影到低维空间。 数学原理: 两者在降维过程中都使用了矩阵特征分解的思想,通过对数据的协方差矩阵或类间、类内散度矩阵进行特征分解&#xff…

鸿蒙低代码开发的局限性

在版本是DevEco Studio 3.1.1 Release,SDK是3.1.0(API9) 的基础上。 1、低代码插件没有WebView组件。 2、低代码插件没有空白的自定义组件,当前提供的所谓自定义组件,只能用列表中提供的组件来拼接新的组件。 3、使用ets代码自定义的组件&…

bugku--web---baby lfi

1、题目描述 2、页面提示使用language参数 3、构造url:/?languagefr。页面有回显 4、这里提示包含关键的文件 5、构造url:/?language/etc/passwd 6、flag shellmates{10CA1_F11e_1Nc1US10n_m4y_r3ve4l_in7Er3st1nG_iNf0Rm4t1on}

单北斗定位手持终端的优势

在追求精准与效率的现代生活中,单北斗定位手持终端以其独特优势,为众多行业领域带来了前所未有的便利与安全保障。凭借北斗卫星导航系统的高精度定位能力,这款单北斗定位手持终端不仅能在复杂环境中实现厘米级别的位置锁定,还具备…

五分钟“手撕”二叉树

代码放开头,供大家查阅。 但是对于树来说,更重要的是理解树的概念,树的概念很多,题却是千篇一律,这篇博客详细的讲解了概念,看完必有很大的收获。 目录 一、实现代码 二、什么是树 三、树的重要概念 四…

探索未来教育的智慧教学整体架构:数字化时代的教育革命

在数字化时代,教育领域也正在经历着前所未有的变革和创新。智慧教学整体架构作为教育技术与教学实践的完美结合,正在成为推动教育革命的关键力量。本文将深入探讨智慧教学整体架构的概念、核心组成部分以及其在未来教育中的应用前景。 **智慧教学整体架构…

C++设计模式---装饰器模式

1、介绍 装饰器(Decorator)模式是一种结构型设计模式,它允许你动态地给一个对象添加额外的职责。 装饰器模式主要用于扩展对象的功能,而又不改变其原有结构。在C中,装饰器模式主要应用于那些需要为对象动态添加功能或改…

IO流的转换流

目录 ​编辑 转换流 利用转换流按照指定字符编码读取 利用转换流按照指定字符编码写出 将本地文件中的GBK文件。转成UTF-8 练习 序列化流 反序列化流 /对象操作输入流 序列化流/反序列化流的细节 练习 转换流 是字符流和字节流之间的桥梁 字符转换输入流:InputS…