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) 3127.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.mzph.cn/news/757193.shtml

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

相关文章

OPTEE v3.20.0 FVP环境搭建

目录 一、前提条件 二、下载fvp代码 三、下载工具链 四、下载Foundation_Platform FVP平台 五、编译及运行 一、前提条件 1、安装如下的依赖工具 sudo apt-get install android-tools-adb android-tools-fastboot autoconf \ automake bc bison build-essential ccache c…

windows管理github代码

资料 windows SSH下载github

51单片机—AD/DA

目录 1.AD/DA元件介绍 2.运算放大器 3.原理分析 4.性能指标 5.内部芯片时序 6.程序实操 7.原理图 1.AD/DA元件介绍 一般传感器的值会随参数的值变化,AD一般对电压进行转换,AD有多个通道,但是DA只有一个通道,且AD的运用较为广…

路由器怎么做端口映射

路由器在网络中起到了连接不同设备和提供网络服务的重要作用。端口映射是一项常见的操作,它允许外部网络中的设备通过路由器访问内部网络中的设备。我们将介绍如何在路由器上进行端口映射的设置。 理解端口映射 在开始操作之前,我们需要了解一些基本概念…

反射 Reflection

反射 反射的概念 反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息(比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到加载完类之后,在堆中就产生了一个Class类型…

Flutter 在 Windows 下的开发环境搭建(Flutter SDK 3.19.2)【图文详细教程】

Git 下载与安装 对于 Flutter 3.19,Git 版本需要 2.27 及以上 Git 下载: Git 官网:https://git-scm.com/Git 下载淘宝镜像:https://registry.npmmirror.com/binary.html?pathgit-for-windows/ 对于 Git 的安装教程,…

Python分析无人驾驶汽车在桂林市文旅行业推广的问卷

【项目背景】 通过市场调研、文本分析、访谈和问卷调查等方法,探讨: 网民对无人驾驶汽车出行服务的态度。无人驾驶安全员的行业背景。不同人群在旅游时的交通选择偏好。游客及当地居民对桂林市文旅路线的交通满意度。乘客对无人驾驶汽车的满意度。桂林…

超快速排序(蓝桥杯,归并排序,acwing)

题目描述: 在这个问题中,您必须分析特定的排序算法----超快速排序。 该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列,直到序列按升序排序。 对于输入序列 9 1 0 5 4,超快速排序生成输出 0 1 4 5 9。 您的任务是确…

Selenium不同版本配置自动下载驱动及打包细节

Selenium配置浏览器驱动 自动下载浏览器驱动的方法 selenium4.7.0自动下载浏览器驱动的方法 selenium4.11.0 或4.11.1手动设置浏览器驱动路径的方法pyinstaller打包程序时同时打包ChromeDriverchromedriver路径需要sys._MEIPASS的路径进行引用方法一:通过–add-data…

【Linux】从零开始认识进程 — 前篇

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。。——山本耀司 从零开始认识进程 1 认识冯诺依曼体系2 操作系统3 进程3.1 什么是进程???3.2 进程管理PCB 3.3 Linux中的进程深入理解 3.4 进程创建总结 送给…

jvm的垃圾回收器以及触发full gc的场景

JVM(Java虚拟机)的垃圾回收器有很多种,主要包括以下几种: Serial收集器:串行收集器是最古老、最稳定的收集器。它使用单个线程进行垃圾收集工作,在进行垃圾回收时会暂停所有用户线程。 ParNew收集器&#…

Nebula Graph-01-Nebula Graph简介和安装以及客户端连接

前言 NoSQL 数据库 图数据库并不是可以克服关系型数据库缺点的唯一替代方案。现在市面上还有很多非关系型数据库的产品,这些产品都可以叫做 NoSQL。NoSQL 一词最早于上世纪 90 年代末提出,可以解释为“非 SQL” 或“不仅是 SQL”,具体解释要…

查找众数及中位数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数只是指把一组数据从小到大排列,最中间的那个数,如果这组数…

整蛊小教程|让朋友手足无措的电脑自动关机

前言 这几天讲到shutdown关机命令,于是就出现了整蛊类的电脑教程。 这个故事我记得很清楚:在2012年的春天……当时的小白对电脑还不是很熟悉。某一天跟着朋友去网吧上网,这时候突然有个朋友发来一个.bat的文件,说双击打开有惊喜…

集合深入------理解底层。

集合的使用 前提:栈、堆、二叉树、hashcode、toString()、quesalus()的知识深入和底层理解。 1、什么是集合 集合就是咋们所说的容器 ​ 前面我们学习过数组 数组也是容器 ​ 容器:装东西的 生活中有多少的容器呀? 水杯 教室 酒瓶 水库 只要是…

Modbus TCP转Profinet网关如何实现Modbus主站与多设备通讯

在工业控制领域中,Modbus TCP转Profinet网关(XD-ETHPN20)扮演着连接不同设备间通讯的重要角色。当将Modbus主站与十几台服务器进行通讯时,通过modbus tcp转profinet网关(XD-ETHPN20)设备将不同协议间的数据…

关于OceanBase中旁路导入的应用分享

背景 前段时间,在用户现场协助进行OceanBase的性能测试时,我注意到用户常常需要运用 insert into select 将上亿行的数据插入到一张大宽表里,这样的批量数据插入操作每次都需要耗时半个小时左右。对这一情况,我提议用户尝试采用旁…

Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

摘要: 提取类激活映射(CAM)可以说是为弱监督语义分割(WSSS)生成伪掩码的最标准步骤。然而,我们发现伪掩码不理想的关键是在CAM中广泛使用的二进制交叉熵损失(BCE)。具体来说,由于BCE的池化方式是对类别求和,CAM中的每个像素可能对…

Linux课程____进程管理

记录工作日志 script 240319.log CTRLd 退出 cat 240319.log //查看 一、查看进程 1.静态 ps -aux ps -elf 2.动态 top 3.pgrep 查看特定条件的进程 pgrep -l “log” pgrep -l "ssh" pgrep -l -U redhat 4.pstree 查看进程树 pstree -aup 所有…

【Linux更新驱动、cuda和cuda toolkit】

目录 1. 更新显卡驱动1.1. 查看当前显卡驱动版本1.2. 删除原始显卡驱动1.3. 删除CUDA Toolkit1.4. 在NVIDIA官网找到2080Ti对应的最新驱动程序 2. 更新CUDA Toolkit2.1. 下载CUDA Toolkit2.2. 安装.run2.3. 添加环境变量2.4. 检查是否安装好了 最近需要更新服务器的显卡驱动和C…