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

类型检查与命令多态

概述

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);

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

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

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

相关文章

1688无货源一件代发怎么做?附详细流程图!

大家喜欢在1688上做一件代发,因为1688拥有庞大的供应商资源,商家可以轻易找到优质、低价的产品。其次,平台信誉度高,交易安全可靠,1688还提供了一系列便捷的服务和工具,帮助商家高效管理订单、物流&#xf…

vulnhub-----SickOS靶机

文章目录 1.信息收集2.curl命令反弹shell提权利用POC 1.信息收集 ┌──(root㉿kali)-[~/kali/vulnhub/sockos] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, IPv4: 10.10.10.10 Starting arp-scan 1.9.8 with 256…

小米汽车定价较预期下调3万至5万,发布之前仍有可能微调

跨界造车的新势力小米汽车正逐渐揭开其神秘面纱。最新爆料显示,小米汽车内部对车辆的定价进行了讨论,较之前的预期下调了3万至5万的幅度。然而,在正式发布之前,这一价格仍有可能进行微调。 历经三年的精心筹备,小米汽车…

用Python的turtle库绘制皮卡丘

turtle库的简介 turtle(海龟)库是turtle绘图体系的python实现,turtle库是一种标准库,是python自带的。 turtle(海龟)是一种真实的存在,有一个海龟在窗口的正中心,在画布上游走,走过的轨迹形成了绘制的图形&#xff0…

vr虚拟现实游戏世界介绍|数字文化展览|VR元宇宙文旅

虚拟现实(VR)游戏世界是一种通过虚拟现实技术创建的沉浸式游戏体验,玩家可以穿上VR头显,仿佛置身于游戏中的虚拟世界中。这种技术让玩家能够全方位、身临其境地体验游戏,与游戏中的环境、角色和物体互动。 在虚拟现实游…

如何快速搭建一个完整的vue2+element-ui的项目-二

技术细节-继续配置 提示:你以为这样就完了吗,其实还有很多东西需要我们自己手写的 例如: element-ui的配置样式重置配置src使用的配置elinst配置axios异步请求的二次封转配置语言国际化配置(这个看需求,我这里就不用配置了)vuex的配置mixins的配置开发环…

2万多个手机壁纸电脑壁纸图片ACCESS\EXCEL数据库

图片类的大数据我记得有《4万多论坛头像个性头像》、《近3万个斗图头像图片大全》、《近5000张趣图有趣GIF动画图》、《8千多JPG趣图内涵段子图》,但是比起今天的壁纸大全数据库来说,容量方面又不是很大,今天搞到的手机静态壁纸虽然记录数才2…

FreeRtos中段管理-----参考正点原子

什麽是中断? 让CPU打断正常运行的程序,转而去处理紧急的事件(程序),就叫中断 中断执行机制,可简单概括为三步: 1,中断请求:外设产生中断请求(GPIO外部中断、定…

基于springboot+vue的社区养老服务系统

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

常用负载均衡详解

一、介绍 在互联网场景下,负载均衡(Load Balance)是分布式系统架构设计中必须考虑的一个环节,它通常是指将负载流量(工作任务、访问请求)平衡、分摊到多个操作单元(服务器、组件)上去…

【spring】@Conditional注解学习

Conditional介绍 Conditional注解用于按照设定的条件进行判断,从而决定是否将某个bean注册到Spring容器中。 Conditional注解是在Spring 4.0版本中引入的,它提供了一种更加灵活的方式来控制bean的创建和注册。在此之前,开发者通常使用Profi…

[Redis]——Redis持久化的两种方式RDB、AOF

目录 RDB快照模式 概念: 触发时机: 异步做快照 AOF追加模式 概念: 触发时机: bgrewriteaof命令: 比较两种模式: RDB快照模式 概念: RDB模式就是保存当前Redis的状态到本地磁盘文件&am…

综合应用题——线性表的链式表示(每日更新中...)

一、练习题 01题 在带头结点的单链表L中,删除所有值为x的结点,并释放其空间,假设值为x的结点不唯一,试编写算法以实现上述操作。 【解法1】用p从头至尾扫描单链表,pre指向*p结点的前驱。若p所指结点的值为x&#xf…

【堆、位运算、数学】算法例题

目录 十九、堆 121. 数组中的第K个最大元素 ② 122. IPO ③ 123. 查找和最小的K对数字 ② 124. 数据流的中位数 ③ 二十、位运算 125. 二进制求和 ① 126. 颠倒二进制位 ① 127. 位1的个数 ① 128. 只出现一次的数字 ① 129. 只出现一次的数字 II ② 130. 数字范围…

MATLAB:函数与数值积分

一、数学函数图像的绘制 clc,clear fh (x)2*exp(-x).*sin(x); Xrange [0,8]; gx (x)3*exp(-x)*0.8.*sin(x); fplot(fh,Xrange,r-*,LineWidth,1.5) hold on grid on fplot(gx,Xrange,b-o,LineWidth,1.5) axis([-0.5,8.5,-0.1,0.85]) legend(fh (x)2*exp(-x).*sin(x),gx (x…

【笔记】用三角函数拟合数据(最小二乘法)

0.Matlab自带函数拟合 用三角函数拟合数据简单方便,matlab自带的fittype函数即可完成拟合任务,但是fittype函数仅限于matlab,为了搞懂fittype函数的内含,自己写了一套函数用于拟合。 如下图所示,现有一不规则散点,命令用三角函数拟合,拟合的目标频率w0为0.01m^-1 拟合…

模型部署——RKNN模型量化精度分析及混合量化提高精度

模型部署——RKNN模型量化精度分析及混合量化提高精度(附代码)-CSDN博客 3.1 量化精度分析流程 计算不同情况下,同一层网络输入值的余弦距离,来近似的查看每一层精度损失的情况。具体量化精度分析的流程如下: 3.2 量…

闪存盘上被删除的文件能被回收站恢复吗?

随着数字设备的普及,闪存盘作为一种便携式的存储设备,已经深入到了我们的日常生活和工作中。然而,在使用闪存盘的过程中,我们可能会不小心删除一些重要的文件。这时,很多人会寄希望于回收站来恢复这些文件。但是&#…

Flutter开发入门——路由

什么是路由? 移动端应用开发中,路由技术是一个非常重要的组成部分。路由技术负责管理应用中各个页面之间的跳转、导航以及参数传递等关键功能。在移动端应用中,一个高效、易于维护的路由系统对于提高开发效率和用户体验具有重要意义。 Flut…

基于Java中的SSM框架实现医院院内物资管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现医院院内物资管理系统演示 摘要 在当今的中国改革开放经济体制下,中国经济正以快速稳健的步伐前行。并且随着经济的发展,各领域的信息化管理也得到了充足的发展,而且愈发普及。现如今,几乎所有的行业中都…