Redis入門指南 筆記 高階

2022-04-06 08:33:26 字數 3504 閱讀 4520

4.1 事務

(1) 事務是一組命令的集合

(2) 事務同命令一樣是redis的最小執行單位,乙個事務中的命令要麼都執行,要麼都不執行。

(3) 格式:

multi //告訴redis,下面我給你的命令屬於同乙個事務,你先不要執行,而是把他們暫時儲存起來;

命令1;

命令2;

exec //告訴redis將等待執行的事務佇列中的所有命令按照傳送順序依次執行

//事務中的命令是在exec之後才執行

//exec命名返回值是多行字串

(4) redis的事務沒有關聯式資料庫事務提供的回滾(rollback)功能---將乙個事務已經完成的的對資料庫的修改操作撤銷

(5) watch:

1) 事務執行後的結果都是一起返回的,無法將前一條命令的結果作為後一條命令的引數

2) 有時想先獲得一條命令的返回值,然後再根據這個值執行下一條命令

3) watch命令可以監控乙個或多個鍵 ,一旦其中有乙個鍵被修改或者刪除,之後的事務就不會執行;

監控一直持續到exec命令

4)執行exec命令後會取消對所有鍵的監控,如果不想執行事務中的命令,也可以用unwatch來取消監控。

4.2 生存時間

(1) 應用場景:會遇到一些有時效的資料,比如限時優惠活動、快取或驗證碼等,過了一定的時間就需要刪除這些資料。

(2) redis中可以使用expire命令設定乙個鍵的生存時間,到時間後redis會自動刪除它。

expire key seconds(單位為秒,必須為整數)

返回1:表示設定成功

返回0:表示鍵不存在或設定失敗

(3) ttl命令:知道乙個鍵還有多久的時間會被刪除

返回值-1:表示鍵被刪除而不存在或者沒有為鍵設定生存時間(即永久存在)。

(4) persist:取消鍵的生存時間設定(即將鍵恢復成永久的)

如果生存時間被成功清除,則返回1;否則返回0(鍵不存在或鍵本身就是永久的);

(5) 使用set或getset命令為鍵賦值也會同時清除鍵的生存時間;

(6) 使用expire命令會重新設定鍵的生存時間

(7) pexpire命令與expire命令的區別是前者時間設定更加精確為毫秒

pttl命令以毫秒為單位返回鍵的剩餘時間

(8) redis實現快取----將一些訪問頻率較高但是對cpu或io資源消耗較大的操作的結果快取起來,並希望讓這些快取過一段時間自動過期;

「最近最少使用原則」

4.3 排序----檢視一下標籤下的檔案列表時文章不是按照時間順序排列的

1. 有序集合的集合操作

sort命令---可以對列表型別、集合型別和有序集合型別鍵進行排序,對元素自身的值進行排序

(1) sort 元素 desc(按從大到小順序排列)

(2) sort命令還支援limit引數來返回指定範圍的結果

sort 元素 des limit offset count:跳過前offset個元素並獲取之後的count個元素

by引數:

(1) 語法--by 參考鍵,其中參考鍵可以是字串型別鍵或雜湊型別鍵的某個字段(鍵名->欄位名)

(2) 如果提供了by引數,sort命令將不再依據元素自身的值進行排序,而是對每個元素使用元素的值替換參考鍵中的第乙個*並獲取其值,然後依據該值對元素排序

(3) 當參考鍵名不包含*時(即常量鍵名,與元素值無關),sort命名不會執行排序操作。 

(4) 如果幾個元素的參考鍵值相同,則sort命令會再比較元素本身的值來決定元素的順序。

(5) 當某個元素的參考鍵不存在時,會預設參考鍵的值為0

get引數:

(1) 不影響sort的排序,他的作用是使sort命令的返回結果不再是元素自身的值,而是get引數中指定的鍵值。

(2) get引數的規則和by引數一樣,get引數也支援字串型別和雜湊型別的鍵,並使用*作為佔位符。

(3) 在乙個sort命令中可以有多個get引數

(4) get # 會返回元素本身的值

store引數:

(1) 預設情況下sort會直接返回排序結構,如果希望儲存排序結果,可以使用store引數。

(2) 儲存後的鍵的型別為列表型別,如果鍵已經存在就會覆蓋它。

(3) store引數常用來結合expire命令快取排序結果

效能優化-----sort命令的時間複雜度為o(n+mlogm)[n:表示要排序的列表(集合或有序集合)中元素的個數,m表示要返回的元素個數]

當n較大的時候sort命令的效能相對較低,並且redis在排序前會建立乙個長度為n的容器來儲存待排序的元素。

(1) n減小----盡可能減少待排序鍵中元素的數量

(2) m減小---使用limit引數只獲取需要的資料

(3) 如果要排序的資料數量較大,盡可能使用store引數將結果快取

4.4 訊息通知

1.任務佇列

(1) 與任務佇列進行互動的實體有兩類,一類是生產者,一類是消費者;

(2) 任務佇列的好處

1) 松耦合:生產者和消費者無需知道彼此的實現細節,只需要約定好任務的描述格式

2) 易於擴充套件消費者可以有多個,而且可以分布在不同的伺服器中。

2. redis實現任務佇列

brpop命令和rpop命令相似,唯一的區別是當列表中沒有元素時brpop命令會一直阻塞住連線,知道有新元素加入;

3.優先任務佇列

brpop: 如果所有鍵都沒有元素則阻塞,如果其中有乙個鍵有元素則會從該鍵中彈出元素;如果多個鍵都有元素,則按照從左到右的順序取第乙個鍵中的元素。藉此特性實現了優先任務佇列;

4.「發布/訂閱」模式----實現程序間的訊息傳遞

(1) 發布/訂閱模式中包含兩種角色,分別是發布者(publish)和訂閱者(subscribe)。訂閱者可以訂閱乙個或多個頻道,而發布者可以向指定的頻道傳送訊息,所以訂閱此頻道的訂閱者都會受到此訊息;發出去的訊息不會持久化,就是說剛加入的訂閱者之前的訊息是收不到的。

(2) 進入訂閱狀態後的客戶端可能收到三種型別的回覆。

1) subscribe:表示訂閱成功的反饋資訊。

2) message(最為關心)--它表示接收到的訊息。

3) unsubscribe--表示成功取消訂閱某個訊息;如果不指定頻道會取消所有頻道。

5. 按照規則訂閱

psubsribe:訂閱指定的規則

punsubscribe可以退訂指定的規則

4.5 管道

redis的底層協議對管道提供了支援。通過管道可以一次性傳送多條命令並在執行完後一次性將結果返回,當一組命令中每條命令都不依賴於之前命令的執行結果時就可以將這組命令一起通過管道發出。管道通過減少客戶端與redis的通訊次數來實現降低往返時延累計值的目的。

4.6 節省空間

(1)  精簡鍵名和鍵值

(2)  內部編碼優化

1) 檢視乙個鍵的內部編碼方式可以使用object encoding命令

2) redis的每個鍵值都是使用乙個redisobject結構體儲存的。  

typedef struct redisobject robj;

1. 字串型別

Redis入門指南之高階

事務 redis中的事務 transaction 是一組命令的集合。事務同命令一樣都是redis的最小執行單位。事務的原理 先將屬於乙個事務的命令傳送給redis,然後再讓redis依次執行這些命令。例如 multi sadd exec watch 可以監控乙個或多個鍵,一旦其中乙個鍵被修改 或刪除...

Redis入門指南

4.redis的通用命令 5.redis特性 6.redis持久化 redis 高效能的鍵值對 key value 資料庫。key定義的注意點 不要過長 不要過短 統一的命名規範 快取 任務佇列 訪問統計 資料過期處理 精確到毫秒 分布式集群架構中的session分離 1.概述 2.常用命令 擴充套...

redis入門指南(1)

redis是remote dictionary server 遠端字典伺服器 的縮寫,它以字典結構儲存資料,並允許其他應用通過tcp協議讀寫字典中的內容。redis字典中的鍵值除了可以是字串,還可以是其他資料型別。到目前為止redis支援的鍵值資料型別如下 redis資料庫中的所有資料都儲存在記憶體...