篩選 Redis Key 的正確姿勢
· 預估閱讀時間: 3 分鐘
前言
還記得很久很久之前,曾經有一個同事來問我:為什麼我只是一句去查 Redis Key 的語法,程式都沒改過,但是卻越跑越慢?
一看他的程式碼,發現原來他用 LINQ 來過濾 Redis 的 Key...
有經驗的朋友應該看到這邊就知道發生了什麼事。
需求
當初只是很單純的要實作一個透過 Redis 中的 Key 來判斷資料是否存在的簡單功能。
如果使用 Redis 存放 Session Key 的話應該也會使用到類似的功能。
有問題的程式碼
程式碼很簡單,就只有短短幾行:
MainWindow.xaml.cs
var keys = _server.Keys()
.Where(x => Regex.IsMatch(x, "Test_By_Ouch_*"))
.ToList();
我們可以先來看看原本的寫法和修改過後寫法的效能比較:

讀取接近十二萬筆的 Key 時,使用原來的程式碼大約會花上 0.52 秒的時間。
但是如果改用 Filter 的作法,則可以縮短到 0.15 秒以內完成,效能差到三倍以上
我之前測出來的結果,還曾經差到十五倍以上。
問題在哪兒?
簡單的說,原本的寫法會把所有的 Key 一次撈回本機,再透過 LINQ 進行過濾。
當資料量變大,變慢的情況就會越明顯。