一、redis事務
事務命令
multi 開啓事務,將接下來的命令存在一個列表裏
exec 執行事務,將存在列表裏的依次執行。
注意:命令書寫格式有誤 錯誤將取消這次事務執行;命令格式正確,但是無法正確的執行。例如對list進行incr操作 ,能夠正常執行事務,只是對錯誤的不執行而已。
discard 取消事務 將列表銷燬
二、redis鎖
鎖命令
watch key [key1] 添加監視鎖
unwatch 取消所有key的監視鎖
setnx lock-key value 設置公共鎖
對於返回設置成功的,擁有控制權,進行下一步的具體業務操作
對於返回設置失敗的,不具有控制權,排隊或等待 操作完畢通過del操作釋放鎖
爲了避免一個公共鎖忘記釋放而一直佔有的情況,可以將鎖設置一個時間限定。
expire lock-key second 使用 expire 爲鎖key添加時間限定,到時不釋放,放棄鎖
pexpire lock-key milliseconds 使用 pexpire 爲鎖key添加時間限定,到時不釋放,放棄鎖
三、redis刪除策略
Redis是一種內存級數據庫,所有數據均存放在內存中,內存中的數據可以通過TTL指令獲取其狀態
XX :具有時效性的數據
-1 :永久有效的數據
-2 :已經過期的數據 或 被刪除的數據 或 未定義的數據
數據刪除策略
1. 定時刪除
創建一個定時器,當key設置有過期時間,且過期時間到達時,由定時器任務立即執行對鍵的刪除操作
優點:節約內存,到時就刪除,快速釋放掉不必要的內存佔用
缺點:CPU壓力很大,無論CPU此時負載量多高,均佔用CPU,會影響redis服務器響應時間和指令吞吐量
2. 惰性刪除
數據到達過期時間,不做處理。等下次訪問該數據時, 如果未過期,返回數據 ; 發現已過期,刪除,返回不存在
優點:節約CPU性能,發現必須刪除的時候才刪除
缺點:內存壓力很大,出現長期佔用內存的數據
3. 定期刪除
週期性輪詢redis庫中的時效性數據,採用隨機抽取的策略,利用過期數據佔比的方式控制刪除頻度
特點1:CPU性能佔用設置有峯值,檢測頻度可自定義設置
特點2:內存壓力不是很大,長期佔用內存的冷數據會被持續清理
總結:是之前兩種的折中方案,週期性抽查存儲空間 (隨機抽查,重點抽查)
逐出算法
Redis使用內存存儲數據,在執行每一個命令前,會調用freeMemoryIfNeeded()檢測內存是否充足。如果內存不滿足新加入數據的最低存儲要求,redis要臨時刪除一些數據爲當前指令清理存儲空間。清理數據的策略稱爲逐出算法。
相關配置
最大可使用內存 maxmemory
佔用物理內存的比例,默認值爲0,表示不限制。生產環境中根據需求設定,通常設置在50%以上。
每次選取待刪除數據的個數 maxmemory-samples
選取數據時並不會全庫掃描,導致嚴重的性能消耗,降低讀寫性能。因此採用隨機獲取數據的方式作爲待檢測刪除數據
刪除策略 maxmemory-policy
達到最大內存後的,對被挑選出來的數據進行刪除的策略
數據刪除策略
檢測易失數據(可能會過期的數據集server.db[i].expires )
① volatile-lru:挑選最近最少使用的數據淘汰
② volatile-lfu:挑選最近使用次數最少的數據淘汰
③ volatile-ttl:挑選將要過期的數據淘汰
④ volatile-random:任意選擇數據淘汰
檢測全庫數據(所有數據集server.db[i].dict )
⑤ allkeys-lru:挑選最近最少使用的數據淘汰
⑥ allkeys-lfu:挑選最近使用次數最少的數據淘汰
⑦ allkeys-random:任意選擇數據淘汰
放棄數據驅逐
⑧ no-enviction(驅逐):禁止驅逐數據(redis4.0中默認策略),會引發錯誤OOM(Out Of Memory)