Redis基礎知識(學習筆記1--五種基礎數據結構)

来源:https://www.cnblogs.com/xuliuzai/p/18227696
-Advertisement-
Play Games

作為阿裡早期的開源產品,DataX是一款非常優秀的數據集成工具,普遍被用於多個數據源之間的批量同步,包括類似Apache DolphinScheduler的Task類型也對DataX進行了適配和增強,可以直接在DolphinScheduler裡面利用通用的數據源調用DataX進行數據批量同步。 作為 ...


Redis 有5種基礎數據結構,分別為string(字元串)、list(列表)、hash(字典)、set(集合)和zset(有序集合)。

1 String 結構

1.1 字元串常用操作

SET key value                    //存入字元串鍵值對
MSET key value [key value...]    //批量存儲字元串鍵值對
SETNX key value                  //存入一個不存在的字元串鍵值對,如果已將存在,則set創建不成功,原來的值不變。
GET key                          //獲取一個字元串鍵值
MGET key [key...]                //批量獲取字元串鍵值
DEL key [key...]                 //刪除一個健
EXPIRE key seconds               //設置一個健的過期時間(秒)

1.2 原子操作

INCR key                       //將key所存儲的數字值加1--value值需要是整數,它的範圍在signed long 的最大值和最小值之間,超出範圍,會報錯。
DECR key                       //將key所存儲的數字值減1
INCRBY key increment           //將key所存儲的值加上increment
DECRby key decrement           //將key所存儲的值減去decrement

 2. String 應用場景

2.1 單值緩存

SET key value
GET key

2.2 對象緩存

SET user:1 value(json格式數據)

2.3 分散式鎖

SETNX product:10001 true            //返回1代表獲取鎖成功
SETNX product:10001 true           //返回0代表獲取鎖失敗
...執行業務操作
DEL product:10001                  //執行完業務釋放鎖
SET product:10001 true ex 10 nx    //防止程式意外終止導致死鎖

2.4 計數器

INCR article:readcount:{文章id}
GET  article:readcount:{文章id}

2.5 分散式系統全局序列號

INCRBY orderId 100   //redis批量生成序列號提升性能

3. Hash 結構

Redis的hash相當於Java裡面的HashMap,它是無序字典,內部存儲了很多鍵值對。

Hash 常用操作

HSET key field value                      // 存儲一個哈希表key的鍵值
HSETNX key field value                    // 存儲一個不存在的哈希表key的鍵值
HMSET key field value [field value...]   //在一個哈希表key中存儲多個鍵值對
HGET key field                           //獲取哈希表key對應的field鍵值
HMGET key field [field...]               //批量獲取哈希表key中多個field鍵值
HDEL key field [field...]                //刪除哈希表key中的field鍵值
HLEN key                                 //返回哈希表key中field的數量
HGETALL key                              //返回哈希表key中所有的鍵值

HINCRBY key field increment             //為哈希表key中field健的值加上增量increment

當hash移除了最後一個元素之後,該數據結構被自動刪除,記憶體數據被回收。

4 Hash 應用場景

4.1 對象緩存

hash 結構可以用來存儲用戶信息,與字元串需要一次性全部序列化整個對象不同,hash可以對用戶結構中的每個欄位單獨存儲。這樣當我們需要獲取用戶信息時,可以進行部分獲取。

// 例如記錄員工的信息(userid、username、balance)
HMSET user {userid}:name xiaoming {userid}:balance 30000
HMSET user 1:name xiaoming 1:balance 30000
HMGET user 1:name 1:balance

 4.2 電商購物車

1)以用戶id為key;2)以商品id為field;3)以商品數量為value。

購物車操作(假設此時用戶的id為1001;商品id為10088)

1)添加商品--> hset cart:1001 10088 1

2)增加數量-->hincrby cart:1001

3) 商品總數-->hlen cart:1001

4)刪除商品-->hdel cart:1001 10088

5)獲取購物車所有商品-->hgetall cart:1001

5.List 結構

List常用操作

LPUSH key value [value...]       //將一個或多個值value插入到key列表的表頭(最左邊)
RPUSH key value [value...]       //將一個或多個值value插入到key列表的表尾(最右邊)
LPOP key                         //移除並返回key列表的頭元素
RPOP key                         //移除並返回key列表的尾元素
LRANGE key start stop            //返回列表key中指定區間內的元素,區間以偏移量start和stop指定

BLPOP key [key...] timeout       //從key列表表頭彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

BRPOP key [key...] timeout       //從key列表表尾彈出一個元素,若列表中沒有元素,阻塞等待timeout秒,如果timeout=0,一直阻塞等待

 List 是鏈表而不是數組。這意味著list的插入和刪除操作非常快,時間複雜度為O(1),但是索引定位很慢,時間複雜度為O(n)。

當列表彈出了最後一個元素之後,該數據結構被自動刪除,記憶體數據被回收。

6 List應用場景

列表結構常用來做非同步隊列使用。將需要延後處理的任務結構體序列化成字元串,塞進Redis列表,另一個線程從這個列表種輪詢數據進行處理。

6.1 常用分散式數據結構

隊列是 先進先出 的數據結構,常用於消息排隊和非同步邏輯處理,它會確保元素的訪問順序。

Queue(隊列) = LPUSH + RPOP

棧是 先進後出 的數據結構,跟隊列正好相反。

Stack(棧) = LPUSH + LPOP

Blocking MQ(阻塞隊列) = LPUSH + BRPOP

6.2 微博和微信公眾號消息流

 假如小明關註了Caoz,瘋狂賽車等大V

1)Caoz發微博,消息ID為10018

LPUSH msg:{小明-id} 10018

2)瘋狂賽車發微博,消息ID為10086

LPUSH msg:{小明-id} 10086

3)顯示最新的5條微博消息

LRANGE msg:{小明-id} 0 4

7 Set 結構

set 相當於Java裡面的HashSet,它內部的鍵值對是無序的、唯一的。它的內部實現相當於一個特殊的字典,字典中所有的value都是一個值NULL。

當集合中最後一個元素被移除後,數據結構被自動刪除,記憶體被回收。

7.1 Set 常用操作

SADD key member [member...]        //往集合key中存入元素,元素存在則忽略,若key不存在則新建
SREM key member [member...]        //從集合key中刪除元素
SMEMBERS key                       //獲取集合key中所有元素
SCARD key                          //獲取集合key的元素個數
SISMEMBER key member               //判斷member元素是否存在於集合key中
SRANDMEMBER key [count]            //從集合key中隨機選出count個元素,元素不從key中刪除
SPOP key [count]                   //從集合key中隨機選出count個元素,元素從key中刪除

7.2 Set運算操作

SINTER key [key...]                    //交集運算
SINTERSTORE destination key [key...]   //將交集結果存入新集合destination中
SUNION key [key...]                    //並集運算
SUNIONSTORE destination key [key...]   //將並集結果存入新集合destination中
SDIFF key [key...]                     //差集運算
SDIFFSTORE destination key [key...]   //將差集結果存入新集合destination中

 8. Set 應用場景

8.1 微信抽獎小程式

1)點擊參加抽獎進入集合

SADD key {userID}   ----註意:此時key應替換為抽獎活動的ID

2)查看參與抽獎所有用戶

SMEMBERS key

3)抽取count名中獎者

SRANDMEMBER key [count] /SPOP key [count] 

8.2 微信微博點贊,收藏,標簽

1)點贊

SADD like:{消息ID} {用戶ID}

2)取消點贊

SREM  like:{消息ID} {用戶ID}

3)檢查用戶是否點過贊

SISMEMBER  like:{消息ID} {用戶ID}

4)獲取點贊的用戶列表

SMEMBERS like:{消息ID}

5)獲取點贊用戶數

SCARD  like:{消息ID}

 8.3 通過集合操作 實現微博微信關註模型

1)諸葛老師關註的人:

zhugeSet-->{zhuangzhou,xushu}

2)樓蘭老師關註的人:

loulanSet-->{zhuge,zhouyu,zhuangzhou,xushu}

3)莊周老師關註的人:

zhuangzhouSet-->{zhuge,loulan,zhouyu,xushu,xunyu}

4)諸葛老師和樓蘭老師共同關註:

SINTER zhugeSet loulanSet -->{zhuanzhou,xushu}

5)我【諸葛老師】關註的人也關註他(樓蘭老師):【解析:我關註的就兩個人嘛 ,即zhuangzhou和xushu,那就去這兩個人的集合中,去判斷元素是否存在集合中唄】

SISMEMBER zhuangzhouSet loulan

SISMEMBER xushuSet loulan

6)我可能認識的人:

SDIFF loulanSet zhugeSet-->{zhuge,zhouyu}

9 ZSet 有序集合結構

zset 類似於Java中的SortedSet 和 HashMap的結合體,一方面它是一個set,保證了內部value的唯一性,另一方面,它可以給每個value賦予一個score,代表這個value的排序權重。

9.1 ZSet 常用操作

ZADD key score member [[score member]...]     //往有序集合key中加入帶分值元素
ZREM key member [member...]                   //從有序集合key中刪除元素
ZSCORE key member                             //返回有序集合key中元素member的分值
ZINCBY key increment member                   //為有序集合key中元素member的分值加上increment
ZCARD key                                     //返回有序集合key中元素個數
ZRANGE key start stop [WITHSCORES]            //正序獲取有序集合key從start下標到stop下標的元素
ZREVRANGE key start stop [WITHSCORES]         //倒序獲取有序集合key從start下標到stop下標的元素

9.2 ZSet集合操作

ZUNIONSTORE destkey numkeys key [key]  //並集計算
ZINTERSTORE destkey numkeys key [key]  //交集計算

zset中最後一個value被移除後,數據結構被自動刪除,記憶體被回收。

 10 ZSet 集合操作實現排行榜

1)點擊新聞

ZINCRBY hotNews:20200819 1 XX發佈會

2)展示當日排行前十

ZREVRANGE hotNews:20200819 0 9 WITHSCORES

3)七日搜索榜單計算

ZUNIONSTORE hotNews:20200813-20200819 7 hotNews:20200813 hotNews:20200814...hotNews:20200819

4)展示七日排行前十

ZREVRANGE hotNews:20200813-20200819 0 9 WITHSCORES

 11  結構總結

如果想查看key的結構類型,執行下麵的命令

type keyname

如果想查看key的存儲類型,例如,我知道了key是zset類型,但是我想知道它的存儲類型,是壓縮列表(ziplist),還是跳躍列表(skiplist),

可以執行下麵的命令,進行查看

object encoding keyname

 12 容器類型數據結構的通用規則

list、set、hash、zset 這四種數據結構都是容器類型數據結構,他們共用下麵兩條通用規則

1)create if not exists

如果容器不存在,就創建一個,再進行操作。

比如rpush操作剛開始是沒有列表的,Redis就會自動創建一個,然後再rpush進去新元素。

2)drop if not elements

如果容器里的元素沒有了,那麼立即刪除容器,釋放記憶體。這意味著lpop操作到最後一個元素,列表就消失了。

 

學習參閱聲明

1.--【從原理到實戰(2023最新版)】

https://www.bilibili.com/video/BV1Gs4y1Q7Ls?p=6&vd_source=0e347fbc6c2b049143afaa5a15abfc1c

2.《Redis深度歷險--核心原理與應用實踐》


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

-Advertisement-
Play Games
更多相關文章
  • 目錄題目分析代碼結果 題目 小組實現,小組中的每位成員都需要設計程式,要求程式可以加入到一個多播組中並等待伺服器發送數據包,並且程式還需要具有發送功能,如果收到數據包則把消息內容輸出到終端, 消息內容格式 [消息來源IP 消息時間 ] : 消息內容 分析 1.發送端需設置套接字的廣播屬性,使用set ...
  • 目錄題目分析代碼結果 題目 設計程式實現解析www.baidu.com的功能變數名稱,把獲取到的百度的IP地址全部輸出到終端並驗證是否正確。 分析 1.通過目標功能變數名稱獲取目標IP地址對應的網路位元組序(需強轉為對應的類型),使用gethostbyname()函數; 2.把獲取的網路位元組序轉換為點分十進位的IP地 ...
  • 目錄題目解析代碼實現 題目 解析 由於該題需要實現組播通信,所以我們需要將套接字文件句柄設置為組播屬性,並將需要通信的用戶端IP地址,加入組中。 由於組播通信需要實現一對多發送消息,所以還需要將套接字文件句柄的廣播屬性一併開啟。 由於該題實現過程使用到了線程相關函數介面,所以編譯時需要帶上 “-pt ...
  • 玩客雲安裝Armbian和Java SDK的過程可以分為兩個獨立的部分:首先是安裝Armbian系統,其次是在Armbian系統上安裝Java SDK。以下是詳細的步驟: 一、玩客雲安裝Armbian系統 準備工作 準備一個可用的玩客雲設備。 下載與玩客雲設備相容的Armbian鏡像文件。 準備一個 ...
  • 問題描述 使用vmware新建伺服器,明明給系統盤分配了一個200GB的磁碟空間,伺服器創建成功後,但是伺服器中啟動一個大小約為11GB的docker服務卻提示 磁碟空間不足 no space left on device。 解決過程 檢查磁碟掛載詳情 `[root@SkyEye ~]# lsblk ...
  • 介紹 Apache DolphinScheduler是一個分散式易擴展的開源分散式調度系統,支持海量數據處理,具有任務流程調度、任務流程編排、任務監控告警、工作流引擎等功能。 本文將介紹如何將Apache DolphinScheduler集成到 Java Springboot 項目中,以實現更靈活和 ...
  • 近日,中國電信天翼雲的自研產品HBlock憑藉“存儲資源盤活技術”成功入選《國家工業和信息化領域節能降碳技術裝備推薦目錄(2024年版)》(以下簡稱《目錄》),這一成績是對中國電信天翼雲以科技創新賦能千行百業綠色低碳發展的認可。存儲資源盤活技術作為該目錄唯一的存儲軟體技術,能夠快速整合現網資源,大幅... ...
  • 一般資料庫中可能存在長連接或短連接會話。長連接是相對於通常的短連接而說的,也就是長時間保持客戶端與服務端的連接狀態。如果不從應用程式入手,如何判斷SQL Server資料庫中哪些會話是長連接呢? 在SQL Server中有連接與會話的概念,一般而言,連接是物理概念,而會話則是邏輯上的概念。兩者是對同 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...