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

               

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

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

    redis提供一个方法,SETNX key value。将 key 的值设为 value ,当且仅当 key 不存在。若给定的 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); // 释放锁}




            
 

猜你喜欢

转载自blog.csdn.net/qq_44925357/article/details/89448148