借助共享缓存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(); // 临界区
        dataCommonCacheService.del(mutex);	// 释放锁
    }
} catch (Exception e) {
    LOG.error(e.getMessage(), e);
    dataCommonCacheService.del(mutex);	// 释放锁
} 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值