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.kler.cn/a/274420.html

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

相关文章

【Godot4.2】2D导航01 - AStar2D及其使用方法

概述 对于2D平台跳跃或飞机大战,以及一些直接用键盘方向键操控玩家的游戏,是根本用不到寻路的,因为只需要检测碰撞就可以了。 但是对于像RTS或战棋这样需要操控玩家到地图指定位置的移动方式,就绝对绕不开寻路了。 导航、碰撞与…

微信小程序接口请求出错:request:fail url not in domain list:xxxxx

一、微信小程序后台和开发者工具配的不一样导致了这个错误 先说结论: 开发者工具配置了https://www.xxx.cn/prod-api/ 微信后台配置了 https://www.xxx.cn 一、最开始 开发者工具配置了https://www.xxx.cn:7500 微信后台配置了 https://www.xxx.cn 报错:reques…

代码随想录算法训练营第53天 | 1143.最长公共子序列 ,1035.不相交的线 ,53. 最大子序和

动态规划章节理论基础: https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 1143.最长公共子序列 题目链接:https://leetcode.cn/problems/longest-common-subsequence/description/ 思路&…

ASP .Net Core ILogger日志服务

🐳简介 ILogger日志服务是.NET平台中的一个内置服务,主要用于应用程序的日志记录。它提供了灵活的日志记录机制,允许开发者在应用程序中轻松地添加日志功能。以下是其主要特点和组件: ILogger接口:这是ILogger日志服…

电脑数据安全新利器:自动备份文件的重要性与实用方案

一、数据安全的守护神:自动备份文件的重要性 在数字化时代,电脑中的文件承载着我们的工作成果、个人回忆以及众多重要信息。然而,数据丢失的风险无处不在,无论是硬件故障、软件崩溃,还是恶意软件的攻击,都…

JupytetNotebook常用的快捷键

Jupyter Notebook 中常用的快捷键: 切换到命令模式:按 Esc 键。切换到编辑模式:按 Enter 键。运行当前单元格并选择下面的单元格:按 Shift Enter。运行当前单元格并插入新的单元格在下面:按 Alt Enter。删除当前单元…

【Vue3】Vue3中的编程式路由导航 重点!!!

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

test测试类-变量学习

test测试类 作用:标记到类上成为测试类,标记到方法上成为测试方法 变量:测试类的变量,在测试类括号中应用 1、invocationCount变量 意思是这个方法应该被调用的次数。 在测试框架中,特别是当使用参数化测试或数据驱动…

HarmonyOS(鸿蒙)快速入门

一:下载开发工具 鸿蒙的开发工具叫DevEco 下载点击 其他部分都一直next 就行,这个页面出现的install 建议都点击install 然后单独选择安装目录 可能存在的问题 就是之前安装nodejs(比如自己开发web或者RN等情况)版本低 等情况 所以建议你单独安装一次 …

Avalon总线学习

Avalon总线学习 avalon总线可以分为: Avalon clock interface Avalon reset interface Avalon Memory mapped interface Avalon iterrupt interface Avalon streaming interface Avalon tri-state conduit interface Avalon conduit interface 1、Avalon c…

杨氏矩阵的查找(复杂度<O(N))

题目: 解释:时间复杂度小于O(N)即不要一个一个的去遍历查找。 思路: 一个33的二维数组如图所示: 一:先找到一个最关键的数字,3(下标为0,2) 关键数的关键之处在于(处于…

SpringBoot + MyBatisPlus分页查询

文章目录 1.思路分析2.分页查询后端实现1.com/sun/furn/config/MybatisConfig.java 注入MyBatisPlus分页拦截器2.com/sun/furn/controller/FurnController.java 添加方法3.postman测试 3.分页查询前端实现1.src/views/HomeView.vue 引入分页导航条组件2.src/views/HomeView.vue…

外包干了6天,技术明显进步。。。

我是一名大专生,自19年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近四年的光阴。今年8月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

springboot企业级抽奖项目-整体展示

项目地址 GitHub - kiorr/lottery: 企业红包雨项目 star截图q:3353441618可以领取资料 原型效果 前台 后台 业务分析 项目介绍 项目概述 京东的红包雨大家可能都参与过,在某段时间内随机发放不同的红包 本项目为一个通用的红包雨模式抽奖系统&…

腾讯云服务器多少钱一个月?5元1个月,这价格没谁了

2024腾讯云服务器多少钱一个月?5元1个月起,腾讯云轻量服务器4核16G12M带宽32元1个月、96元3个月,8核32G22M配置115元一个月、345元3个月,腾讯云轻量应用服务器61元一年折合5元一个月、4核8G12M配置646元15个月、2核4G5M服务器165元…

linux单机部署hadoop

1.下载安装包 https://archive.apache.org/dist/hadoop/common/ 2.上传压缩 3.修改配置文件 1)设置JDK的路径 cd /usr/local/software/hadoop-3.1.3/etc/hadoop vi hadoop-env.sh export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.402.b06-1.el7_9.x86_64/ 查看…

RK3588_Qt交叉编译环境搭建

buildroot编译 进入 /home/linux/plat/rk3588/sdk/buildroot 目录下,执行 Source ./envsetup.sh 选择具体平台编译,后再执行make编译 /home/linux/plat/rk3588/sdk/buildroot/output/OK3568/images 生成的rootfs.ext2镜像重新烧写到rk3568开发板中&…

简单对已有云服务器进行linux环境搭建以及共享服务器

前言: 外壳程序:Xshell7 云服务器:华为云 服务器操作系统:centos7 1.云服务的设置(这里购买的华为云,阿里腾讯都可以) 区域尽量选择距离所处地距离自己最近的区域。镜像这里选择的为centos7.…

流畅的Python(二十一)-类元编程

一、核心要义 1.类元编程时指在运行时创建或定制类的技艺 2.类是一等对象,因此任何时候都可以使用函数新建类,而无需使用class关键字 3.类装饰器也是函数,不过能够审查、修改,甚至把被装饰的类替换为其它类。 4.元类(type类的子类)类编程…
最新文章