記錄下jedis遇到的兩個坑

2021-09-22 18:05:43 字數 872 閱讀 7367

做的專案為乙個olap平台專案

首先環境中使用的是redis集群,主要作用是用來儲存query的結果,用來遇到相同查詢時使用快取來回答

1、第乙個坑:在刪除時,jedismoveddataexception: moved

掃瞄所有的key時有keys()和scan()兩種方法,由於專案中存進redis的key和value值都是byte,且做過一些變換,所以如果scan()出來使用list 時,會看到keys都是亂碼。在刪除時候使用jedisclustercrc16.getslot()獲取該key所處的slot值,再區分各個slot來分別刪除。但是使用keys獲取的byte和scan獲取的string.getbyte計算得到的slot值不一致,導致在刪除的時候拋了這個異常,在刪除時對應master在管理的所有slot中找不到當前要刪除的slot,解決辦法是使用list來獲取scan的值

2、第二個坑:當某個操作導致read timeout後,導致jedis pool中的沒有可用的jedis物件後,pool.getresource()會被卡死

導致在cache中查詢query結果時卡死,解決方案是使用乙個執行緒來監控query 的時間,如果query超時,則interrupt該執行緒,在自測過程中發現,在卡死過程中並沒有被真正的interrupt,通過debug發現,redis.clients.util.pool#getresource中將所有異常都捕獲了,也就是說我們的interruptedexception被吞掉了,**如下:

public t getresource() catch (nosuchelementexception nse) catch (exception e)

}所以需要在外層單獨捕獲jedisconnectionexception,如果是這個異常需要重置interrupted標誌位

記錄下安裝mysql遇到的坑

參考資料 轉而複製dll檔案到c windows system32目錄下,再次執行 雖然還是錯誤提示,但好歹已經能成功載入了。試了一下mysqld指令也能成功執行。輸入cmd指令啟動服務 參考資料 出錯原因在於安裝的mysql版本為5.7.21。而安裝成參考的文件是5.6的。5.7版本的根目錄下沒有...

redis主從遇到的兩個坑

最近在使用redis主從的時候做了下面兩件事情 1 希望redis主從從操作上分析,所有寫操作都在master上寫,所有讀操作都在從上讀。2 由於redis的從是放在本地的,所以有的key的讀寫操作就直接放在從上操作了。但是出現了下面的幾個問題 重現 主 setex abc 20 test 從 ge...

兩個正則坑

先看第乙個,var re d d var r1 re.test 010 12345 console.log r1 結果控制台給出false。問題在哪?發現把逗號後的空格刪了就好了。習慣性在逗號後敲空格了,尤其是es6對物件進行擴充套件以後,以後不能這樣子了。接下來看個比較難的,零寬正向斷言,不熟悉的...