Redis数据结构对象中的类型检查与命令多态、内存回收

news2025/2/23 5:10:03

类型检查与命令多态

概述

redis中用于操作键的命令基本上可以分为两种类型。其中一种命令可以对任何类型的键执行,比如说DEL命令、EXPIRE命令、RENAME命令、TYPE命令、OBJECT命令等.

而另一种命令只能对特定类型的键执行,比如说

  • 1.SET、GET、APPEND、STRLEN等命令只能对字符串键执行;
  • 2.HDEL、HSET、HGET、HLEN等命令只能对哈希键执行
  • 3.RPUSH、LPOP、LINSERT、LLEN等命令只能对列表键执行
  • 4.SADD、SPOP、SINTER、SCARD等命令只能对集合键执行
  • 5.ZADD、ZCARD、ZRANK、ZSCORE等命令只能对有序集合键执行

例子

  • 举个例子,以下代码就展示了使用DEL命令来删除三种不同类型的键:
// 字符串键
127.0.0.1:6379> SET msg "hello"
OK
// 列表键
127.0.0.1:6379> RPUSH numbers 1 2 3
(integer) 3
// 集合键
127.0.0.1:6379> SADD  fruits apple banana cherry
(integer) 3

127.0.0.1:6379> DEL msg
(integer) 1
127.0.0.1:6379> DEL numbers
(integer) 1
127.0.0.1:6379> DEL fruits
(integer) 1
  • 举个例子,我们可以用SET命令创建一个字符串键,然后用GET命令和APPEND命令操作这个键,但如果我们试图对这个键执行只有列表键才能执行的LLEN命令,那么Redis将向我们返回一个类型错误
127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> GET msg
"hello world"
127.0.0.1:6379> APPEND msg " again!"
(integer) 18
127.0.0.1:6379> GET msg
"hello world again!"
127.0.0.1:6379> LLEN msg
(error) WRONGTYPE Operation against a key holding the wrong kind of value

类型检查的实现

Redis为了确保只有指定类型的键可以执行某些特定的命令,在执行一个类型特定的命令之前,Redis会先检查输入键的类型是否正确,然后再决定是否执行给定的命令。类型特定命令所进行的类型检查是通过redisObject结构的type属性来实现的:

  • 1.在执行一个类型特定命令之前,服务器会先检查输入数据库键的值对象是否为执行命令所需的类型,如果是的话,服务器就对键执行指定的命令;
  • 2.否则,服务器将拒绝执行命令,并向客户端返回一个类型错误

例子

  • 举个例子,对于LLEN命令来说:
    1.在执行LLEN命令之前,服务器会先检查输入数据库键的之对象是否为列表类型,也即是,检查值对象redisObject结构type属性的值是否为REDIS_LIST.如果是的话,服务器就对键执行LLEN命令
    2.否则的话,服务器就拒绝执行命令并向客户端返回一个类型错误。
    检查过程如图
    在这里插入图片描述

多态命令的实现

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

现在,考虑这样一个情况,如果对一个键执行LLEN命令,那么服务器除了要确保执行命令的是列表键之外,还需要根据键的值对象所使用的编码来选择正确的LLEN命令实现:

  • 1.如果列表对象的编码为ziplist,那么说明列表对象的实现为压缩列表,程序将使用ziplistLen函数来返回列表的长度
  • 2.如果列表对象的编码为linkedlist,那么说明列表对象的实现为双端链表,程序将使用listLength函数来返回双端链表的长度

用面向对象的术语来说,可以认为LLEN命令是多态的,只要执行LLEN命令的是列表键,那么无论值对象使用的是ziplist编码还是linkedlist编码,命令都可以正常执行

实际上,可以将DEL、EXPIRE、TYPE等命令也称多态命令,因为无论输入的键是什么类型,这些命令都可以正确地执行,。

DEL、EXPIRE等命令和LLEN等命令地区别在于,前者是基于类型地多态——一个命令可以同时用于处理多种不同类型地键,而后者是基于编码的多态——一个命令可以同时用于处理多种不同编码

例子

  • 举个例子,列表对象有ziplist和linkedlist两种编码可用,其中前者使用压缩列表API来实现列表命令,而后者则使用双端链表API来实现列表命令。
    在这里插入图片描述
    如图展示了LLEN命令从类型检查到根据编码选择实现函数的整个执行过程,其他类型特定命令的执行过程也是类似

内存回收

概述

因为C语言并不具备自动内存回收功能,所以Redis在自己的对象系统中构建了一个引用计数(reference counting)技术实现的内存回收机制,通过这一机制,程序可以通过跟踪对象的引用计数信息,在适当的时候自动释放对象并进行内存回收。每个对象的引用计数信息由redisObject结构的refcount属性记录:

typedef struct redisObject {
 // ...
 
 // 引用计数
 int refcount;
 // ...
} robj;

对象的引用计数信息会随着对象的使用状态而不断变化:

  • 1.在创建一个新对象时,引用计数的值会被初始化为1
  • 2.当对象被一个新程序使用时,它的引用计数值会被增一
  • 3.当对象不再被一个程序使用时,它的引用计数值会被减一
  • 4.当对象的引用计数值变为0时,对象所占用的内存会被释放

对象的整个生命周期可以划分为创建对象、操作对象、释放对象三个阶段。

例子

  • 举个例子,以下代码展示了一个字符串对象从创建到释放的整个过程
// 创建一个字符串对象s,对象的引用计数为1
robj *s = createStringObject(....);

// 对象s执行各种操作...

// 将对象s的引用计数减一,使得对象的引用计数变为0
// 导致对象s被释放
decrRefCount(s);

其他不同类型的对象也会经历类似的过程
在这里插入图片描述

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

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

相关文章

Vector Magic:矢量图像转换神器,轻松驾驭Mac与Win双平台

在数字化时代,图像已经成为我们生活和工作中不可或缺的一部分。无论是设计师、艺术家,还是普通用户,都对图像质量有着极高的要求。而矢量图像,以其清晰度高、可无限放大的特点,逐渐受到广大用户的青睐。今天&#xff0…

打破沟通壁垒:跨部门需求冲击与IT部门的应对智慧

引言 在快节奏、高要求的互联网行业,跨部门间的有效沟通是确保项目顺利进行和公司业务稳定发展的基石。然而,需求突袭往往成为打乱这一稳定局面的重要因素。 事件的背景 作为一IT部门负责人,在跨部门的领导层沟通会议上,一个在事…

深度解析深度学习中的长短期记忆网络(LSTM)(含代码实现)

在深度学习中,长短期记忆网络(LSTM)是一种强大的循环神经网络结构,能够更好地处理长序列数据并减轻梯度消失的问题。本文将介绍LSTM的工作原理,并使用PyTorch实现一个简单的LSTM模型来展示其在自然语言处理中的应用。 …

使用 wxWidgets 的 wxAUI 界面库,创建功能丰富的软件界面

目录 前言: wxAUI 的优势: 使用 wxAUI 创建软件界面的步骤: 以下是一些使用 wxAUI 创建软件界面的技巧: 案例: 总结: 前言: 软件界面是用户与软件交互的重要桥梁,一个好的界面…

应用测评要求解读-三级

身份鉴别: a)应对登录的用户进行身份标识和鉴别,身份标识具有唯一性,身份鉴别信息具有复杂度要求并定期更换; 1. 在未登录状态下尝试直接访问任意操作页面或功能,查看是否具有登陆界面。 2.询问或者测试…

《你就是孩子最好的玩具·升级版》笔记(四)给父母的话

经典摘录 两岁到三岁之间是最具有挑战性的一段时期。在这个阶段,你的工作最多,责任也最大,因为你将极大地影响并决定孩子的情感发育。“当妈妈本来就不容易,你并不需要时时刻刻都开心,这很正常。” 【●反省自己生气的…

Vue技能树总结01

Vue vs React 相似之处: 它们都有使用 Virtual DOM;提供了响应式(Reactive)和组件化(Composable)的视图组件。将注意力集中保持在核心库,而将其他功能如路由和全局状态管理交给相关的库。React 比 Vue 有更…

MySQL数据自动同步到Es

Logstash 测试数据准备 DROP DATABASE IF EXISTS es;CREATE DATABASE es DEFAULT CHARACTER SET utf8;USE es;CREATE TABLE book (id INT NOT NULL,title VARCHAR(20),author VARCHAR(20),price DECIMAL(6,2),PRIMARY KEY(id) );DROP PROCEDURE IF EXISTS batchInsertBook;DELI…

极大似然估计和最大参数后验估计

概率是已知模型和参数,推数据;统计(似然)是已知数据,推模型和参数。对于函数 x表示某一个具体的数据;θ表示模型的参数。 如果θ是已知确定的,x 是变量,这个函数叫做概率函数(prob…

全国人口密度分布数据

数据福利是专门为关注小编博客及公众号的朋友定制的,未关注用户不享受免费共享服务,已经被列入黑名单的用户和单位不享受免费共享服务。参与本号发起的数据众筹,向本号捐赠过硬盘以及多次转发、评论的朋友优先享有免费共享服务。 对人口数量、…

网络架构层_交换机连接使用

网络架构层_交换机连接使用 交换机是不是不会用呀?交换机,服务器,路由器,防火墙,网关,这些都是嘛呀? 网上的一些网络架构图,具体项目按照实际考虑。 交换机的Console口——通过Con…

递增三元组C++

题目 输入样例&#xff1a; 3 1 1 1 2 2 2 3 3 3输出样例&#xff1a; 27 思路1 题目让我们求所有满足Ai < Bi < Ci的三元组组合&#xff0c;我们可以先将A, B, C三个数组按升序排序&#xff0c;设计分别指向A数组和C数组的指针ia、ic&#xff0c;一开始指向数组的第一…

数据结构与算法1-大O表示法

大O指Big Operation&#xff0c;可以用来表示时间复杂度和空间复杂度 常见大 O O O 表示法 按时间复杂度从低到高 黑色横线 O ( 1 ) O(1) O(1)&#xff0c;常量时间&#xff0c;意味着算法时间并不随数据规模而变化绿色 O ( l o g ( n ) ) O(log(n)) O(log(n))&#xff0c;…

算法打卡day17|二叉树篇06|Leetcode 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

算法题 Leetcode 654.最大二叉树 题目链接:654.最大二叉树 大佬视频讲解&#xff1a;最大二叉树视频讲解 个人思路 大概思路就是在数组中 找最大值的节点作为当前节点&#xff0c;用最大值的index切割左右子树的区间&#xff0c;往复循环到数组元素为0&#xff1b; 解法 递…

【Linux】详谈进程优先级进程调度与切换

一、进程优先级 1.1、为什么要有优先级 进程要访问某种资源&#xff0c;进程通过一定的方式排队&#xff0c;确认享受资源的优先顺序。计算机中资源过少&#xff0c;所以进程访问某种资源时需要排队。 1.2、优先级的具体表示 进程的优先级其实就是PCB中的一个整形变量…

工具精灵--超级好用的在线工具网站

工具精灵是一个超级好用的在线工具网站&#xff0c;它有这些功能&#xff1a;json格式化、xml格式化、markdown在线编辑、sql格式化、json转Java、xml转Java等。 虽然有很多这种类似的网站了&#xff0c;但它们并不好用&#xff0c;很粗糙。工具精灵超级好用&#xff0c;细节方…

性能测试 —— 认识 jmeter (性能测试流程 性能测试通过标准)

性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 1 性能测试技能树 性能测试是一项综合性的工作&#xff0c;致力于暴露性能问题&#xff0c;评估系统性能趋势。性能测试工作实质上是利用工具去模拟大量用户来验证系统能够…

windows取证

Windows事件日志分析 使用Windows事件日志查看器&#xff0c;打开实验文档“security01.evtx”。按“日期和时间”对日志进行分组统计&#xff1b;按“事件ID”对日志进行分组统计&#xff1a; 问题&#xff1a;日志中是否有用户登录失败的记录。如果有&#xff0c;请按“登录…

openEuler 欧拉系统nginx正向代理 http https —— 筑梦之路

正向代理 Nginx正向代理&#xff0c;通过服务器代理客户端去重定向请求访问到目标服务器的一种代理服务。对于目标服务器来说浏览器/客户端是隐藏的。Nginx 正向代理默认只支持http 协议&#xff0c;不支持 https 协议&#xff0c;需借助"ngx_http_proxy_connect_module&q…

HarmonyOS NEXT应用开发之听歌识曲水波纹特效案例

介绍 在很多应用中&#xff0c;会出现点击按钮出现水波纹的特效。 效果图预览 使用说明 进入页面&#xff0c;点击按钮&#xff0c;触发水波纹动画。再次点击按钮&#xff0c;停止水波纹动画。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a; 要实现存在两个连续…