Redis為單進程單線程模式,采用隊列模式將並發訪問變為串行訪問。Redis本身沒有鎖的概念,Redis對於多個客戶端連接並不存在競爭,但是在Jedis客戶端對Redis進行並發訪問時會發生連接超時、數據轉換錯誤、阻塞、客戶端關閉連接等問題,這些問題均是由於客戶端連接混亂造成。對此有2種解決方法:
1.客戶端角度,為保證每個客戶端間正常有序與Redis進行通信,對連接進行池化,同時對客戶端讀寫Redis操作采用內部鎖synchronized。比如java中的jedisPool。
Jedis是一個Java語言的Redis客戶端,它為Java語言連接與操作Redis提供了簡單易用的接口。
Jedis不是線程安全的,故不應該在多線程環境中共用一個Jedis實例。但是,也應該避免直接創建多個Jedis實例,因為這種做法會導致創建過多的socket連接,性能不高。
要保證線程安全且獲得較好的性能,可以使用JedisPool。JedisPool是一個連接池,既可以保證線程安全,又可以保證了較高的效率。
2.服務器角度,利用setnx實現鎖。
語法:
SETNX key value