Author:赵志乾
Date:2020-04-04
Declaration:All Right Reserved!!!
实际项目中的接口大致可以分为两大类:查询类与修改类。对于查询类接口而言,其对业务数据是没有影响的(对查询进行统计的功能除外)。针对此类对业务数据无影响的接口,完全可以放开并发控制,以提高接口的响应速度。而对于修改类接口,其操作会影响到业务数据。为避免数据不一致,需要进行并发控制。而并发控制最常用的操作手段就是加锁。
Redis锁
使用redis进行分布式并发控制是一种常用的并发锁方案。使用起来也非常的简单。代码如下:
// Jedis封装加锁和释放锁操作
public boolean getLock(String key,int expireTime){
String key = "my:lock:" + key;
String result = jedis.set(key, String.valueOf(System.currentTimeMillis()), "NX", "EX",expireTime);
return (null != result && "OK".equalsIgnoreCase(result)) ? true : false;
}
public void releaseLock(String key) {
if (StringUtils.isNotBlank(key)) {
String key = "my:lock:" + key;
jedis.del(key);
}
}
// 接口并发控制模板
public Object operate(String userId,Object param){
String lockKey = "operate:"+userId;
boolean lockResult = jedis.getLock(lockKey,10);
if(!lockResult){
// 返回系统繁忙
}
try{
// 业务代码
}
finally{
jedis.releaseLock(lockKey);
}
}
使用上述的并发锁能够满足小并发量的通用场景,而在一些大并发或者特殊业务场景下,该并发锁样板将会失去作用。