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命令的去表在于,前者是基于類型多態,后者是基于編碼多態。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211103.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第76講:MySQL數據庫中常用的命令行工具的基本使用

文章目錄 1.mysql客戶端命令工具2.mysqladmin管理數據庫的客戶端工具3.mysqlbinlog查看數據庫中的二進制日志4.mysqlshow統計數據庫中的信息5.mysqldump數據庫備份工具6.mysqllimport還原備份的數據7.source命令還原SQL類型的備份文件 MySQL數據庫提供了很多的命令行工具&#…

python 畫條形圖(柱狀圖)

目錄 前言 基礎介紹 月度開支的條形圖 前言 條形圖(bar chart),也稱為柱狀圖,是一種以長方形的長度為變量的統計圖表,長方形的長度與它所對應的變量數值呈一定比例。 當使用 Python 畫條形圖時,通常會使…

python代碼:如何控制一個exe程序只能執行一次

import ctypes import sys def is_program_running(): # 創建互斥體 mutex_name "Global\\MonitorClientMutex" h_mutex ctypes.windll.kernel32.CreateMutexW(None, False, mutex_name) # 檢查互斥體是否已經存在 if ctypes.windll.kernel32.Get…

Centos7.9安裝谷歌【解決依賴問題】

安裝過程 mkdir /home/app cd /home/app wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpmyum install -y redhat-lsb-core-4.0-7.el6.centos.x86_64 yum install -y libX11-devel --nogpg yum install -y cmake gcc gcc-c gtk-devel gim…

vscode 編譯運行c++ 記錄

一、打開文件夾,新建或打開一個cpp文件 二、ctrl shift p 進入 c/c配置 進行 IntelliSense 配置。主要是選擇編譯器、 c標準, 設置頭文件路徑等,配置好后會生成 c_cpp_properties.json; 二、編譯運行: 1、選中ma…

zabbix 通過 odbc 監控 mssql

1、環境 操作系統:龍蜥os 8.0 zabbix:6.0 mssql:2012 2、安裝odbc 注意:需要在zabbix server 或者 zabbix proxy 安裝 odbc驅動程序 dnf -y install unixODBC unixODBC-devel3、安裝mssql驅動程序 注意:我最開始嘗試…

Tomcat管理功能使用

前言 Tomcat管理功能用于對Tomcat自身以及部署在Tomcat上的應用進行管理的web應用。在默認情況下是處于禁用狀態的。如果需要開啟這個功能,需要配置管理用戶,即配置tomcat-users.xml文件。 !!!注意:測試功…

react 學習筆記 李立超老師 | (學習中~)

文章目錄 react學習筆記01入門概述React 基礎案例HelloWorld三個API介紹 JSXJSX 解構數組 創建react項目(手動)創建React項目(自動) | create-react-app事件處理React中的CSS樣式內聯樣式 | 內聯樣式中使用state (不建議使用)外部樣式表 | CSS Module React組件函數式組件和類組…

【數據結構和算法】反轉字符串中的單詞

其他系列文章導航 Java基礎合集數據結構與算法合集 設計模式合集 多線程合集 分布式合集 ES合集 文章目錄 其他系列文章導航 文章目錄 前言 一、題目描述 二、題解 2.1 方法一:雙指針 2.2 方法二:分割 倒序 三、代碼 3.1 方法一:雙…

不同品牌的手機如何投屏到蘋果MacBook?例如小米、華為怎樣投屏比較好?

習慣使用apple全家桶的人當然知道蘋果手機或iPad可以直接用airplay投屏到MacBook。 但工作和生活的多個場合里,并不是所有人都喜歡用同一品牌的設備,如果同事或同學其他品牌的手機需要投屏到MacBook,有什么方法可以快捷實現? 首先…

1 億個數據取出最大前 100 個有什么方法?

1 億個數據取出最大前 100 個有什么方法? 大家好,這是一道經常在面試中被遇到的一個問題,我之前面試也是被問到過得,現在一起學習下,下次再被問到就可以輕松地用對。 在計算機科學和數據處理領域,我們經常…

【GDB】

GDB 1. GDB調試器1.1 前言1.2 GDB編譯程序1.3 啟動GDB1.4 載入被調試程序1.5 查看源碼1.6 運行程序1.7 斷點設置1.7.1 通過行號設置斷點1.7.2 通過函數名設置斷點1.7.3 通過條件設置斷點1.7.4 查看斷點信息1.7.5 刪除斷點 1.8 單步調試1.9 2. GDB調試core文件2.1 設定core文件的…

(五)五種最新算法(SWO、COA、LSO、GRO、LO)求解無人機路徑規劃MATLAB

一、五種算法(SWO、COA、LSO、GRO、LO)簡介 1、蜘蛛蜂優化算法SWO 蜘蛛蜂優化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,該算法模型雌性蜘蛛蜂的狩獵、筑巢和交配行為&…

iOS(swiftui)——系統懸浮窗( 可在其他應用上顯示,可實時更新內容)

因為ios系統對權限的限制是比較嚴格的,ios系統本身是不支持全局懸浮窗(可在其他app上顯示)。在iphone14及之后的iPhone機型中提供了一個叫 靈動島的功能,可以在手機上方可以添加一個懸浮窗顯示內容并實時更新,但這個功能有很多局限性 如:需要iPhone14及之后的機型且系統…

Java面試遇到的一些常見題

目錄 1. Java語言有幾種基本類型,分別是什么? 整數類型(Integer Types): 浮點類型(Floating-Point Types): 字符類型(Character Type): 布爾類…

(六)五種最新算法(SWO、COA、LSO、GRO、LO)求解無人機路徑規劃MATLAB

一、五種算法(SWO、COA、LSO、GRO、LO)簡介 1、蜘蛛蜂優化算法SWO 蜘蛛蜂優化算法(Spider wasp optimizer,SWO)由Mohamed Abdel-Basset等人于2023年提出,該算法模型雌性蜘蛛蜂的狩獵、筑巢和交配行為&…

【完整項目】雙模式答題卡識別軟件中YOLO模式的訓練部分詳解,包括訓練填涂區域和手寫準考證號,手把手詳細教學,可延申拓展訓練其他圖像數據

目錄 前言1. 數據準備2. 數據標注3. 先跑起來Windows下用本地的CPU或GPU訓練本地Windows系統連接服務器訓練前言 前文:【完整項目】基于Python+Tkinter+OpenCV+Yolo+手寫OCR的雙模式答題卡識別軟件的設計與實現 如果你需要訓練自己的答題卡模型,那么請先看上面的文章鏈接。…

Flutter自定義下拉選擇框dropDownMenu

利用PopupMenuButton和PopupMenuItem寫了個下拉選擇框,之所以不采用系統的,是因為自定義的更能適配項目需求,話不多說,直接看效果 下面直接貼出代碼、代碼中注釋寫的都很清楚,使用起來應該很方便,如果有任何…

C : DS靜態查找之順序索引查找

Description 給出一個隊列和要查找的數值,找出數值在隊列中的位置,隊列位置從1開始 要求使用順序索引查找算法,其中索引表查找和塊內查找都采用不帶哨兵、從頭開始的順序查找方法。 Input 第一行輸入n,表示主表有n個數據 第二…

OpenSSL 編程指南

目錄 前言初始化SSL庫創建SSL 上下文接口(SSL_CTX)安裝證書和私鑰加載證書(客戶端/服務端證書)加載私鑰/公鑰加載CA證書設置對端證書驗證例1 SSL服務端安裝證書例2 客戶端安裝證書創建和安裝SSL結構建立TCP/IP連接客戶端創建socket服務端創建連接創建SSL結構中的BIOSSL握手服務…