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);
}
} 复制代码