Redis學習-05Redis基本數據結構

Redis 數據結構

String 字符串

基本命令表

命令執行效果時間復雜度
set key value [key value…]設置 key 的值是 valueO(k), k 是鍵個數
get key獲取 key 的值O(1)
del key [key …]刪除指定的 keyO(k), k 是鍵個數
mset key value [key value …]批量設置指定的 key 和 valueO(k), k 是鍵個數
mget key [key …]批量獲取 key 的值O(k), k 是鍵個數
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +n(浮點數)O(1)
append key value指定的 key 的值追加 valueO(1)
strlen key獲取指定 key 的值的長度O(1)
setrange key offset value覆蓋指定 key 的從 offset 開始的部分值O(n),n 是字符串長度,通常視為 O(1)
getrange key start end獲取指定 key 的從 start 到 end 的部分值O(n),n 是字符串長度,通常視為 O(1)

SET 命令

將 string 類型的 value 設置到 key 中。如果 key 之前存在,則覆蓋,無論原來的數據類型是什么。之前關于此 key 的 TTL 也全部失效。

SET 命令支持多種選項來影響它的行為:

  • EX seconds——使用秒作為單位設置 key 的過期時間。
  • PX milliseconds——使用毫秒作為單位設置 key 的過期時間。
  • NX——只在 key 不存在時才進行設置,即如果 key 之前已經存在,設置不執行。
  • XX——只在 key 存在時才進行設置,即如果 key 之前不存在,設置不執行。

注意:由于帶選項的 SET 命令可以被 SETNX、SETEX、PSETEX 等命令代替,所以之后的版本中,Redis 可能進行合并。

Hash 哈希

幾乎所有的主流編程語言都提供了哈希(hash)類型,它們的叫法可能是哈希、字典、關聯數組、映射。在 Redis 中,哈希類型是指值本身又是一個鍵值對結構,形如 key = “key”,value = { {field1, value1 }, …, {fieldN, valueN } }。

哈希類型中的映射關系通常稱為 field-value,用于區分 Redis 整體的鍵值對(key-value),注意這里的 value 是指 field 對應的值,不是鍵(key)對應的值,請注意 value 在不同上下文的作用。

在這里插入圖片描述

基本命令表

命令執行效果時間復雜度
hset key field value設置值O(1)
hget key field獲取值O(1)
hdel key field [field …]刪除 fieldO(k), k 是 field 個數
hlen key計算 field 個數O(1)
hgetall key獲取所有的 field-valueO(k), k 是 field 個數
hmget key field [field …]批量獲取 field-valueO(k), k 是 field 個數
hmset key field value [field value …]批量設置 field-valueO(k), k 是 field 個數
hexists key field判斷 field 是否存在O(1)
hkeys key獲取所有的 fieldO(k), k 是 field 個數
hvals key獲取所有的 valueO(k), k 是 field 個數
hsetnx key field value設置值,但必須在 field 不存在時才能設置成功O(1)
hincrby key field n對應 field-value +nO(1)
hincrbyfloat key field n對應 field-value +n(浮點數)O(1)
hstrlen key field計算 value 的字符串長度O(1)

注意:

在使用 HGETALL 時,如果哈希元素個數比較多,會存在阻塞 Redis 的可能。如果開發人員只需要獲取部分 field,可以使用 HMGET,如果一定要獲取全部 field,可以嘗試使用 HSCAN 命令,該命令采用漸進式遍歷哈希類型。

List 列表

列表是一種比較靈活的數據結構,它可以充當棧和隊列的角色,在實際開發上有很多應用場景。
在這里插入圖片描述

特點:

  • 第一、列表中的元素是有序的,這意味著可以通過索引下標獲取某個元素或者某個范圍的元素列表,例如要獲取第 5 個元素,可以執行 lindex user:1:messages 4;獲取倒數第 1 個元素,lindex user:1:messages -1 即可。
  • 第二、區分獲取和刪除的區別,例如 lrem 1 b 是從列表中把從左數遇到的前 1 個 b 元素刪除,這個操作會導致列表的長度變化;但執行 lindex 4 只會獲取元素,列表長度不變。
  • 第三、列表中的元素是允許重復的。

阻塞版本命令

blpop 和 brpop 是 lpop 和 rpop 的阻塞版本,和對應非阻塞版本的作用基本一致,除了:

  • 在列表中有元素的情況下,阻塞和非阻塞表現是一致的。但如果列表中沒有元素,非阻塞版本會立即返回 nil,但阻塞版本會根據 timeout 阻塞一段時間,期間 Redis 可以執行其他命令,但執行該命令的客戶端會表現為阻塞狀態。
  • 命令中如果設置了多個鍵,那么會從左向右進行遍歷鍵,一旦有一個鍵對應的列表中可以彈出元素,命令立即返回。
  • 如果多個客戶端同時對一個鍵執行 pop,則最先執行命令的客戶端會得到彈出的元素。

列表不為空時:
lpop user:1:messages 得到 x 元素
blpop user:1:messages 得到 x 元素
兩者行為一致

列表為空時,且 5 秒內沒有新元素加入:
lpop user:1:messages 立即得到 nil
blpop user:1:messages 5 執行命令 5 秒后得到 nil
兩者行為不一致

列表為空時,且 5 秒內有新元素加入:
lpop user:1:messages 立即得到 nil
blpop user:1:messages 5 執行命令,直到新元素加入,得到新元素
兩者行為不一致

基本列表命令

操作類型命令時間復雜度
添加rpush key value [value …]O(k),k 是元素個數
lpush key value [value …]O(k),k 是元素個數
linsert key before/after pivot valueO(n),n 是 pivot 距離頭尾的距離
查找lrange key start endO(s+n),s 是 start 偏移量,n 是 start 到 end 的范圍
lindex key indexO(n),n 是索引的偏移量
llen keyO(1)
刪除lpop keyO(1)
rpop keyO(1)
lrem key count valueO(k),k 是元素個數
ltrim key start endO(k),k 是元素個數
修改lset key index valueO(n),n 是索引的偏移量
阻塞操作blpop key [key …] timeoutO(1)
brpop key [key …] timeoutO(1)

Set 集合

集合類型也是保存多個字符串類型的元素的,但和列表類型不同的是,集合中:1)元素之間是無序的;2)元素不允許重復。一個集合中最多可以存儲 2^32 - 1 個元素。Redis 除了支持集合內的增刪查改操作,同時還支持多個集合取交集、并集、差集,合理地使用好集合類型,能在實際開發中解決很多問題。
在這里插入圖片描述

SPOP

從 set 中刪除并返回一個或者多個元素。注意,由于 set 內的元素是無序的,所以取出哪個元素實際是未定義行為,即可以看作隨機的。

基本命令表

命令描述時間復雜度
SADD key member [member …]向集合添加一個或多個成員O(1)(單個元素),批量添加時為 O(k),k 是成員個數
SCARD key獲取集合的成員數O(1)
SISMEMBER key member判斷 member 元素是否是集合 key 的成員O(1)
SMEMBERS key返回集合中的所有成員O(N),其中 N 為集合中的成員數量
SPOP key [count]移除并返回集合中的一個隨機成員;如果指定了 count,則返回多個隨機成員O(1)(單個元素),指定 count 時為 O(count)
SREM key member [member …]從集合中移除一個或多個成員O(N),其中 N 為被刪除的成員數量
SMOVE source destination member將 member 元素從 source 集合移動到 destination 集合O(1)
SDIFF key [key …]返回第一個集合與其他集合之間的差異(差集)O(N),其中 N 為所有集合中成員的總數量
SDIFFSTORE destination key [key …]返回給定所有集合的差集并存儲在 destination 中O(N),其中 N 為所有集合中成員的總數量
SINTER key [key …]返回所有給定集合的交集O(N*M),其中 N 為最小集合中元素的數量,M 為參數中集合的數量
SINTERSTORE destination key [key …]返回所有給定集合的交集并存儲在 destination 中O(N*M),其中 N 為最小集合中元素的數量,M 為參數中集合的數量
SUNION key [key …]返回所有給定集合的并集O(N),其中 N 為所有集合中成員的總數量
SUNIONSTORE destination key [key …]返回所有給定集合的并集并存儲在 destination 中O(N),其中 N 為所有集合中成員的總數量
SSCAN key cursor [MATCH pattern] [COUNT count]迭代集合中的元素O(1)(每次調用),完整迭代為 O(N)

Zset 有序集合

有序集合保留了集合不能有重復成員的特點,但與集合不同的是,有序集合中的每個元素都有一個唯一的浮點類型的分數(score)與之關聯,這使得有序集合中的元素是可以維護有序性的,但這個有序不是用下標作為排序依據而是用這個分數。
在這里插入圖片描述

有序集合中的元素是不能重復的,但分數允許重復。類比于一次考試之后,每個人一定有一個唯一的分數,但分數允許相同。

ZADD 命令

添加或者更新指定的元素以及關聯的分數到 zset 中,分數應該符合 double 類型,+inf/-inf 作為正負極限也是合法的。

ZADD 的相關選項:

  • XX:僅僅用于更新已經存在的元素,不會添加新元素。
  • NX:僅用于添加新元素,不會更新已經存在的元素。
  • CH:默認情況下,ZADD 返回的是本次添加的元素個數,但指定這個選項之后,就會還包含本次更新的元素的個數。
  • INCR:此時命令類似 ZINCRBY 的效果,將元素的分數加上指定的分數。此時只能指定一個元素和分數。

基本命令表

命令描述時間復雜度
ZADD key score member [score member …]添加一個或多個成員到有序集合,或者更新已存在成員的分數。O(k * log(n)),其中 k 是添加的成員個數,n 是當前有序集合的元素個數。
ZCARD key獲取有序集合的成員數。O(1)
ZSCORE key member返回有序集中,成員的分數值。O(1)
ZRANK key member返回有序集中指定成員的排名(從 0 開始,按分數升序)。O(log(n)),其中 n 是當前有序集合的元素個數。
ZREVRANK key member返回有序集中指定成員的排名(從 0 開始,按分數降序)。O(log(n)),其中 n 是當前有序集合的元素個數。
ZREM key member [member …]移除有序集合中的一個或多個成員。O(k * log(n)),其中 k 是刪除的成員個數,n 是當前有序集合的元素個數。
ZINCRBY key increment member為有序集中成員的分數加上增量 increment。O(log(n)),其中 n 是當前有序集合的元素個數。
ZRANGE key start end [WITHSCORES]返回有序集中指定區間內的成員,按分數從低到高排序。O(k + log(n)),其中 k 是獲取的成員個數,n 是當前有序集合的元素個數。
ZREVRANGE key start end [WITHSCORES]返回有序集中指定區間內的成員,按分數從高到低排序。O(k + log(n)),其中 k 是獲取的成員個數,n 是當前有序集合的元素個數。
ZRANGEBYSCORE key min max [WITHSCORES]返回所有成員的分數在 [min, max] 范圍內的成員,按分數從低到高排序。O(k + log(n)),其中 k 是獲取的成員個數,n 是當前有序集合的元素個數。
ZREVRANGEBYSCORE key max min [WITHSCORES]返回所有成員的分數在 [max, min] 范圍內的成員,按分數從高到低排序。O(k + log(n)),其中 k 是獲取的成員個數,n 是當前有序集合的元素個數。
ZCOUNT key min max計算分數在 [min, max] 范圍內的成員數量。O(log(n)),其中 n 是當前有序集合的元素個數。
ZREMRANGEBYRANK key start end移除有序集合中給定的排名區間的所有成員。O(k + log(n)),其中 k 是移除的成員個數,n 是當前有序集合的元素個數。
ZREMRANGEBYSCORE key min max移除有序集合中所有分數在 [min, max] 范圍內的成員。O(k + log(n)),其中 k 是移除的成員個數,n 是當前有序集合的元素個數。
ZINTERSTORE destination numkeys key [key …]計算給定的一個或多個有序集的交集,并將結果存儲在新的有序集合中。O(n * k) + O(m * log(m)),其中 n 是輸入集合中的最小元素個數,k 是集合個數,m 是目標集合元素個數。
ZUNIONSTORE destination numkeys key [key …]計算給定的一個或多個有序集的并集,并將結果存儲在新的有序集合中。O(n) + O(m * log(m)),其中 n 是輸入集合的總元素個數,m 是目標集合元素個數。

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

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

相關文章

開啟modbus tcp模擬調試

1、新建modbus tcp服務器 ?功能差異??客戶端功能?: 生成并發送Modbus請求報文(如功能碼03讀取寄存器)。?? 解析服務器響應數據,實現遠程監控或控制。?? ?服務器端功能?: 監聽默認端口(如502&…

昇思+香橙派 AI 開發實踐:DeepSeek 全流程指南(基于 openEuler)

一、 環境準備 1. 鏡像燒錄 鏡像燒錄可以在任何操作系統內執?,這?以在Windows系統為例,使用balenaEtcher?具,快速燒錄鏡像到Micro SD卡中。 本章節所需的軟/硬件如下: 軟件相關:balenaEtcher制卡?具、openEul…

AI生成郵件發送腳本(帶附件/HTML排版)與定時爬取網站→郵件通知(價格監控原型)

想象一下:每天早晨咖啡還沒喝完,你的郵箱就自動收到了心儀商品的最新價格;重要報告準時帶著專業排版的附件發送到客戶手中——這一切不需要你手動操作。本文將用不到100行代碼帶你實現這兩個自動化神器! 一、為什么我們需要自動化…

【vLLM 學習】Encoder Decoder Multimodal

vLLM 是一款專為大語言模型推理加速而設計的框架,實現了 KV 緩存內存幾乎零浪費,解決了內存管理瓶頸問題。 更多 vLLM 中文文檔及教程可訪問 →https://vllm.hyper.ai/ *在線運行 vLLM 入門教程:零基礎分步指南 源碼 examples/offline_inf…

【MySQL筆記】視圖

目錄一、什么是視圖?二、使用視圖的優勢三、視圖的創建與使用四、不能更新視圖的場景五、刪除視圖六、總結一、什么是視圖? 視圖(View)是一種虛擬表,不存儲實際數據,而是通過執行預定義的查詢動態生成數據…

【RK3576】【Android14】分區劃分

獲取更多相關的【RK3576】【Android14】驅動開發,可收藏系列博文,持續更新中: 【RK3576】Android 14 驅動開發實戰指南

Datawhale 25年7月組隊學習coze-ai-assistant Task1學習筆記:動手實踐第一個AI Agent—英倫生活口語陪練精靈

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一條流水線,把復雜的任務拆分成多個簡單的步驟,每一步都有明確的目標和流程。1.2智能體和工作流的區別 智能體(AI Agent) **是什么 :**智能體是一個自動化的“助手”…

Webpack插件開發深度指南:從原理到實戰

Webpack插件是前端工程化的核心引擎,本文將帶你深入插件開發全流程,實現一個功能完整的資源清單插件,并揭示Tapable事件系統的核心原理。 一、Webpack插件機制解析 1.1 插件架構核心:Tapable事件系統 Webpack基于Tapable構建了…

2、Redis持久化詳解

Redis持久化詳解 文章目錄 Redis持久化詳解 前言 RDB和AOF的區別 RDB和AOF的優缺點 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(嘗試修復會刪除aof文件內容) 3、AOF 重寫功能 新增知識點: 新增知識點: 前言 Redis是一種高級 key-value 型的NoSQL數據庫。它跟mem…

curl 命令詳解

curl 命令的 -d/–data 和 --data-urlencode 的區別 curl 命令的 -d/–data 和 --data-urlencode 都用于發送 HTTP POST 請求的數據,但關鍵區別在于 是否自動對數據進行 URL 編碼。以下是詳細對比: curl 命令的 -d/--data 和 --data-urlencode 都用于發送…

ubuntu下好用的錄屏工具

以下是 vokoscreen 的安裝教程,適用于 Linux 系統。vokoscreen 是一款簡單易用的屏幕錄制工具,支持錄制屏幕、攝像頭和音頻。 安裝 vokoscreen vokoscreen 提供了多種安裝方式,包括通過包管理器、Deb 包或 AppImage 文件。 方法 1&#xf…

筆試大題20分值(用兩個棧實現隊列)

目錄前言一、原題二、解題思路三、代碼實現(c/c)C語言代碼C代碼實現結語前言 目前博主在處于秋招求職的關鍵時期,在暑假這段時間會頻繁更新博客,想在暑假期間把一些常考的面試和筆試題過一下,利用這兩個月沉淀一下技術…

【知識掃盲】tokenizer.json中的vocab和merges是什么?

在自然語言處理里,tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 庫生成的,它是分詞器配置的核心文件。這里面的 vocab 和 merges 是子詞分詞算法(像 BPE 這種)的重要構成要素。下面為你詳細解釋它們的作用和工作原理&…

【安卓筆記】RxJava的Hook機制,整體攔截器

0. 環境: 電腦:Windows10 Android Studio: 2024.3.2 編程語言: Java Gradle version:8.11.1 Compile Sdk Version:35 Java 版本:Java11 1. 使用場景 整個項目都是用了RxJava,需要對 整個/部分 項目…

NX二次開發常用函數——從一個坐標系到另一個坐標系的轉換(UF_MTX4_csys_to_csys )相同體坐標轉化

再做項目時相信大家都會用到坐標轉化,例如,我之前寫的案例分享中的博客都用到過,之前總是找借口進行if else判斷,雖然可以實現,但是比起坐標變換無論代碼復雜程度還是運行速度都比較差,之前參加過曹大師的教學訓練營,但是明顯感覺到大佬寫代碼的邏輯性以及模塊化能力都比…

數據庫防止數組字符串序列化

請求接到數組["aa","bb"]后,后端需要轉換成字符串Java 8 使用 String.join()String[] arr {"aa", "bb"}; String str String.join(",", arr); // "aa,bb"如果采用其他轉換,在字段存入數據庫后會["\"a…

若依框架文件上傳返回路徑端口錯誤 - Nginx代理環境下serverConfig.getUrl()獲取端口異常

目錄一 、問題描述二、問題現象三、問題根本原因3.1 代碼分析3.2 問題核心四、解決方案五、總結一 、問題描述 在使用若依框架進行項目開發時,遇到了一個令人困擾的問題:文件上傳功能在本地開發環境運行正常,但部署到服務器后,上…

使用PyInstaller打包 Python 工程

引言:大模型是個好工具,盡管好多內容都是拼湊的,但是整理學到的就是自己的。因工作需要隱藏python源代碼,方法有PyInstaller 、Cpython等多種方法,PyInstaller更為常用,PyInstaller打包 Python 工程步驟整理如下: 一、確保系統環境準備就緒 安裝 Python 和 pip 確認版本…

Python 程序設計講義(1):PyCharm 安裝教程

Python 程序設計講義(1):PyCharm 安裝教程 一、安裝 Python 解釋器 1、下載 Python 安裝文件 點擊如下鏈接進入 Python 官網: https://www.python.org/ 在彈出的頁面中單擊【Downloads】,然后單擊下面的【Download Pyt…

uniapp云打包安卓

1、基礎云打包 2、修改logo3、怎么實現下拉菜單4、修改啟動頁啟動頁默認這樣 5、URL Scheme頁面跳轉