介绍
本篇文章为大家展示了如何在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中使用复述,实现分布式锁