Redis对象类型检测与命令多态

一. 命令类型

        Redis中操作键的命令可以分为两类。

  • 一种命令可以对任意类型的键执行,比如说DEL,EXPIRE,RENAME,TYPE,OBJECT命令等。

举个例子:

#字符串键
127.0.0.1:6379> set msg "hello world"
OK
#列表键
127.0.0.1:6379> rpush number 1 2 3
(integer) 3
#集合键
127.0.0.1:6379> sadd fruits apple banana cherry
(integer) 3
127.0.0.1:6379> keys *
1) "number"
2) "msg"
3) "fruits"
127.0.0.1:6379> del msg
(integer) 1
127.0.0.1:6379> del fruits
(integer) 1
127.0.0.1:6379> del number
(integer) 1
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 
  • 另一种命令是对特定类型的键执行 

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等命令只能对有序集合键使用。

例如:

        对字符串键使用,只能对列表键使用的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> llen msg
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> 

 二.类型检测的实现

        从上面的报错可以看出,为了确保只有指定类型的键可以执行某些特殊命令,在执行一个类型特定的命令之前,Redis会先检测输入键的类型是否正确,然后再决定是否执行给定的命令。

        类型特定命令所进行的类型检查是通过redisObject结构中的type属性来实现的。

        流程图如下:

三. 多态命令的实现

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

        比如:列表对象的编码可以是ziplist或者linkedlist,其中前者使用压缩列表API实现列表命令,而后者则使用双端链表API来实现列表命令。

        假如,我们对一个键是哟个LLEN命令时,服务器除了需要确保执行命令的键是列表键,还需要根据键的编码选择正确的LLEN命令的实现:

  • 如果是ziplist编码,程序将使用ziplistlen函数返回列表长度。
  • 如果是linkedlist编码,程序将使用listlength函数返回双端链表的长度。

        借用面向对象的思想,我们可以认为LLEN命令是多态的,只需要执行LLEN命令的是列表键,不论是什么编码,都会执行成功。

        下图展示了LLEN命令从类型检查 到更具编码来选择实现函数的过程,其他类型特定命令的执行过程也类似:

        实际上DEL, EXPIRE等命令也称之为多态命令,无论使用的是什么类型,这些命令都可以执行成功。

        DEL, EXPIRE命令和LLEN命令的去表在于,前者是基于类型多态,后者是基于编码多态。 

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

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

相关文章

Verilog基础:寄存器输出的两种风格

相关文章 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 Verilog中的寄存器操作一般指的是那些对时钟沿敏感而且使用非阻塞赋值的操作。例如状态机中的状态转移,实际上就是一种寄存器操作,因为这相…

换根DP模板

给你一个无根树&#xff0c;问你以哪个节点为根节点的时候得到所有点的深度之和最大 《贴一张 知乎大佬的一个解释》 #include<bits/stdc.h> using namespace std; const int N 2e610; using ll long long; ll dep[N],sz[N]; ll ans[N]; vector<int>g[N]; int n;…

What the DAAM: Interpreting Stable Diffusion Using Cross Attention

What the DAAM: Interpreting Stable Diffusion Using Cross Attention (Paper reading) Raphael Tang, Comcast Applied AI, ACL2023 best paper, Code, Paper 1. 前言 大规模扩散神经网络是文本到图像生成中的一个重要里程碑&#xff0c;但人们对其了解甚少&#xff0c;缺…

超详细的Selenium:设置元素等待、上传文件、下载文件

前言&#xff1a;在工作和学习selenium自动化过程中记录学习知识点&#xff0c;深化知识点 1、设置元素等待 元素定位之元素等待-- WebDriver提供了两种类型的等待&#xff1a;显示等待和隐式等待。 同时&#xff0c;在这我为大家准备了一份软件测试视频教程&#xff08;含…

基于CentOS7环境搭建Graylog日志系统

我配置的Graylog是4版本的&#xff0c;因为更高级的版本没有针对centos CentOS installationhttps://go2docs.graylog.org/4-x/downloading_and_installing_graylog/centos_installation.html 官方文档挺详细&#xff0c;但有的地方可能会出问题 1. 安装MongoDB Inst…

代码随想录二刷 |二叉树 |在每个树行中找最大值

代码随想录二刷 &#xff5c;二叉树 &#xff5c;在每个树行中找最大值 题目描述解题思路代码实现 题目描述 515.在每个树行中找最大值 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出…

Spring基于XML文件配置AOP

AOP AOP&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的抽象&#xff0c;属性与属性、方法与方法、对象与对象都可以组成一个…

nginx多端口部署

1.配置nginx.conf文件 有几个端口需要部署就写几个server&#xff0c;我这里只部署了两个端口分别为80和81端口&#xff0c;所以有两个server文件。80端口项目入口在根目录的test文件中&#xff0c;81端口项目入口在根目录的test1文件夹中。 2.准备项目文件html文件 在/test1…

【干货分享】KingIOServer与三菱PLC的通讯的应用案例

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近一个项目涉及用KingIOServer采集三菱PLC数据&#xff0c;特记录通讯过程方便备忘。 一、版本说明&#xff1a; 1、KingIOServer版本&#xff1a;3.7SP2 2、PLC型号&#xff1a;Q03UDV 和Q03UDE自带以太网网口。…

智能优化算法应用:基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蝗虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蝗虫算法4.实验参数设定5.算法结果6.参考文献7.MA…

Linux下apisix离线安装教程

Linux下apisix离线安装教程 一、首先需要安装etcd&#xff1a;二、通过rpm离线安装apisix三、启动apisix四、安装apisix-dashboard1、安装2、更改dashboard登录账号名和密码3、运行 一、首先需要安装etcd&#xff1a; 解压缩etcd后执行以下命令&#xff1a; tar -xvf etcd-v3.…

【QT】QComboBox和QPlainTextEdit基本介绍和应用示例

目录 1.QComboBox 1.1 QComboBox概述 1.2 QComboBox信号 1.3 QComboBox常用功能 1.4 QComboBox添加简单项 1.6 QComboBox列表项的访问 2.QPlainTextEdit 2.1 QPlainTextEdit概述 2.2 QPlainTextEdit的基本属性 2.3 QPlainTextEdit的公共函数 2.4 QPlainTextEdit的公…

【开源】基于Vue和SpringBoot的音乐偏好度推荐系统

项目编号&#xff1a; S 012 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S012&#xff0c;文末获取源码。} 项目编号&#xff1a;S012&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1…

单臂路由与三层交换机

单臂路由 划分VLAN后同一VLAN的计算机属于同一个广播域&#xff0c;同一VLAN的计算机之间的通信是不成问题的。然而&#xff0c;处于不同VLAN的计算机即使是在同一交换机上&#xff0c;它们之间的通信也必须使用路由器。 图&#xff08;a&#xff09;是一种实现VLAN间路由的方…

Java编程中通用的正则表达式(二)

正则表达式&#xff0c;又称正则式、规则表达式、正规表达式、正则模式或简称正则&#xff0c;是一种用来匹配字符串的工具。它是一种字符串模式的表示方法&#xff0c;可以用来检索、替换和验证文本。正则表达式是一个字符串&#xff0c;它描述了一些字符的组合&#xff0c;这…

网络互连与常用设备

网络互连是为了将两个以上具有独立自治能力、同构或异构的计算机网络连接起来&#xff0c;实现数据流通&#xff0c;扩大资源共享的范围&#xff0c;或者容纳更多的用户。网络互连包括局域网与局域网的互连、局域网与广域网的互连、广域网与广域网的互连&#xff0c;这可以扩大…

【漏洞复现】华脉智联指挥调度平台命令执行漏洞

Nx01 产品简介 深圳市华脉智联科技有限公司&#xff0c;融合通信系统将公网集群系统、专网宽带集群系统、不同制式、不同频段的短波/超短波对讲、模拟/数字集群系统、办公电话系统、广播系统、集群单兵视频、视频监控系统、视频会议系统等融为一体&#xff0c;集成了专业的有线…

Python 从入门到精通 学习笔记 Day03

Python 从入门到精通 第三天 今日目标 流程控制语句、退出循环、练习学习的内容 一、流程控制语句 流程控制的三种方式&#xff1a;顺序语句、双分支语句、循环语句 双分支语句 Python 的双分支语句使用if-else语句实现。 其语法结构如下: if条件:#如果条作为真&#xff…

二十一章总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission…

Mybatis XML增删操作(结合上文)

先来"增"操作 在UserInfoXMLMapper.xml里面写 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <…