Redis数据结构对象中的对象共享、对象的空转时长

对象共享

概述

除了用于实现引用计数内存回收机制之外,对象的引用计数属性还带有对象共享的作用。

在Redis中,让多个键共享同一个值对象需要执行以下两个步骤:

  • 1.将数据库键的值指针指向一个现有的值对象
  • 2.将被共享的值对象的引用计数增一

目前来说,Redis在初始化服务器时,创建一万个字符串对象,这些对象包含了从0到9999的所有整数值,当服务器需要用到值为0到9999的字符串对象时,服务器就会使用这些共享对象,而不是新创建对象

例子

  • 举个例子,假设键A创建了一个包含整数值100的字符串对象作为值对象,如图所示
    在这里插入图片描述
    如果这时键B也要创建一个同样保存了整数100的字符串对象作为之对象,
    那么服务器有以下两种做法:
    1.为键B新创建一个包含整数值100的字符串对象
    2.让键A和键B共享同一个字符串
    以上两种方法明显是第二种方法更节约内存
  • 举个例子,如图所示展示了包含整数值100的字符串对象同时被键A和键B
    共享之后的样子,可以看到,除了对象的引用计数从之前的1变成了2之外,其他属性都没有变化,共享对象机制对于节约内存非常有帮助,数据库中保存的相同的值对象越多,对象共享机制就能节约越多的内存
    在这里插入图片描述
  • 例如,假设数据库中保存了整数值100的键不只有键A和键B两个,而是有一百个,那么服务器只需要用一个字符串对象的内存就可以保存原本需要使用一百个字符串对象的内存才能保存的数据。
  • 举个例子,如果创建一个值为100的键A,并使用OBJECT REFCOUNT命令查看键A的值对象的引用计数,就会发现值对象的引用计数为2
127.0.0.1:6379> SET A 100
OK
127.0.0.1:6379> OBJECT REFCOUNT A
(integer) 2

引用这个值对象的两个程序分别时持有这个之对象的服务器程序,以及共享这个值对象的键A,如图所示。如果此时再创建一个值为100的键B,那么键B也会指向包含整数值100的共享对象,使得共享对象的引用计数值变为3,如图所示

127.0.0.1:6379> SET B 100
OK
127.0.0.1:6379> OBJECT REFCOUNT A
(integer) 3
127.0.0.1:6379> OBJECT REFCOUNT B
(integer) 3

在这里插入图片描述
在这里插入图片描述

注意

创建共享字符串对象的数量可以通过修改redis.h/REDIS_SHARED_INTEGERS常量来修改
另外,这些共享对象不仅只有字符串键可以使用,那些在数据结构中嵌套了字符串对象的对象(linkedlist编码的列表对象、hashtable编码的哈希对象、hastable编码的集合对象,以及zset编码的有序集合对象)都可以使用这些共享对象。

为什么Redis不共享包含字符串的对象?

当服务器考虑将一个共享对象设置为键的值对象时,程序需要先检查给定的共享对象和键想创建的目标对象是否完全相同,只有在共享对象和目标对象完全相同的情况下,程序才会将共享对象用作键的值对象,而一个共享对象保存的值越复杂,验证共享目标和目标对象是否完全相同所需的复杂度就会越高,消耗的CPU时间也会越多:

  • 1.如果共享对象是保存整数值的字符串,那么一年挣操作的复杂度为O(1)
  • 2.如果共享对象是保存字符串值的字符串对象,那么验证操作的复杂度为O(N)
  • 3.如果共享对象是包含了多个值(或者对象)的对象,比如列表对象或者哈希对象,那么验证操作的复杂度为O(N^2)因此,尽管共享更复杂的对象可以节约更多的内存,但受到CPU时间的限制,Redis只对包含整数值的字符串对象进行共享

对象的空转时长

概述

redisObject除了type、encoding、ptr和refcount四个属性之外,还包含最后一个属性lru属性,该属性记录了对象最后一次被命令程序访问的时间

typedef struct redisObject {// ...unsigned lru:22;// ....} robj;

OBJECT IDLETIME命令可以打印出给定键的空转市场,这一空转时长就是通过将当前时间减去键的之对象的lru时间计算得出的:

例子

  • 举个例子
127.0.0.1:6379> SET msg "hello world"
OK
// 等待一小段时间
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 11
// 等待一阵子
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 16
// 访问msg键的值
127.0.0.1:6379> GET msg
"hello world"
// 键处于活跃状态,空转时长为0
127.0.0.1:6379> OBJECT IDLETIME msg
(integer) 5

注意

OBJECT IDLETIME命令的实现比较特殊,这个命令在访问键的值对象时,不会修改值对象的lru属性
除了可以被OBJECT IDLETIME命令打印出来之外,键的空转时长还有另外一项作用:如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过了maxmemory选项所设置的上限值时,空转时长较高的那部分键会优先被服务器释放,从而回收内存。

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

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

相关文章

pytorch 实现线性回归(Pytorch 03)

一 从零实现线性回归 1.1 生成训练数据 原始 计算公式, 我们先使用该公式生成一批数据,然后使用 结果数据去计算 计算 w1, w2 和 b。 %matplotlib inline import random import torch from d2l import torch as d2ldef synthetic_data(w, b, num_ex…

基于springboot+vue的餐饮管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Java学习笔记21——使用JDBC访问MySQL数据库

JDBC(Java Database Connectivity,Java数据库连接)是应用程序编程借口(API),描述了一套访问关系数据库的标准Java类库。可以在程序中使用这些API,连接到关系数据库,执行SQL语句&…

IDEA Git恢复DropCommit删除的提交

刚刚Dorp commit了,本地代码也被删除了,如何恢复呢, 从项目中登录git,找到刚刚的commit代码,如下所示:输入命令git reflog 复制代码,到idea中,打开GIt,找到RESET HEAD, …

初始 Navicat BI 工具

早前,海外 LearnBI online 博主 Adam Finer 对 Navicat Charts Creator 这款 BI(商业智能)工具进行了真实的测评。今天,我们来看下他对 Navicat BI 工具的初始之感,希望这能给用户一些启发与建议。LearnBI online 作为…

《计算机考研精炼1000题》为你考研之路保驾护航

创作背景 在这个充满挑战与竞争的时代,每一位考生在备战研究生考试的过程中,都希望通过更多符合考纲要求的练习题来提高自己的知识和技能。为了满足这一需求,我们精心策划和编辑了这本《计算机考研精炼1000题》。在考研政治和考研数学领域&a…

springboot283图书商城管理系统

图书商城管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本图书商城管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理…

耳机壳UV树脂制作私模定制耳塞需要什么样的设备和技术?

制作私模定制耳塞需要使用到一些特定的设备和技术,包括但不限于以下内容: 耳模制作工具:用于获取用户耳型的耳模制作工具,如硅胶、橡皮泥等。需要使用熟练的手法和技术,确保耳模的准确性和稳定性。UV树脂:…

社交变革:探索Facebook的魔力

社交媒体平台的崛起已经改变了我们与世界的交互方式,而Facebook作为其中的巨头,其影响力和魔力更是不可忽视。本文将深入探讨Facebook如何引领社交变革,并探索其背后的魔力所在。 连接世界的纽带 Facebook的独特之处在于它作为一个社交平台&…

「滚雪球学Java」:安全(章节汇总)

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!&#xf…

【视频异常检测】Diversity-Measurable Anomaly Detection 论文阅读

Diversity-Measurable Anomaly Detection 论文阅读 Abstract1. Introduction2. Related Work3. Diversity-Measurable Anomaly Detection3.1. The framework3.2. Information compression module3.3. Pyramid deformation module3.4. Foreground-background selection3.5. Trai…

JavaScript实现简单的表单验证

关键代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

ChatGPT在大气科学领域建模、数据分析、可视化与资源评估中的高效应用及论文写作

深度探讨人工智能在大气科学中的应用&#xff0c;特别是如何结合最新AI模型与Python技术处理和分析气候数据。课程介绍包括GPT-4等先进AI工具&#xff0c;旨在帮助学员掌握这些工具的功能及应用范围。课程内容覆盖使用GPT处理数据、生成论文摘要、文献综述、技术方法分析等实战…

HTML案例-1.标签练习

效果 源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

物资管理系统建设方案

二、 项目概述 2.1 项目背景 2.2 现状分析 2.2.1 业务现状 2.2.2 系统现状 三、 总体需求 3.1 系统范围 3.2 系统功能 3.3 用户分析 3.4 假设与依赖关系 四、 功能需求 五、 非功能性需求 5.1 用户界面需求 5.2 软硬件环境需求 5.3 产品质量需求 5.4 接口需求 …

高效文件管理,批量复制文件夹名称 ,轻松提升工作效率

在信息爆炸的时代&#xff0c;电脑中的文件夹数量与日俱增&#xff0c;管理和整理这些文件夹成为一项繁琐的任务。您是否曾因为需要复制大量文件夹的名称而感到苦恼&#xff1f;现在&#xff0c;我们为您带来了一款能够一键批量复制文件夹名称的神奇工具&#xff0c;让您的效率…

在SAP BAS中创建你的第一个Fiori项目

1. 前言 本文将通过step by step的方式介绍如何在SAP Business Studio中创建一个Fiori项目&#xff0c;并通过Mock Data启动Fiori应用程序。 2. Demo Step1: 登录BAS并创建Dev Space Step2: 进入创建好的Dev Space&#xff0c;通过Get Started页面&#xff0c;选择New Projec…

STM32-DMA数据转运

DMA进行转运的条件 1&#xff1a;开关控制&#xff0c;DMA_CMD必须使能2&#xff1a;传输计数器必须大于03&#xff1a;触发源必须有触发的信号

Zookeeper(五)Zokeeper 环境搭建与Curator使用

目录 一 环境搭建1.1 单机环境搭建1.2 可视化工具ZooKeeper Assistant1.3 集群环境搭建 二 常用命令1.1 命令行语法1.2 数据节点信息1.3 节点类型 三 CuratorAPI使用3.1 依赖3.1 创建会话3.2 基本使用增删改查3.3 ACL权限控制3.4 分布式锁3.5 分布式计数器3.6 分布式Barrier3.7…

婴儿洗衣机硬核测评:希亦、鲸立、小吉婴儿洗衣机性能大比拼!

如果你非常注重婴儿衣物的卫生问题&#xff0c;那么婴儿洗衣机则是非常理想的选择。毕竟&#xff0c;在婴儿吃奶或者接触其他材料时&#xff0c;其抵抗力是比较弱的&#xff0c;再加上普通洗衣机无法对婴儿的衣物进行有效的消毒处理&#xff0c;轻则会对婴儿的健康造成威胁&…