Redis入門指南(二)

2022-04-02 23:25:40 字數 2928 閱讀 9103

使用sort命令,操作集合類,和列表和有序集合類; sort key alpha 按照字典順序排列非數字。sort key desc

by 引數, 可以排序雜湊型別,甚至是字串型別(根據名稱+萬用字元)

get 排序之後 獲取值

store 儲存

優化:sort是redis最強大最複雜的命令之一。使用不好很容易成為效能的瓶頸。sort命令時間複雜度o(n+mlogm),n :排序的列表的元素個數,m 返回的元素個數。 n較大是,sort效能較低。

1儘量減少待排序鍵中的元素的數量(使n小)

2 使用limit引數之後取需要的資料(使m小)

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

expire key seconds 返回1表示成功,0表示失敗。(沒有鍵無法設定過期)。pexpire key milli

ttl key, 返回鍵的剩餘壽命,不存在返回-2。永久(預設)返回-1。pttl key

presist ,取消過期時間,使其永久。使用set,getset也會消除過期。其他指令均不會消除。watch不會認為到期刪除的鍵是被改變。

expireat , pexpireat ; 使用unix時間作為引數。

應用:實現訪問頻率的限制。(1 使用string 的 incre ;2 列表型別:記錄時間,次數到了,計算差值)

為了提高**負載能力,通常需要將一些訪問頻率高,但是對cpu或io資源消耗較大的操作的結果快取起來,並且定期過期資料再次更新。例如微博的熱搜版,五分鐘過期鍵,重新再計算一次。

然而有些場景,如果大了使用快取,且過期時間長,則記憶體占用過多;如果過期時間短,可能導致快取命中率過低並且浪費大了記憶體白白閒置。這時:

(記憶體優先,需要淘汰規則):修改maxmemory, 限制redis最大可用記憶體(單位是位元組),超過這個限制會依據 maxmemory-policy 引數指定的策略來刪除不需要的鍵。

事務是一組命令的集合,同命令一樣,也是redis最小的執行單位。

multi 開啟事務,接下來的命令會被放到queue中,exec提交,開始執行queue中的命令。 事務可以讓事務內的命令依次執行,所以客戶端a想要執行幾條命令,b客戶端傳送一條命令,a開啟了事務,那麼b就不會插入到a客戶端的幾條命令中執行。

語法錯誤,如果有一條命令有語法錯誤,exec時都不執行。

執行錯誤,沒有rollback,只能自己收拾爛攤子。

watch:在事務中觀察某個鍵的變化(因為事務是一次性執行所有指令,最後返回結果。這時候無法根據某一條指令的結果進行下一步的操作)watch可以監控乙個或者多個鍵,一旦其中有乙個鍵被修改(或刪除)之後的事務不會執行,執行exec之後,會取消對所有的鍵的監控。如果不想執行監控了我們可以使用unwatch來取消監控。ps , multi 後的命令是在exec之後執行的。通過cas操作實現樂觀鎖

當頁面需要傳送郵件,複雜的運算,會阻塞頁面的渲染。避免等太久,可以考慮使用其他的程序來達到非同步的效果。此處可以詳見 p87

特點:松耦合,易於擴充套件。

使用rpop 就可以一直拿,當然避免沒有資料還一直執行,使用 brpop 可以設定超時時間。超過時間,則會返回nil ; 0表示不限制等待,沒有就永遠阻塞下去。

優先順序佇列:bpop key [key...] 0檢測多個鍵,如果所有鍵沒有元素則阻塞。可以優先消費 key在前的訊息。

publish channel message 向某頻道傳送訊息,只有先訂閱,後發布的訊息才能獲取。

subcribe channel 訂閱,訂閱狀態下的 只能執行 subcribe 、ubsubbirbe 、psubcribe 、punsubcribe 命令。

收到的訊息有三種:subcribe 、 message、unsubcribe

可以使用psubcribe,規則支援glob風格。可以重複訂閱。退訂:punsubcribe(只退訂psubcribe同理對unsubcribe)

psubcribe channel?*

客戶端和redis使用tcp協議鏈結,此間總耗時,成為往返延時。

(單執行緒的原因?)在執行多命令時,需要等待上一條命令執行完(即收到redis返回的結果)才能執行。

redis的底層通訊協議對管道提供了支援,通過管道可以一次性傳送多跳命令並在執行完後一次性將結果返回。通過管道減少與redis的通訊次數。第五章講到 程式語言在開發時使用管道技術。

redis為每種資料型別都提供了兩種內部編碼的方式。雜湊型別是通過雜湊表實現的。(p94)

檢視內部編碼的方式 object encoding

字串:使用 redis_encoding_embstr 編碼儲存 字串(該編碼與 redis_encoding_raw類似)也是基於sdshdr實現的,不過結構體是在一塊連續的記憶體空間中。

雜湊型別:使用 ht 和 ziplist 儲存,如果字段個數沒有超過 hash-max-ziplist-entries ,和字段長度沒有超過 hash-max-ziplist-value 就用ziplist儲存。 ht 是 hash table 儲存的,可以實現o(1)時間複雜度的賦值和取值。其字段和字段值都是用redisobject,所有優化可以用字串優化。ziplist 是緊湊型編碼,犧牲了部分讀取性,換去極高的空間利用率,適合在元素較少時使用。

列表: linkedlist ziplist

集合型別:ht intset

有序集合型別 skiplist ziplist

Redis入門指南

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

redis入門指南(1)

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

Redis入門指南之高階

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