天天看點

單例模式在生産環境jedis叢集中的應用

背景:不久前機關上線一款應用,上了生産環境之後,沒過多久,便吃掉了伺服器所有的記憶體,最後導緻網站服務挂了。

在解決了這一問題之後,我發現這其實是典型的一單例模式,現分享一下。

之前存在問題的老代碼如下:

這是導緻問題所在的那個關鍵方法

以上這段代碼是有問題的,大家看出來了嗎?

問題在于,雖然方法聲明為synchronized static,但是在并發多線程的情況下,并不能保證每個使用者線程隻生成一個JedisCluster的執行個體。

這樣就會導緻每個線程都會建立jedisCluster的執行個體,就會消耗記憶體,而且這塊記憶體又沒有被及時地釋放掉,導緻多使用者并發以後,快速吃光了伺服器的記憶體。

解決方法就是使用單例模式,把JedisCluster作為static的類成員,且使用懶漢單例模式,代碼如下:

這樣就會保證即使在高并發的環境下,所有使用者線程還是隻會擁有一個JedisCluster的執行個體。