zoukankan      html  css  js  c++  java
  • 借助共享缓存redis实现分布式锁

        新开发的系统须要控制每一个时刻回收缓存的GC线程有且仅仅有一个在执行,假设有多个线程同一时候执行,会造成系统崩溃。假设仅仅有一个JVM进程那么非常好办。简单的借助synchronizedkeyword即可了。

    但是我的系统要部署在多台server,每台server上部署多个实例上。而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);	// 释放锁
    		}
    



    
       
    
  • 相关阅读:
    Java基础知识(一)环境变量的设置、变量与常量、自动类型转换、自增长、赋值运算符
    ModelState
    DOM
    正则表达式常见形式
    通过JS设置一个元素的文本
    JS(三) 原型对象与原型链
    JS(二)call方法和apply方法
    第四周学习进度表
    敏捷开发方法综述
    数组02
  • 原文地址:https://www.cnblogs.com/blfshiye/p/5194862.html
Copyright © 2011-2022 走看看