共有キャッシュredisによる分散ロック

867 ワード

新たに開発されたシステムは、キャッシュをいつでも回収するGCスレッドが1つしか稼働していないことを制御する必要があり、複数のスレッドが同時に稼働しているとシステムがクラッシュする.JVMプロセスが1つしかない場合は、synchronizedキーワードを簡単に使えばいいです.しかし、私のシステムは複数のサーバに配備され、各サーバに複数のインスタンスが配備されます.synchronizedは単一プロセスでしか役に立たない.
共有データソースredisによる機能の実装を検討する.
redisは、SETNX key valueを提供する方法を提供する.キーの値をvalueに設定し、キーが存在しない場合にのみ使用します.与えられたkeyが既に存在する場合、SETNXは何もしない.設定に成功し、1を返します.設定に失敗し、0を返します.すなわち,このkeyが存在すると0に戻り,他の人はロックを手に入れて臨界領域に入った.
では、このkeyはロックであり、1を返すと、反発ロックの取得に成功し、臨界領域に入ることができることを示します.0を返します.取得に失敗し、臨界領域に入ることができません.
サンプルコード:
		try {
			mutex = KeyHelper.Data.Risk.getGcThreadMutexKey();
			if (dataCommonCacheService.setnx(mutex, "ok") == 1L) { //     
				garbageCollector.garbageRecycle(); //    
			}
		} catch (Exception e) {
			LOG.error(e.getMessage(), e);
		} finally {
			dataCommonCacheService.del(mutex);	//    
		}