码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-07-03 19:16:10      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

    新开发的系统需要控制每个时刻回收缓存的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实现分布式互斥锁

标签:

原文地址:http://blog.csdn.net/bruce128/article/details/46744337

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!