redisson 鎖幫助類:java
/** * @ClassName: RedisLockUtil * @author DHing * */
@Component
public class RedisLockUtil {
@Resource
public Redisson redisson;
public void setRedisson(Redisson locker) {
redisson = locker;
}
/** * 加鎖 * @param lockKey * @return */
public RLock lock(String lockKey) {
RLock lock = redisson.getLock(lockKey);
lock.lock();
return lock;
}
/** * 釋放鎖 * @param lockKey */
public void unlock(String lockKey) {
RLock lock = redisson.getLock(lockKey);
lock.unlock();
}
/** * 釋放鎖 * @param lock */
public static void unlock(RLock lock) {
lock.unlock();
}
/** * 帶超時的鎖 * @param lockKey * @param timeout 超時時間 單位:秒 */
public RLock lock(String lockKey, int timeout) {
RLock lock = redisson.getLock(lockKey);
lock.lock(timeout, TimeUnit.SECONDS);
return lock;
}
/** * 帶超時的鎖 * @param lockKey * @param unit 時間單位 * @param timeout 超時時間 */
public RLock lock(String lockKey, TimeUnit unit ,int timeout) {
RLock lock = redisson.getLock(lockKey);
lock.lock(timeout, unit);
return lock;
}
/** * 嘗試獲取鎖 * @param lockKey * @param waitTime 最多等待時間 * @param leaseTime 上鎖後自動釋放鎖時間 * @return */
public boolean tryLock(String lockKey, int waitTime, int leaseTime) {
RLock lock = redisson.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, TimeUnit.SECONDS);
} catch (InterruptedException e) {
return false;
}
}
/** * 嘗試獲取鎖 * @param lockKey * @param unit 時間單位 * @param waitTime 最多等待時間 * @param leaseTime 上鎖後自動釋放鎖時間 * @return */
public boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime) {
RLock lock = redisson.getLock(lockKey);
try {
return lock.tryLock(waitTime, leaseTime, unit);
} catch (InterruptedException e) {
return false;
}
}
}複製代碼
LockService:redis
@Service
public class LockService {
@Resource
public Redisson redisson;
public void lockSyncWithTime(Object key,LockCallBack cb,long waitTime, long leaseTime, TimeUnit unit, long lockTime) throws Exception{
RLock lock = redisson.getLock(String.valueOf(key)+"_lock");
lock.expire(lockTime, unit);
Future<Boolean> future = lock.tryLockAsync(waitTime, leaseTime, unit);
if (future.get()) {
try{
cb.onComplete();
}catch(Exception e){
throw e;
}
}
}
public void lockSyncNoTime(Object key,LockCallBack cb,long waitTime, long leaseTime, TimeUnit unit) throws Exception{
RLock lock = redisson.getLock(String.valueOf(key)+"_lock");
Future<Boolean> future = lock.tryLockAsync(waitTime, leaseTime, unit);
if (future.get()) {
try{
cb.onComplete();
}catch(Exception e){
throw e;
}finally{
lock.unlock();
}
}
}
}複製代碼
備註: 選用Redisson 而不使用Jedis,Redisson的原生寫的很好並且社區一直活躍,jedis好久都已經沒有開源貢獻了。spa
而且Redisson的隊列很靈活,直接上代碼:code
@Service
public class RedisService {
@Resource
public Redisson redisson;
private RMap<Object,Map<Object,Object>> taskReportMap;
private RMap<Object,Map<Object,Object>> taskResourceMap;
private RQueue<Long> pkQueue;
@PostConstruct
public void init() {
taskReportMap=redisson.getMap(ConstrantsProperties.TASKREPORTQUEUE);
taskResourceMap= redisson.getMap(ConstrantsProperties.TASKRESOURCEQUEUE);
pkQueue=redisson.getQueue(ConstrantsProperties.PKGENERATERQUEUE);
}
public RQueue<Long> getPkQueue(){
return pkQueue;
}
public Long pollPk(){
return pkQueue.poll();
}
public RMap<Object,Map<Object,Object>> getTaskReportMap(){
return taskReportMap;
}
public RMap<Object,Map<Object,Object>> getTaskResourceMap(){
return taskResourceMap;
}
public Map<Object, Object> putTaskResourcetMap(Object key,Map m){
Map<Object, Object> put = taskResourceMap.put(key, m);
return put;
}
public RLock getLock(String key){
return redisson.getLock(key+"_lock");
}
public RBucket<String> getValueByKey(String key){
return redisson.getBucket(key);
}
public Map<Object,Object> getMapValueByKey(String key){
return redisson.getMapCache(key);
}
} 複製代碼