redis的设计与实现(四)——单机数据库特性

1. 前言

我们前面了解了redis的数据结构,对象。但是redis对于这些对象的使用和管理策略需要也熟记于心,这篇文章我们就了解一下吧。

2. 类型检查和命令多态

在这里插入图片描述

  • DEL,EXPIRE,RENAME,TYPE,OBJECT 可以对任何数据类型执行
  • SET,GET,APPEND,STRLEN,等只能对字符串执行
  • HDEL,HSET,HGET,HLEN,等只能对哈希键执行
  • RPUSH,LPOP,LINSERT,LLEN,等只能对列表键执行
  • SADD,SPOP,SINTER,SCARD,等只能对集合键执行
  • ZADD,ZCARD,ZRANK,ZSCORE,等只能对有序集合键执行

如何实现的类型检查?
在这里插入图片描述
在这里插入图片描述

  1. 在执行llen命令之前,确保对象内type是不是命令对应类型
  2. 如果是的话就执行
  3. 否则就返回上图类型错误

如何实现通用命令多态?

  • 实际上不仅是通用命令是多态,像llen也是多态实现,由于列表底层可以是压缩列表或者或链表,所以获取元素数量的内置操作是不同的。
  • 所以内部会进行if操作,如果是ziplist就执行ziplistLen如果是链表就使用listlength获取长度

而这些通用命令也是一样的思路。

3. 内存回收策略

c 语言不具备内存回收功能,所以redis自行实现了,内存回收。使用的策略是引用计数策略和 jvm 的可达性分析不一样。

  • 当创建一个对象的时候,引用数设置为1
  • 当被一个新程序使用的时候,引用数加1
  • 不被一个程序使用的时候,引用数减1在这里插入图片描述
    对象的生命周期包括:创建对象,操作对象,和释放对象

4. 对象共享

对象共享的目的是节约内存,实际上和 java 语言类似。

redis内部已经实现了这些,但是我们理解内部过程对于熟练使用redis极为重要。

  • redis 在初始化的时候会创建1w(0-9999)个整数字符串
    在这里插入图片描述
    我们可以看到1这个证书字符串,居然整数1被引用率2147483647之多。这种思路在java中integer有点类似,integer在创建之初就有-128-127的缓存。

另外,这些共享对象不单单只有字符串键可以使用,那些在数据结构中嵌套了字符串对象的对象(linkedlist编码的列表对象、hashtable编码的哈希对象、hashtable编码的集合对象,以及zset编码的有序集合对象)都可以使用这些共享对象。

5. 对象空转时长

redisObject中还有最后一个属性,lru,长度为22字节
在这里插入图片描述
这个属性记录了上次使用时间,当前之间减去lru可以计算出空转时长

如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时,空转时长较高的那部分键会优先被服务器释放,从而回收内存

6. 数据库

  1. redisDb *d保存着redis中所有数据库
    在这里插入图片描述
  2. redis会根据dbnum决定数据库创建的数量,默认是16.
    在这里插入图片描述
  3. 通过select可以选择数据库
    在这里插入图片描述
    redisClient中*db记录了当前数据库
    在这里插入图片描述
  4. reids 全数据字典
    在这里插入图片描述
    redis所有的数据都是key-value,redisDb数据结构中,dict中保存了所有数据的key-value。如果添加数据,就是向dict中添加值。

6.1. 过期键的删除策略

在这里插入图片描述
过期时间并非保存在对象内,而是另外开了一个字典exoires,专门用于保存对象的生存时间。好处是集中处理更便捷。

  • 定时删除
    使用定时器定期对对象删除
  • 惰性删除:
    等读取时,进行过期判断
  • 定期删除:
    使用定时器,不过限制删除的时间,相当于降低了延迟,降低了吞吐,是一个中庸的方法。

6.2. rdb和aof对过期键的处理

  1. rdb不保存处理
    如果rdb存储键值的时候会对过期键进行过期检查,只有非过期的键才会保存持久化。
  2. aof的不理睬处理
  • aof一般情况下并不会关系键是否过期,因为aof跟踪数据库状态,除非系统处理过期键,然后aof会追加和系统相同的删除命令。
  • 当然,如果aof进行了重写,这时候的思路就和rdb类似,会对过期键理睬,只保存不过期的键,因为aof重写本身就是一个类rdb的行为。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

芯片工程系列(5)2.5D 3D封装

0 英语缩写 硅通孔(Through Silicon Via,TSV)硅中介层(Silicon Interposer)物理气象沉淀法(Physical Vapor Deposition,PVD)DRIE、CVD、PVD、CMP等设备CoWoS(Chip on Wa…

JAVA学习笔记19(面向对象编程)

1.面向对象编程 1.1 类与对象 1.类与对象的概念 ​ *对象[属性]/[行为] ​ *语法 class cat {String name;int age; }main() {//cat1就是一个对象//创建一只猫Cat cat1 new Cat();//给猫的属性赋值cat1.name "123";cat1.age 10; }​ *类是抽象的,…

【旅游景点项目日记 | 第二篇】基于Selenium爬取携程网景点详细数据

文章目录 3.基于Selenium爬取携程网景点详细数据3.1前提环境3.2思路3.3代码详讲3.3.1查询指定城市的所有景点3.3.2获取详细景点的访问路径3.3.3获取景点的详细信息 3.4数据库设计3.5全部代码3.6效果图 3.基于Selenium爬取携程网景点详细数据 3.1前提环境 确保安装python3.x环…

React高阶组件(HOC)

高阶组件的基本概念 高阶组件(HOC,Higher-Order Components)不是组件,而是一个函数,它会接收一个组件作为参数并返回一个经过改造的新组件: const EnhancedComponent higherOrderComponent(WrappedCompo…

腾讯云GPU云服务器_GPU云计算_异构计算_弹性计算

腾讯云GPU服务器是提供GPU算力的弹性计算服务,腾讯云GPU服务器具有超强的并行计算能力,可用于深度学习训练、科学计算、图形图像处理、视频编解码等场景,腾讯云百科txybk.com整理腾讯云GPU服务器租用价格表、GPU实例优势、GPU解决方案、GPU软…

HarmonyOS实战开发-如何使用首选项能力实现一个简单示例。

介绍 本篇Codelab是基于HarmonyOS的首选项能力实现的一个简单示例。实现如下功能: 创建首选项数据文件。将用户输入的水果名称和数量,写入到首选项数据库。读取首选项数据库中的数据。删除首选项数据文件。 最终效果图如下: 相关概念 首选…

学习vue3第十节(插槽v-slot)

本节主要介绍一下 v-slot 插槽指令&#xff0c;以及插槽相关内容 1、定义&#xff1a; 子组件给父组件提供使用的一个位置&#xff0c;使用<slot></slot>表示&#xff0c;父组件可以在这个位置填充任何代码&#xff1b; 2、默认插槽 匿名插槽&#xff1a;会自定…

简单使用Swagger

文章目录 1、介绍2、 使用步骤3、 常用注解 1、介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的文…

基于SSM非遗视域下喀什旅游网站

ssm非遗视域下喀什旅游网站的设计与实现 摘要 我们的生活水平正在不断的提高&#xff0c;然而提高的一个重要的侧面表现就是更加注重我们的娱乐生活。旅行是我们都喜欢的一种娱乐方式&#xff0c;各式各样的旅行经历给我们带来的喜悦也是大不相同的。带来快乐的同时也因为其复…

微信小程序实现多张照片上传

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;code袁 &#x1f4a5; 所属专栏&…

第一篇:概述、 目录、适用范围及术语 --- IAB/MRC《增强现实(AR)广告(效果)测量指南1.0 》

第一篇&#xff1a;概述、目录、适用范围及术语 - IAB与MRC及《增强现实广告效果测量指南1.0》 --- 我为什么要翻译美国IAB科技公司系列标准 ​​​​​​​​​​​​​​ 翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效…

6.3 BP神经网络

在多层感知器被引入的同时&#xff0c;也引入了一个新的问题&#xff1a;由于隐藏层的预期输出并没有在训练样例中给出&#xff0c;隐藏层结点的误差无法像单层感知器那样直接计算得到。 为了解决这个问题&#xff0c;反向传播&#xff08;BP&#xff09;算法被引入&#xff0…

推荐一种Bean注入方式——开发经验

我们都知道三种Bean注入的方式分别是属性注入&#xff0c;setter方法注入&#xff0c;构造器注入。这三种Bean注入的方式各有优缺点&#xff0c;但是相对来说更推荐使用构造器注入的方式。 1、构造器注入的优缺点 优点&#xff1a; 1、可以注入不可变对象 因为构造方法注入是…

Redis技术学习|实战项目记录|商户缓存

学习资料声明 黑马程序员的Redis学习视频&#xff1a;黑马程序员Redis入门到实战教程 需要用到的知识&#xff1a;linux&#xff08;推荐韩顺平老师的教程&#xff0c;学到p30&#xff0c;创建好虚拟机和简单的几个命令就好。&#xff09;SSM。SpringBoot。 还用到了MybatisPl…

mac 解决随机出现的蓝色框

macbookair为什么打字的时候按空格键会出现蓝色框? - 知乎

c#矩阵求逆

目录 一、矩阵求逆的数学方法 1、伴随矩阵法 2、初等变换法 3、分块矩阵法 4、定义法 二、矩阵求逆C#代码 1、伴随矩阵法求指定3*3阶数矩阵的逆矩阵 &#xff08;1&#xff09;伴随矩阵数学方法 &#xff08;2&#xff09;代码 &#xff08;3&#xff09;计算 2、对…

橘子疾病检测4种YOLOV8

橘子检测YOLOV8&#xff0c;检测4种疾病&#xff0c;采用YOLOV8-NANO&#xff0c;训练得到PT模型转换成ONNX&#xff0c;最后OPENCV调用&#xff0c;支持C/PYTHON/ANDROID 橘子检测YOLOV8&#xff0c;检测4种疾病

阿里云4核16G服务器优惠价格26元1个月、149元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年。2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也…

Ubuntu18.04桌面版设置静态IP地址

引用: Ubuntu配置静态IP_ubuntu配置静态ip地址-CSDN博客 正文 默认Unbuntu 18.04 Desktop桌面版使用 netplan 管理网卡网络地址。使用Unbuntu 18.04 桌面版配置&#xff0c;可以通过桌面上的设置图标配置网卡的静态IP地址。 点击桌面右上角下拉框&#xff0c;点击“设置”按…

206.反转链表

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…