借助共享缓存redis实现分布式互斥锁

新开发的系统需要控制每个时刻回收缓存的GC线程有且只有一个在运行,如果有多个线程同时运行,会造成系统崩溃。如果只有一个JVM进程那么很好办,简单的借助synchronized关键字就行了。可是我的系统要部署在多台服务器,每台服务器上部署多个实例上。而synchronized仅仅在单进程里有用。

考虑借助共享数据源redis实现功能。

redis提供一个方法,SETNX key value。将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。设置成功,返回 1 。设置失败,返回 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);// 释放锁}

版权声明:本文为博主原创文章,未经博主允许不得转载。

唯有讲述此间途经的美景,分享没有男主角的相片。

借助共享缓存redis实现分布式互斥锁

相关文章:

你感兴趣的文章:

标签云: