7.redis对象介绍(三)

1.类型检查与命令多态

redis中用于操作键的命令可以分为两种,一种是可以对任何类型的键执行的命令,比如del,expire,rename,type,object等;另一种是只能对特定类型的键执行,比如set,hset,lpop,rpush,sadd,zadd等等。

1.1 类型检查的实现

        为了确保只有制定类型的键才可以执行某些特定的命令,在执行一个命令前,会先检查输入键的类型是否正确。

        类型特定命令所进行的类型检查是通过redisObject结构的type属性来实现的:在执行一个命令前,服务器会先检查输入数据库键的值对象是否为执行命令所需的类型,是的话则执行,否则,拒绝执行,返回错误。

1.2 多态命令的实现

        redis除了会根据值对象的类型来判断键是否能执行指定命令之外,还会根据值对象的编码方式,选择正确的命令实现代码来执行。

        例如:当我们执行llen命令时,列表对象有ziplist和linkedlist两种编码可用,那么服务器会现根据对象的编码选择正确的llen命令实现,如果是ziplist编码,将使用ziplist函数来返回列表的长度;如果是linkedlist,程序将使用listlength函数来返回双端列表的长度。

2.内存回收

因为C语言并不具备自动内存回收的功能,所以redis在自己的对象系统中构建了一个引用计数来实现内存的回收机制。

每个对象的引用计数信息由redisobject结构的refcount属性记录,在创建一个对象时,引用计数的值会被初始化为1;当对象被一个新程序使用时,他的引用计数值会被增1;当对象不再被一个程序使用时,他的引用计数值会被减1,当对象的引用计数值变为0时,对象所占用的内存会被释放。

3.对象共享

        对象的引用计数属性除了用于实现引用计数内存回收之外,还带有对象共享的作用。例如:键A创建了一个包含整数值100的字符串对象作为值对象,这是键B也要创建一个同样保存了整数值100的字符串对象,那么服务器有以下两种做法:

  1. 为键B创建一个包含整数值100的字符串对象;
  2. 让键A和键B共享同一个字符串对象;

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

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

目前来说,redis会在初始化服务器时,创建一万个字符串对象,这些对象包含了从0到9999的所有整数值,当需要用到时,服务器会使用这些共享对象,而不是新创建对象;另外,共享对象不单单只有字符串键可以使用,那些在数据结构中嵌套了字符串对象的对象(如列表,哈希对象,集合对象,有序集合)都可以使用这些共享对象;

为什么redis只共享整数型字符串对象?

因为当服务器考虑将一个共享对象设置为键的值对象时,程序需要先检查给定的共享对象和键想创建的目标对象是否完全相同,一个共享对象越复杂,验证两个对象是否相同就会越复杂,消耗的cpu时间越多。

4.对象的空转时长

        除了前面介绍的type、encoding、ptr、refcount四个属性之外,redisObject结构还包含一个属性lru,该属性记录了对象最后一次被命令程序访问的时间;Object idletime命令可以打印出给定键的空转时长,这一空转时长就是通过当前时间减去键的值对象的lru时间计算得出的。

        object idletime命令不会修改值对象lru属性;

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

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

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

相关文章

VsCode 配置 C/C++ 开发环境

简述一下步骤哈: 下载VsCode(这点大家都会哈)下载MingG64(C/C编译器【gcc】),配置环境变量在VsCode配置一下C/C运行时环境测试运行 1、准备MingG64 VsCode 本身是没有C/C编译的,这里我们自己…

用C#编写一个读取磁盘第一扇区的程序

1.运行结果 2.WinHex校验 3.程序 using System; using System.IO;class Program {static void Main(){try{// 以管理员权限运行此程序const string drivePath "\\.\G:";const int sectorSize 512; // 标准扇区大小// 打开逻辑驱动器(需要管理员权限&a…

【PyTorch】PyTorch预训练模型缓存位置迁移,也可拓展应用于其他文件的迁移

目录 前言: 一、具体实现: 二、关键技术解析 路径动态拼接 安全目录创建 环境变量魔法 迁移条件检查 三、代码实现: 前言: 当模型文件下载到本地c盘的默认路径时,可用以下代码的形式进行文件位置的迁移。 一、…

Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参

✅ 今日目标 理解 KNN 的原理与“以邻为近”的思想掌握 K 值选择与模型效果的关系学会使用 sklearn 训练 KNN 模型实现 KNN 分类 模型评估 超参数调优 📘 一、KNN 算法原理 KNN(K-Nearest Neighbors)核心思想: 给定一个待预测…

pppoe宽带连接-系列命令调用

以下是对PPPoE相关命令的详细解释及用法说明: 1. pppoe 功能:PPPoE基础工具集,通常作为其他命令的底层依赖。 用法:一般不直接使用,而是通过pppoe-*系列命令调用。 2. pppoe-connect 功能:建立PPPoE连接…

C# 合并两个byte数组的几种方法

1. 使用 Array.Copy 方法(高效推荐)byte[] array1 { 1, 2, 3 }; byte[] array2 { 4, 5, 6 };byte[] combined new byte[array1.Length array2.Length]; Array.Copy(array1, 0, combined, 0, array1.Length); Array.Copy(array2, 0, combined, array1…

Spring AI 源码

目录 Spring AI 介绍 Spring AI 组件介绍 Spring AI 结构化输出 Srping AI 多模态 Spring AI 本地Ollama Spring AI 源码 Spring AI Advisor机制 Spring AI Tool Calling Spring AI MCP Spring AI RAG Spring AI Agent Spring AI 是一个用于 AI 工程的应用程序框架。 其目标是…

钉钉企业应用开发系列:前端实现自定义右上角菜单(dd.http + Vue3)

本文将围绕“如何在钉钉企业应用中自定义右上角菜单”这一主题进行讲解,并结合现代前端技术栈(Vue3 Composition API)展示完整实现过程,帮助你快速构建具备原生交互体验的企业应用。一、前置准备1. 注册钉钉开发者账号并创建应用…

STC8H驱动两相四线步进电机

两相步进电机, STC8H系列 用高级PWM实现SPWM细分驱动 /************* 功能说明 ************** 用B组高级PWM细分驱动2相4线小型步进电机, 支持1、2、4、8、16、32、64细分, 比如1.8度的电机4细分到0.45度. 本程序用于演示SPWM多细分直接驱动2相4线小型步进电机…

读书笔记:《DevOps实践指南》

《DevOps实践指南》 美 Gene Kim, Jez Humble, Patrick Debois, John Willis 著;刘征,王磊,马博文,曾朝京 译 个人理解: 向客户交付价值,快速、高效、高质量交付 信息全流程共享、全过程参与、关注软件…

创客匠人视角:创始人 IP 从流量狂欢到价值深耕的蜕变之路

在知识付费行业浪潮中,创客匠人深耕九年,见证了无数 “一夜爆红” 与 “迅速陨落” 的案例。从 “菏泽树哥” 的流量泡沫,到天水麻辣烫的短暂热度,这些现象折射出行业发展的阶段性特征,也促使创始人 IP 打造的底层逻辑…

ArchLinux:别样的btrfs log tree修复大赛(errno=-5 IO failure Failed to recover log tree)

archlinux 简明指南本指南包含 archlinux 安装、配置、维护等,帮助新手快速上手https://arch.icekylin.online/一个月黑风高的上午:美滋滋的打开电脑进grub选择arch启动 欸!突然就卡在这里了,系统进了rootfs,并且长按电…

Laravel8中使用phpword生成word文档

最近在开发有关考试试卷相关的内容,需要生成试卷的word文档并下载。 这里用到了phpoffice/phpword插件,这里记录下一些开发过程中注意的点。 1.安装phpoffice/phpword composer require phpoffice/phpword2.准备一个word模板方便向其中写入需要生成的内容…

spring-ai-alibaba官方 Playground 示例

1、Spring AI Alibaba 官方社区开发了一个包含完整 “前端UI后端实现” 的智能体 Playground 示例,示例使用 Spring AI Alibaba 开发,可以体验聊天机器人、多轮对话、图片生成、多模态、工具调用、MCP集成、RAG知识库等所有框架核心能力。 2、界面 3、准…

k8s pod深度理解

一、理论 pod等同于逻辑主机,在它上面运行各种程序(容器) pod的pause容器作用,pod网络、存储 所有容器的父容器,负责回收僵尸容器,同时它为pod中的容器提供了统一的网络及统一的共享存储。 pod的endpoint…

Android Auto即将带来变革

在2025年谷歌I/O开发者大会上,Android Auto迎来重磅升级。除了集成Gemini智能助手外,本次更新还突破性地为车载信息娱乐系统新增了浏览器和视频应用支持。值得注意的是,Spotify应用也将获得一系列创新功能,进一步丰富用户的驾驶体…

Jenkins 与 GitLab CI/CD 的核心对比

Jenkins 与 GitLab CI/CD 的核心对比及中小企业选型建议如下: 🔄 ‌核心功能对比‌ ‌维度‌‌Jenkins‌‌GitLab CI/CD‌‌集成性‌需手动配置插件对接代码仓库(如 GitLab)原生深度集成 GitLab 仓库,实现代码-CI/CD …

每日问题总结

fairy GUI适配相关问题 为什么自己适配好了但是打包发布到unity没有UI显示呢? 原因可能是你发布的组件和图片不在同一个包下面,因为fairyGUI的分包限制问题,每一个包限制在2048M大小。不能超过这个大小,所以说,有可能…

embbding you should know

embedding:就是将词向量或者图向量 采用权重升维度,更好的去表达这个特征;nn.Embedding 是 PyTorch 中的 查表式嵌入层(lookup‐table),用于将离散的整数索引(如词 ID、实体 ID、离散特征类别等…

【JS-6.2-模板字符串】ES6 模板字符串:现代JavaScript的字符串处理利器

在ES6(ECMAScript 2015)引入的所有新特性中,模板字符串(Template Literals)可能是最直观、最容易被开发者接受并广泛使用的特性之一。它彻底改变了我们在JavaScript中处理字符串的方式,提供了更强大、更灵活的字符串操作能力。本文将深入探讨模板字符串的…