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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...