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

预处理 #pragma 命令详解

目录 1.引言 2.#pragma once 3.#pragma waring(...) 4.#pragma comment 4.1.lib 4.2.linker 5.#pragma region … /endregion … 6.#pragma optimize 7.#pragma message (message string) 8.#pragma omp parallel for 9.#pragma pack([ show ] |…

51单片机—AD/DA

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

路由器怎么做端口映射

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

反射 Reflection

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

前端之各浏览器间差异和平台的兼容性问题

目录 这些差异和兼容性问题主要源于以下方面为解决这些兼容性问题,常用的做法包括浏览器的差异主要体现在它们对于 HTML、CSS 和 JavaScript 的解析和渲染上。为了处理不同浏览器和平台的兼容性问题,我们可以采取以下几个步骤:IE、Firefox、S…

GET请求和POST请求

GET请求和POST请求是HTTP协议中最常用的两种请求方法,它们在Web开发中起着至关重要的作用。 GET请求 用途:用于请求指定资源的表示形式,通常用于获取数据。幂等性:GET请求是幂等的,即多次请求同一资源应该返回相同的…

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 进程创建总结 送给…

publicPath 和 __webpack_public_path__ 和 process.env.BASE_URL的区别和使用方法

文章目录 publicPath 和 __webpack_public_path__ 和 process.env.BASE_URL的区别和使用方法1. publicPath(1)publicPath定义(2)publicPath使用方法方法1:静态文件使用publicPath。方法2:项目打包时使用pub…

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

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

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

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

使用flatten-maven-plugin时更换版本号步骤

flatten-maven-plugin作用和配置 略 第一步: 执行mvn命令,更新.flattened-pom.xml mvn clean package -Drevision"1.0.1-snapshot" 版本号如果有-,则必须加上双引号 第二步: 修改POM文件中版本号reversion 第三步: reload all maven projects

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

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

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

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

单片机烧录方式,JTAG,ISP,SWD,

常见的词汇 参考 ISP:In System Programing,在系统编程 IAP:In Application Programing,在应用编程 ICP:In Circuit Programing,在电路编程 ICSP全称是In Circuit Serial Programming JTAG(Joint Test Act…