Redis筆記(五) 高階篇

2021-09-01 19:08:22 字數 4357 閱讀 2776

1,redis事務

redis中的事務transaction是一組命令集合,要麼都執行,要麼都不執行。

# multi

# sadd "user:1:following" 2

# sadd "user:2:followers" 1

# exec

redis將客戶端傳送的事務執行鏈放入乙個佇列queue中,然後接受到exec請求後才順序執行這個命令串,同時保證執行這些的時候不被其他命令打擾。

錯誤處理:

* 語法錯誤,redis直接返回錯誤,連語法正確的其他命令也不會執行

* 執行錯誤,只有那條出錯的語句不會執行成功,其他照樣執行

redis木有rollback機制,這個要靠自己去處理出錯情況。

2,watch命令介紹

我們知道在乙個事務中只有當所有的命令都執行完後才能得到每個結果的返回值,可有些情況下需要先獲得一條命令的返回值,然後再根據這個值執行下一條命令。這個時候可以使用watch,watch命令可以監控乙個或多個鍵,一旦其中有乙個鍵被修改或刪除,之後的事務就不會執行。監控一直持續到exec命令(因為事務中的命令是在exec之後才執行的,所以在multi命令後可以修改watch監控的鍵值)

tips:watch命令的作用只是當被監控的鍵值被修改後阻止之後乙個事務的執行,而不能保證其他客戶端不修改這一鍵值,所以我們需要在exec執行失敗後重新執行整個函式

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

3,生存時間

在實際開發中經常會遇到一些有時效的資料,比如限時優惠活動、快取或驗證碼等,過了一定時間就需要刪除這些資料。在redis中可以使用expire命令設定乙個鍵的生存時間,到時間後redis自動刪除它。

# expire key seconds

# ttl key

返回乙個鍵還要多久就要超時,當鍵不存在或者木有為鍵設定超時間接時返回-1

# persist key

取消鍵的生存時間設定,即將鍵恢復成永久

除了persist外,使用set或getset命令為鍵賦值會同時清除鍵的生存時間。其他命令不會

# pexpire key millseconds

以毫秒為單位的超時設定

# expireat key time

使用unix時間作為引數,也就是1970-01-01 00:00:00 到現在的秒數

4,實現快取cache

為了提高**的負載能力,常常需要將一些訪問頻率較高但是對cpu或io資源消耗較大的操作結果快取起來,比如每次獲取乙個單方**,需要去資料庫檢索乙個大字段,請求io資源,然後多執行緒反序列化為乙個物件,請求執行緒資源和cup資源,那麼這個東西就需要快取起來。

一般來講會給快取設定過期時間,防止記憶體被大量占用。

然而在一些場景中這種方法並不能滿足需要,當伺服器記憶體有限的時候,如果大量使用快取鍵其生存時間過長會導致redis佔滿記憶體,另一方面如果生存時間過短會導致快取命中率過低而影響效率。

為此,可以限制redis能夠使用的最大記憶體,並讓redis按照一定的規則淘汰不需要的快取鍵,這種方式在只將redis用做快取系統時候非常實用,哈哈哈哈,原來用做快取只是redis的乙個小小部分功能而已。

具體方法如下:

修改配置檔案的maxmemory引數,單位是位元組,當超過這個限制redis會根據maxmemory-policy引數指定的策略刪除不需要的鍵,直到redis占用記憶體小於指定記憶體。

redis支援的淘汰鍵規則:

* volatile-lru    使用lru演算法刪除乙個鍵(只對設定了生存時間的鍵)

* allkeys-lru    使用lru演算法刪除乙個鍵,這個比較常用

* volatile-random    隨機刪除乙個鍵(只對設定了生存時間的鍵)

* allkeys-random    隨機刪除乙個鍵

* volatile-ttl    刪除生存時間最近的乙個鍵(只對設定了生存時間的鍵)

* noeviction    不刪除鍵,只返回錯誤

事實上redis並不會準確將整個資料庫中最久未被使用的鍵刪除,而是每次從資料庫中隨機取3個鍵並刪除這3個鍵中最久未被使用的鍵,刪除生存時間最接近的鍵的實現方案也是一樣,這個3這個數字可以通過maxmemory-samples來配置。

5,排序

* 有序集合sortedset的集合操作:

sortedset常見使用場景是大資料排序,如遊戲玩家排行榜,所以很少會需要獲得鍵中全部資料。可以使用下列命令序列來獲取集合運算:

multi

zinterscore tempkey ...

zrange tempkey ...

del tempkey

exec

sort命令

sort命令可以對list、set、sortedset進行排序,並且可以完成類似於關係型資料庫中的連線查詢任務。

# sort key alpha desc limit 11, 10

預設sort以數字排序,新增alpha引數可以以字典順序排序,desc表示倒序,limit引數不解釋

by引數

很多情況下list或set中儲存的元素值代表的是物件的id,更多時候我們希望根據id對應的物件的某個屬性進行排序,比如提交時間。

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

# sort tag:python:posts by post:*->time desc

上面的post:*是雜湊鍵hash型別,而time是雜湊鍵值中的乙個屬性

get引數

對於sort排序後獲取了乙個id列表,要顯示所有文章的標題,並不需要對每個id都去請求一次hget,可以使用sort命令的get引數,可以獲取多個字段

# sort tag:python:posts by post:*->time desc get post:*->title get post:*->time get #

最後乙個# 代表還能獲取文章的id,也就是返回元素本身的值

store引數

# sort tag:python:posts by post:*->time desc get post:*->title get post:*->time get # store sort.result

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

sort效能優化:

sort是redis中最強大最複雜的命令之一,如果使用不好很容易成為效能瓶頸。sort命令的時間複雜度是o(n + mlogm),其中n表示要排序的列表中的元素個數,m表示要返回的元素個數。當n較大時候sort命令效能會比較低,並且redis在排序前會建立乙個長度為n的容器來儲存待排序元素,n較大時嚴重影響效能

所以要注意:

* 盡可能減少待排序鍵中元素數量

* 使用limit引數只獲取需要的資料,m盡量小,分頁查詢

* 如果要排序的資料量較大,盡可能使用store引數將結果快取起來。

6,訊息通知

乙個很常見的例子就是傳送郵件。使用redis的list資料結構可以輕鬆實現,消費者lpush到list中,然後消費者rpop取出任務。

一般來講消費者需要去不斷的輪訓這個佇列,這個有些不完美。如果有新任務加入到任務佇列就通知消費者就好了。其實借助brpop命令可以實現這樣的需求,不過這個是阻塞的,一直到這個佇列中有任務了才會返回。

# brpop queue, timetoutseconds

7,優先順序佇列

brpop命令可以同時接受多個鍵,其完整命令格式為 brpop key1 key2

可同時檢測多個鍵,如果所有鍵都沒有元素則阻塞,如果其中有乙個鍵有元素則會從該鍵中彈出元素。

藉此特性可以實現區分優先順序的任務佇列。

$task = brpop queue:confirm.email queue:notify.email 0

execute($task[1])

這樣只要confirm佇列中有任務,那麼取出來的肯定是confirm任務,否則才會去取notify的任務

8,發布/訂閱模式

# publish channel message

向某個頻道channel發布乙個訊息

# subscribe channel 

# unsubscribe channel

按照規則訂閱:

支援glob風格的萬用字元,shell風格的萬用字元,跟正則式沒有半毛錢關係

# psubscribe channel.?*

9,管道

客戶端和redis使用tcp協議連線。往返時延在數量級上相當於redis處理一條簡單命令。

redis底層通訊協議對管道pipelining提供了支援,但一組命令中每條命令都不依賴於之前命令的執行結果就可以將這組命令一起通過管道發出去。

10,記憶體優化

內部編碼優化

高階開發高階 17 1 擴充套件篇 redis安裝

安裝步驟 安裝gcc yum install gcc 進入到解壓好的redis 5.0.3目錄下,進行編譯與安裝 make 修改配置 daemonize yes 後台啟動 protected mode no 關閉保護模式,開啟的話,只有本機才可以訪問redis 需要注釋掉bind bind 127....

Redis筆記 安裝篇

原碼編譯安裝方式 wget tar xvf redis 5.0.8.tar.gz cd redis 5.0.8 make yum 安裝 yum install redisps 可以指定安裝的版本,安裝非常方便,後面的維護也方便,但是安裝對網路有要求,另外安裝經常找不到指定的版本 對yum伺服器依賴 ...

Java筆記 高階篇(2)

一.file檔案 file類 檔案和目錄路徑名的抽象表象形式 檔案 資料夾 file file parent,string child 根據字串建立乙個file例項 file string parent,string child 通過將給定路勁名字串轉換為抽象路徑名的例項 file string p...