Redis入門(2) - 數據類型

来源:https://www.cnblogs.com/zhixin9001/archive/2020/05/20/12926977.html
-Advertisement-
Play Games

Redis中的數據類型 字元串 散列 列表 集合 有序集合 Redis中的數據類型 Redis定義了這幾種數據類型: string(字元串) hash(散列) list(列表) set(集合) zset(有序集合) 後面會介紹它們各自的特點和使用場景。可以用TYPE命令來獲取鍵的類型。 字元串 字元 ...


  • Redis中的數據類型
  • 字元串
  • 散列
  • 列表
  • 集合
  • 有序集合

Redis中的數據類型

Redis定義了這幾種數據類型:

  • string(字元串)
  • hash(散列)
  • list(列表)
  • set(集合)
  • zset(有序集合)
    後面會介紹它們各自的特點和使用場景。可以用TYPE命令來獲取鍵的類型。

字元串

字元串類型是Redis中最基本的數據類型,它能存儲任何形式的字元串,包括二進位數據。可以用其存儲用戶的郵箱、JSON化的對象甚至是一張圖片。一個字元串類型鍵允許存儲的數據的最大容量是512 MB。
字元串類型是其他4種數據類型的基礎,其他數據類型和字元串類型的差別從某種角度來說只是組織字元串的形式不同。例如,列表類型是以列表的形式組織字元串,而集合類型是以集合的形式組織字元串。

賦值、取值

SET key value
GET key

SET成功返回OK,GET鍵不存在時返回空(nil)。

增加、減少數字

當操作的字元串是數字形式時,可以用這些命令方便地增加、減少數字
遞增、遞減操作分別為:

INCR key
DECR key

當操作的鍵不存在時,會先創建一個預設為0的值,所以使用INCR得到的結果為1。
如果被操作的鍵值不是整數,會給出錯誤提示: (error) ERR value is not an integer or out of range

增加、減少指定整數:

INCRBY key increment
DECRBY key decrement

INCRBY key1 3就相當於DECRBY key1 -3

增加、減少指定浮點數,支持雙精度浮點數。

INCRBYFLOAT key increment
DECRBYFLOAT key decrement

這些命令都是原子操作,可以保證多客戶端連接的併發場景下讀取寫入不會出錯。

向尾部追加值

APPEND key value

如果鍵不存在則將該鍵的值設置為value。返回值是追加後字元串的總長度。

> SET key1 hello
OK
> APPEND key " world!"
(integer) 12

上面的操作得到的就是“hello world”,由於需要在單詞之間有空格,append時的值用雙引號包裹。

獲取字元串長度

STRLEN key

如果鍵不存在則返回0。

同時獲取/設置多個鍵值

MGET key1 key2 ...
MSET key value key1 value1 ...

散列

Redis是採用字典結構以鍵值對的形式存儲數據,而散列類型(hash)的鍵值也是一種字典結構,其存儲了欄位(field)和欄位值的映射,但欄位值只能是字元串,不支持其他數據類型,所以不能嵌套存儲其他數據類型。Redis的其他數據類型也不支持數據類型的嵌套,比如集合類型的每個元素都只能是字元串。
一個散列類型的鍵可以最多包含2^32-1個欄位。
散列類型適合存儲對象,使用類名和ID構成鍵名,使用欄位表示對象的屬性,而欄位值則存儲屬性的值,這樣散列類型就與最簡單的DTO類構成了映射關係。

賦值與取值

 HSET key field value
 HGET key field

這組命令用來設置、獲取單個欄位的值。HSET命令不區分插入和更新操作,修改數據時不用事先判斷欄位是否存在來決定要執行的是插入還是更新,可以通過命令的返回結果來判斷插入還是更新,插入時返回1,更新時會返回0。當鍵或者欄位不存在時,HSET命令還會自動建立它們。

HMSET、HMGET則可以一次操作多個欄位:

 HMSET key field value [field value ...]
 HMGET key field [field value  ...]

獲取鍵的所有欄位使用HGETALL:

 HGETALL key

這個命令返回的結果是欄位和欄位值組成的列表:

1)"price"
2)"500"
3)"name"
4)"BMW"

判斷欄位是否存在

 HEXISTS key field

如果存在則返回1,否則返回0,如果鍵不存在也會返回0。

當欄位不存在時賦值

HSETNX key field value

HSETNX命令只有當欄位不存在時才進行賦值,如果欄位已經存在,將不執行任何操作。

增加、減少數字

HINCRBY key field increment

需要減少值時增量設為負值。如果鍵或者值不存在時將初始化並設置為1。

刪除欄位

HDEL key field1 field2 ...

可以刪除一個或多個欄位,被刪除的欄位個數作為返回值。

只獲取欄位名或欄位值

HKEYS key
HVALS key

這組命令會獲取鍵中所有欄位的名稱或值。

列表

列表類型可以存儲一個有序的字元串列表,常用的操作是向列表兩端添加元素,或者獲得列表的某一個片段。列表類型內部是使用雙向鏈表實現的,向列表兩端添加元素的時間複雜度為O(1),獲取越接近兩端的元素速度就越快,但通過索引訪問元素的速度卻比較慢。

所以列表類型最適合於訪問前某幾個元素的場景,比如熱點新聞。一個列表類型鍵最多能容納的元素數量也是2^32-1個。

向列表兩端增加元素

 LPUSH key value [value ...]
 RPUSH key value [value ...]

LPUSH和RPUSH分別用來先列表的左邊和右邊增加元素,返回值表示增加元素後列表的長度。可以同時增加多個元素。

從列表兩端彈出元素

 LPOP key
 RPOP key

LPOP和RPOP分別從列表的左邊和右邊彈出一個元素,返回值元素的內容,如果列表為空,返回(nil)。

獲取列表中元素的個數

 LLEN key

如果列表為空或不存在,則返回0。

獲得列表片段

 LRANGE key start stop

返回索引從start到stop之間的所有元素(包含兩端的元素),與大多數人的直覺相同,Redis的列表起始索引,左邊為從0開始,右邊為從-1開始,-2表示右邊第二個元素,以此類推。
如果start的索引位置比stop的索引位置靠後,則會返回空列表;如果stop大於實際的索引範圍,則會返回到列表最右邊的元素。

刪除列表中指定的值

LREM key count value

刪除列表中前count個值為value的元素,返回值是實際刪除的元素個數。
count值的正負會決定從刪除開始的方向:

  • 當count>0時LREM命令會從列表左邊開始刪除前count個值為value的元素;
  • 當count<0時LREM命令會從列表右邊開始刪除前|count|個值為value的元素;
  • 當count=0時LREM命令會刪除列表中所有值為value的元素。

獲得/設置指定索引的元素值

LINDEX key index
LSET key index value

與LREM類似,index >= 0表示從左邊開始計算索引,index < 0則從右邊開始。

只保留列表指定片段

LTRIM key start end

刪除指定索引範圍之外的所有元素,其指定列表範圍的方法和LRANGE命令相同。

向列表中插入元素

LINSERT key BEFORE|AFTER privot value

LINSERT命令首先會在列表中從左到右查找值為pivot的元素,然後根據第二個參數是BEFORE還是AFTER來決定將value插入到該元素的前面還是後面。命令的返回值是插入後列表的元素個數。

將元素從一個列表轉到另一個列表

RPOPLPUSH source destination

這個命令會先對source執行RPOP命令,從它的右邊彈出一個元素,再對destination執行LPUSH命令,將元素加入到這個列表的左邊,並返回這個元素的值。整個過程是原子的。
RPOPLPUSH命令可以很直觀地在多個隊列中傳遞數據。當source和destination相同時,RPOPLPUSH命令會不斷地將隊尾的元素移到隊首,同時列表中仍然可以增加、刪除元素。

集合

同列表類型相比,集合類型中的元素不能相同,同時元素沒有順序。
一個集合類型鍵可以存儲的字元串數量最多也是2^32 -1個。
集合類型的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等,由於集合類型在Redis內部是使用值為空的散列表(hashtable)實現的,所以這些操作的時間複雜度都是O(1)。最方便的是多個集合類型鍵之間還可以進行並集、交集和差集運算。

增加/刪除元素

 SADD key member [member ...]
 SREM key member [member ...]

這組命令用來向集合中增加或刪除一個或多個元素,增加時如果鍵不存在則會自動創建。因為在一個集合中不能有相同的元素,所以增加時如果要加入的元素已經存在於集合中,就會忽略這個元素。命令的返回值是成功加入或刪除的元素數量。

獲得集合中的所有元素

 SMEMBERS key

判斷元素是否在集合中

 SISMEMBER key mumber

這項操作的時間複雜度為O(1),無論集合中有多少個元素,SISMEMBER命令都可以非常快地返回結果。當值存在時返回1,不存在或鍵不存在時返回0。

獲得集合中元素個數

SCARD key

集合間運算

 SDIFF key [key...]
 SINTER key [key...]
 SUNION key [key...]

這組命令用來對多個集合進行差集、交集、並集運算。

 SDIFFSTORE destination key [key...]
 SINTERSTORE destination key [key...]
 SUNIONSTORE destination key [key...]

這組命令會把集合間運算的結果存儲到destination中。

有序集合

有序集合類型與集合類型相比,它為其中的每個元素都關聯了一個分數,這使得可以對元素進行取前N個、獲得指定分數範圍內的元素等操作。
有序集合中的元素也是各不相同的,但元素的分數可以相同。

有序集合類型與列表類型相比,相似的地方在於二者都是有序的,也都可以獲得指定範圍的元素;但他們的區別大於共性:

  • 在存儲結構上,列表類型是通過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多後,訪問中間數據的速度會較慢,所以它更適合很少訪問中間元素的場景;有序集合類型則是使用散列表和跳躍表實現的,所以即使讀取位於中間部分的數據速度也很快。

  • 列表中不能簡單地調整某個元素的位置,但是在有序集合中通過更改元素的分數就可以做到。

  • 有序集合要比列表類型更耗費記憶體。

增加元素

 ZADD key score member [score member ...]

ZADD命令用來向有序集合中加入若幹元素和該元素的分數,如果該元素已經存在則會用新的分數替換原有的分數。命令的返回值是新加入到集合中的元素個數(不包含之前已經存在的元素)。
這裡設置的分數可以是整數,也可以是雙精度浮點數,還可以設置為+inf和-inf來分別表示正無窮和負無窮。

獲得元素的分數

 ZSCORE key member

獲得排名在某個範圍的元素列表

 ZRANGE key start stop [WITHSCORES]
 ZREVRANGE key start stop [WITHSCORES]

ZRANGE和ZREVRANGE命令分別按照元素分數從小到大和從大到小的的順序返回索引從start到stop之間的所有元素(包含兩端的元素)。
在命令的尾部加上WITHSCORES可以同時獲得元素的分數。
如果兩個元素的分數相同,Redis會按照字典順序(即"0" < "9" <"A" < "Z" < "a" < "z"這樣的順序)來進行排列,如果元素是中文,會按照中文編碼來排序。

索引>=0表示從前往後查找,為<0表示從後往前查找。

 ZRANGE key1 0 4
 ZRANGE key1 1 -1

獲得指定分數範圍的元素

 ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]

按照元素分數從小到大的順序返回分數在min和max之間的元素,預設包含min和max,如果希望分數範圍不包含端點值,可以在分數前加上'('符號

 ZRANGEBYSCORE key1 (60 80

這樣寫獲取的範圍就是 60< score <= 80。

這裡也同樣可以用-inf和+inf分別表示負無窮和正無窮。

用WITHSCORES可以同時獲得元素的分數。

[LIMIT offset count]表示在獲得的元素列表的基礎上向後偏移offset個元素,並且只獲取前 count個元素。
比如想獲得分數高於60分的從第二個人開始的3個人:

 ZRANGEBYSCORE key1 60 +inf LIMIT 1 3

與ZRANGEBYSCORE對應的,還有ZREVRANGEBYSCORE,它會按照元素分數從大到小的順序返回分數在max和min之間的元素

 ZREVRANGEBYSCORE key max min [WITHSCORE] [LIMIT offset count]

增加某個元素的分數

 ZINCRBY key increment member

返回值是更改後的分數,這個操作也是原子的。

獲得指定分數範圍內的元素個數

 ZCOUNT key min max

min max可以指定為+inf -inf,也可以用(來設置邊界條件。

刪除一個或多個元素

 ZREM key member [member ...]

返回值是成功刪除的元素數量(不包含本來就不存在的元素)。

按照排名範圍刪除元素

 ZREMRANGEBYRANK key start stop

按照元素分數從小到大的順序(即索引0表示最小的值)刪除處在指定排名範圍內的所有元素,並返回刪除的元素數量。索引負值表示從後向前查找。

按照分數範圍刪除元素

 ZREMRANGEBYSCORE key min max

刪除指定分數範圍內的所有元素,參數min和max的特性和ZRANGEBYSCORE命令中的一樣。返回值是刪除的元素數量。

獲得元素的排名

 ZRANK key member
 ZREVRANK key member

這組命令會分別按照元素分數從小到大、從大到小的順序獲得指定的元素的排名(從0開始,即分數最小或最大的元素排名為0)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近,團隊的小伙伴們在做項目時,需要用到JWT認證。遂根據自己的經驗,整理成了這篇文章,用來幫助理清JWT認證的原理和代碼編寫操作。 第一部分:Dotnet core使用JWT認證授權最佳實踐(一) (接上文) 測試運行 % dotnet run 等程式運行起來後,在瀏覽器輸入:http://loc ...
  • [TOC] 1.查看當前版本 2.下線升級的節點 3.解壓,改名,創建軟鏈接 4.拷貝conf文件和cert文件和sh腳本 5.重啟服務並檢查 ...
  • 工作中如果你是Linux運維,或者程式員,一定經常需要一個Linux的環境來讓你折騰。這個時候使用虛擬機對我們來說是一個不錯的選擇。 虛擬化技術目前主要有兩種:一、原生架構,這種虛擬機產品直接安裝在電腦硬體上,不需要操作系統的支持,這類虛擬機擁有強大的性能,主要用於生產環境,比如vSphere、C ...
  • 大家好,我是良許。 硬碟是電腦非常重要的一個部件,不管是代碼,還是 UI 、聲音、文檔,抑或是沒人時偷偷看的小視頻,都需要保存在硬碟里。 對於很多 Linux 伺服器,會進行很多的編譯操作。而編譯操作在很多情況下都會產生大量的中間文件,這些文件會占用很多的磁碟空間,導致磁碟空間一直吃緊。 別問為啥 ...
  • 一、準備環境 1)獲取crash工具。註意區分版本(arm/arm64/x86_64)。 2)獲取對應軟體版本的符號表文件(如vmlinux),可以將該文件放置 crash工具同一目錄下。 3)獲取sysdump文件,並把所有sysdump文件追加到一個文件sysdump.core中: 4)使用cr ...
  • 每日一句英語學習,每天進步一點點: 前言 為了讓大家更容易「看得見」 TCP,我搭建不少測試環境,並且數據包抓很多次,花費了不少時間,才抓到比較容易分析的數據包。 接下來丟包、亂序、超時重傳、快速重傳、選擇性確認、流量控制等等 TCP 的特性,都能「一覽無雲」。 沒錯,我把 TCP 的"衣服扒光"了 ...
  • 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 ...
  • 偷個懶,晚上工作忙的太晚,整個複製功能的內容還沒有寫完,這裡先說一下複製功能的簡單應用。 在Redis中,用戶可以通過執行SLAVEOF命令或者設置slaveof選項,讓一個伺服器去複製另一個伺服器,我們稱呼被覆制的伺服器為主伺服器(master),而對主伺服器進行複製的伺服器則被稱為從伺服器(sl ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...