redis(六)-事務與驅逐策略

參考資料:
redis 4.x cookbook 中文版;
redis官方文檔
注: 本文redis的版本爲: 5.0.3

redis學習路徑

  • key-過期:

expire key seconds
設置某個key過期時間;如果seconds爲負數,將執行刪除;
未設置過期時間,將永不過期;
針對key的set,del,getset操作將會覆蓋過期時間;
針對key的lpush,lpop等操作,不會涉及到過期時間的改變;

  • key-驅逐策略:

當有寫數據的請求到達redis主服務器時,如果redis主服務器中的內存已達到配置的maxMemory
將會按照配置好的驅逐策略,清除key;
大體分爲以下幾種:
LRU(最近最少使用);
LFU(最少使用);每個key都存儲一個使用頻率,根據此值做驅逐,頻率值會衰減,後面會說;
Random(隨機刪除),ttl(過期時間剩餘最短)
Volatile-lru->針對具有到期設置的key,進行LRU模式淘汰;
allkey-lru->針對所有key,使用LRU模式淘汰;
Volatile-LFU->在設置了過期的key中使用LFU模式淘汰;
allkey-lFU->在所有key中進行LFU模式淘汰;
Volatile-Random->從設置了過期的key中隨機淘汰;
allkey-Random->隨機淘汰任意key;
volatile-ttl->淘汰過期時間最近的key(Minor TTL);
noeviction->不淘汰任何內容,在寫入操作中返回錯誤;

配置LFU的頻率計數器相關:
訪問次數達到多少次才啓動頻率計數器,值爲0-255,越高,越難達到;
數值越低對於低訪問量的應用來說更好;
lfu-log-factor 10
lfu的頻率計數器衰減間隔(單位是分鐘);如果設置爲0,每次掃描數據庫時都將衰減;
lfu-decay-time 1

配置清除過期key的頻率;
清除過期key/超時客戶端連接 的頻率,應當是1-500,通常不建議大於100;(設置爲10,意味着每秒10次)
hz 10
允許自適應頻率,即,當訪問量過大或者客戶端過多時,允許redis自行提高頻率倍數;
dynamic-hz yes

  • 事務

相關命令:
DISCARD 丟棄正在追加的事務命令列表;
EXEC 執行命令列表
MULTI 開啓命令列表
UNWATCH 刷新所有監視(放棄所有正在進行的監視),已經開始的事務中執行對某個被監視的key的修改命令,那麼雖然監視被放棄了,但是事務還是會執行失敗;
WATCH 監視一組/一個key;
這些命令是redis事務的基礎;
在redis的事務中:
使用exec命令將觸發事務中所有命令的執行;
所有命令都會被執行,但是當其中某一個命令錯誤,其他命令會被執行,不會被回滾;

當服務器進程被殺死或者崩潰時:
執行exec之前,將不執行任何操作;
執行exec之後(會將事務信息寫到redis服務器的磁盤上[AOF文件中]),在事務中命令全部完成之前,那麼當redis重啓通過aof文件恢復數據時,將會刪除掉對應的事務信息,以恢復到事務之前的狀態;
綜上所述,redis中的事務,如果以關係型數據庫的事務標準(ACID)來看;
redis事務中的原子性認爲,只要你的命令被redis服務器接收,即認爲成功;(返回錯誤結果不代表執行命令失敗,只有當redis服務器崩潰時纔會被認爲是執行失敗);
redis中不滿足隔離性,因爲你第一個命令執行後,第二個命令get,將獲得第一個命令執行成功後的結果
它滿足一致性,執行前後數據庫內的數據始終保持一致
它滿足持久性,也即是,只要執行成功後,這些數據都將被記錄在內存中,然後被RDB+AOF持久化到硬盤上(如果開啓了RDB與AOF)

#事務的基本模板:
#可以在同一個事務中對同一個key進行設置;後操作會覆蓋前操作;
127.0.0.1:6379> get a
"xxd"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set a 444
QUEUED
127.0.0.1:6379> get a
QUEUED
127.0.0.1:6379> set a 332
QUEUED
127.0.0.1:6379> hset a 1 2
QUEUED
127.0.0.1:6379> exec
1) OK
2) "444"
3) OK
4) (error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> get a
"332"

#A客戶端監視某個key;
127.0.0.1:6379> watch a
OK
#B客戶端在A客戶端監視後就修改key
127.0.0.1:6379> set a 880
OK
#A客戶端在監視後開啓事務並執行,將會返回nil;宣告修改失敗;
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a 999
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>

redis中的腳本也是事務性的,其實他倆是重複功能;但是事務是先出現的,腳本後出現,所以並不能單純的取消某一個;官方更建議使用腳本;因爲它更快些;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章