Redis入門篇(2)- 奇淫技巧

慢查詢

許多的存儲系統都提供了慢查詢的配置,來幫助開發和運維排查線上哪些指令執行的時間耗時過長導致系統響應過慢。同樣的Redis也不遜色,也提供了類似慢查詢指令的配置。
Redis主要提供了兩個配置屬性slowlog-log-slower-thanslowlog-max-len,來配置慢查詢指令的記錄規則。

  • slowlog-log-slower-than

設置指令執行時間的閥值,如果超過該時間將會被記錄下來。單位是微秒(1秒=1000毫秒=1000000微秒)默認值:10000微秒,建議配成10毫秒。

  • slowlog-max-len

記錄最多的慢查詢指令條數。其實Redis對於慢查詢指令並不是記錄在文件當中,而是以列表類型的格式存放與Redis內存中。如果慢查詢的指令數量超出設定值將會以先進先出的方式剔除指令。 我們可以通過命令slowlog get [n] 獲取前 n 條 慢查詢指令。

  • 慢查詢的相關指令
// 1. 獲取前n條慢查詢指令
slowlog get [n]
// 2. 查詢當前慢查詢指令列表的長度
slowlog len
// 3. 重置慢查詢指令列表
slowlog reset

怎麼用

慢查詢的配置有兩種方式

  • 修改redis的配置文件
  • 通過命令行進行修改,如下:
> config set slowlog-log-slower-than
> config set slowlog-max-len

此方式只能臨時生效,如果希望服務重啓後依然生效需要執行config rewrite 將配置持久化到本地文件。

使用Lua解決Redis的事務操作

Redis的PipleLine能夠封裝多個命令一次性傳輸至服務端執行,但這種批量操作並不是原子性操作。原生的批量操作雖然是原子性操作,但是功能的支持有限。Redis可以結合multi、exec、watch 三個指令來實現簡單性的事務,對於指令語法上的錯誤能有效的實現數據回滾,但面對運行時發生的錯誤(如:某集合原先存放的數據類型爲數值型,在添加時加入字符串類型導致報錯),就不能回滾數據。爲了能夠滿足事務的場景,Redis通過與Lua腳本的結合提供了強大的事務支持。(關於Lua腳本的語法大家網上自行查閱,本篇不做講解)

怎麼用

Lua腳本和Redis結合使用有3種方法

  1. eval 腳本內容 key個數 key列表 參數列表
> eval 'return "hello" .. KEY[1] .. ARGV[1]' 1 redis world
  1. redis-cli --eval 腳本文件 key個數 key列表 參數列表
$ redis-cli --eval /home/zmj/test.lua
  1. evalsha SHA值 key個數 key列表 參數列表
> evalsha dsfdsjl343j42lj34l23j4l3 1 redis world

該命令是先將Lua腳本加載至redis內存中會獲得一個SHA1值,然後通過SHA1執行。此方式能夠有效的複用腳本,提高執行效率。關於管理lua腳本的命令如下

// 加載腳本至redis內存中
$ redis-cli script load "$(cat /home/zmj/batch_incr.lua)"
// 是否存在此SHA1的腳本
> script exists 4ff9d1c915292602c
// 清除redis內存中的所有Lua腳本
> script flush

案例

需求:將排名前3的用戶等級都上升一級

  • Lua腳本(batch_incr.lua)
-- 1. 前3名用戶(使用Redis內置的API)
local userList = redis.call("SMEMBERS",KEYS[1]);
local count = 0 ;
-- 2. 遍歷前3名用戶
for index,key in ipairs(userList)
do
-- 3. 增加用戶等級
	redis.call("incr",key);
	count=count+1;
end
return count;
  • 執行腳本
$ redis-cli --eval /home/zmj/batch_incr.lua

書寫技術文章是一個循序漸進的過程,所以我不能保證每句話、每行代碼都是對的,但至少能保證不復制、不粘貼,每篇文章都是自己對技術的認識、細心斟酌總結出來的。喬布斯說:我們在這個星球上的時間都很短,很少有機會去做幾件真正偉大的事情,同時要做得好,我必須要趁我還年輕的時候完成這些事。
其實我想說的是,我是一枚程序員,我只想在有限的時間內儘可能去沉澱我這一生中所能沉澱下來的東西


清山綠水始於塵,博學多識貴於勤。

我有酒,你有故事嗎?

微信公衆號:「Java錦囊」。

歡迎一起談天說地,聊Java。


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