如何在scala中使用复述,实现分布式锁

  介绍

本篇文章为大家展示了如何在scala中使用复述,实现分布式锁,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

首先实现工具类

package 跑龙套   ,   import 缓存管理器   ,/* *   ,*复述分布式锁   ,*/object  RedisTool  {   ,   ,//加锁是否成功标志   ,val  LOCK_SUCCESS: String =,“OK"   ,   ,//即当关键不存在时,我们进行设置操作,若钥匙已经存在,则不做任何操作;   ,val  SET_IF_NOT_EXIST: String =,“NX"   ,   ,//意思是我们要给这个键加一个过期的设置,具体时间由第五个参数决定。   ,val  SET_WITH_EXPIRE_TIME: String =,“PX"   ,   ,val  RELEASE_SUCCESS: String =,“1”;   ,/* *   ,*   *,才能@param  lockKey ,锁   *,才能@param  requestId ,请求标识   *,才能@param  expireTime ,超期时间   *,才能@param  isPersist ,临时缓存或者永久缓存   ,*/,def  tryGetDistributedLock (lockKey:字符串,requestId:字符串,expireTime: Int, isPersist:布尔=false) {   CacheManager.redisClientPool.withClient才能(   ,,client =祝辞,{   ,,,//val  redisKeyPrefix =, CacheManager.getRedisKeyPrefix (isPersist)   ,,,client.select (CacheManager.redisDBNum)   ,,,val  result =, client.set (requestId, lockKey,还以为,SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME,, expireTime)   ,,,var  flag =false   ,,,如果(==LOCK_SUCCESS 结果){   ,,,,flag =,真的   ,,,}   ,,,国旗   ,,}   ,,)   ,}   ,   ,/* *   *才能释放分布式锁   *,才能@param  lockKey ,锁   *,才能@param  requestId ,请求标识   *,才能@param  expireTime ,超期时间   *,才能@param  isPersist ,临时缓存或者永久缓存   *才能@return   ,*/,def  releaseDistributedLock (lockKey:字符串,requestId:字符串,expireTime:, Int =, 10日isPersist:布尔=false),={   CacheManager.redisClientPool.withClient才能(   ,,client =祝辞,{   ,,,val  redisKeyPrefix =, CacheManager.getRedisKeyPrefix (isPersist)   ,,,client.select (CacheManager.redisDBNum)   ,,,//lua脚本也是单例模式,同样也可以保证同一时刻只有一个线程执行脚本   ,,val  lua =,,,,s"““   ,,,,,,| local  current =, redis.call (& # 39; incrBy& # 39;键[1],ARGV [1]);   ,,,,,,| if  current ==,当时(ARGV[1]),然后   ,,,,,,|,,local  t =, redis.call (& # 39; ttl # 39;键[1]);   ,,,,,,|,,if  t ==1,然后   ,,,,,,|,,,,redis.call(& # 39;到期# 39;键[1],ARGV [2])   ,,,,,,|,,结束;   ,,,,,,|结束;   ,,,,,,| return 电流;   ,,,,“““.stripMargin   ,,,val  code =, client.scriptLoad (lua) . get   ,,,val  ret =, client.evalSHA(代码,,(时间+ redisKeyPrefix ; lockKey)列表,列表(requestId expireTime))   ,,,val  result =, ret.get.asInstanceOf .toString(对象)   ,,,var  flag =false   ,,,如果(result ==, RELEASE_SUCCESS) {   ,,,,flag =,真的   ,,,}   ,,,国旗   ,,}   ,,)   ,}   ,   }

2,实现CacheManager类

package 跑龙套   ,   import  com.redis.RedisClientPool/* *   *大敌;   ,*/object  CacheManager  {   ,   ,val  redisClientPool =,“dev" .equalsIgnoreCase (System.getenv (“SCALA_ENV")), match  {//开才能发环境   case 才能;true =祝辞,new  RedisClientPool (“127.0.0.1",, 6379)//其才能他环境   case 才能;false =祝辞,new  RedisClientPool (“10.180.x.y",, 6379,,,, 0,,一些(“root"))   ,}   ,   ,val  redisDBNum =10   ,   ,def  getRedisKeyPrefix (isPersist:布尔),={   如果才能(isPersist) {   ,,//永久缓存前缀   ,才能“persist_"   }{其他才能   ,,//临时缓存前缀   ,才能“tmp_"   ,,}   ,}   ,   }

3,调用锁操作

def  updateTableInfo(参数:字符串),=,{   var 才能;resMap =, Map [String,任何]()   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

如何在scala中使用复述,实现分布式锁