redis分布式鎖和非同步佇列

2021-10-09 20:01:58 字數 1792 閱讀 5116

redis 五種基本資料型別

string

list

hash

setsortedset

redis 從海量資料裡查詢某一固定字首的 key:

keys pattern:查詢所有符合給定模式 pattern 的 key。

keys一次性返回所有的key

鍵的數量過大會使服務卡頓

scan cursor [match pattern] [count count]

(scan 每次執行都只返回少量元素)

scan 是基於游標的迭代器,需要基於上一次的游標,延續之前的迭代過程

以0為游標開始一次新的迭代,知道命令返回游標 0 完成一次遍歷

不保證每次執行都返回指定數量的元素,支援模糊查詢

一次返回的數量不可控,只能是大概率符合 count 引數

例:scan 0 match k1* count 10 (cursor 並不一定是遞增的,因此獲取到的key有可能重複)

redis 如何實現分布式鎖

分布式鎖是控制分布式系統或不同系統之間,共同訪問共享資源的一種鎖的實現

如果同乙個系統或不同系統的主機之間共享了某個資源時往往需要互斥來防止彼此干擾,進而保證一致性

分布式鎖需要解決的問題:

互斥性 任一時刻只能有乙個客戶端獲取鎖,不能同時有兩個客戶端獲取到鎖

安全性 鎖只能被持有該鎖的客戶端刪除,不能由其他客戶端刪除

死鎖 獲取鎖的客戶端因為某些原因而宕機而未能釋放鎖,其他客戶端再也不能獲取到鎖而導致了死鎖,此時需要有機制來避免這個問題的發生

容錯 某一些節點宕機時,客戶端依然能獲取到鎖和釋放鎖

如何實現?

setnx key value : 如果key不存在則建立並賦值 (set if not exists)

時間複雜度 o(1) ,設定成功返回1,設定失敗返回 0 , 不持之expire引數

如何解決 setnx 長期有效問題?

expire key seconds 設定key 的生存時間,key 過期會被自動刪除

缺點:原子性得不到滿足

推薦方式:

set key value [ex seconds] [px milliseconds] [nx|xx]

ex seconds :設定 key 的過期時間為 second 秒

px milliseconds : 設定鍵的過期時間為 millisecond 毫秒

nx:只在鍵不存在時,才對鍵進行設定操作

xx:只在鍵已存在時,才對鍵進行設定操作

大量key同時過期的注意事項

集中過期,由於清除大量的 key 很耗時,會出現短暫的卡頓現象

解決方法:在設定過期時間時,給key加上隨機值

如何實現非同步佇列?

使用list作為佇列,rpush產生佇列,lpop消費訊息

缺點:沒有等待佇列裡有值就直接消費

彌補:可以通過在應用層引入 sleep 機制去呼叫 lpop 重試

blpop key [key…] timeout :在沒有訊息時阻塞直到佇列有訊息或超時

缺點:只能供乙個消費者消費

推薦:pub/sub 主題訂閱者模式

傳送者(pub)傳送訊息,訂閱者(sub) 接收訊息

訂閱者可以訂閱任意數量的頻道

subscribe mytpoic (訂閱)

publish mytpoic 「hello" (發布)

缺點:訊息的發布是無狀態的,無法保證可達

Redis實現非同步佇列

可以考慮利用list結構進棧出棧實現,那麼基本上你會需要以下步驟 description configonlinemodel author elegant date 2019 11 29 data public class configonlinemodel implements serializa...

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...