并发加redis锁

Redis锁


private void redisLock(){
		//使用redis加锁
        // 尝试获取锁
        String lockKey = "ziDongPeiHuo_lock_keHu-wuLiaoIds";
        // 锁对应的值,业务数据,无需理会
        Map<String, List<String>> clientMap = new HashMap<>();
        List<String> wuLiaoIds = faHuoHuoWuList.stream().map(FaHuoHuoWuMingXi::getWuLiaoId).collect(Collectors.toList());
        clientMap.put(faHuoDan.getWeiTuoKeHu(), wuLiaoIds);
        Semaphore semaphore = new Semaphore(20);//限流
        long start = System.currentTimeMillis();
        boolean acquiredLock = false;
        try {
        //该函数是Java中Semaphore类的一个方法,用于获取一个许可(permission)。如果当前许可可用,则该方法立即返回,否则线程将被阻塞,直到获取到许可为止。Semaphore通常用于限制同时访问某个资源的线程数量,从而实现并发控制。通过调用acquire()方法,线程可以获取一个许可,当线程执行完需要释放资源时,可以通过调用release()方法释放许可
            semaphore.acquire();
            acquiredLock = true;
            //在Redis中尝试设置一个键值对,只有在该键不存在时才设置成功。函数使用了RedisTemplate操作Redis,并通过opsForValue()方法获取操作值的接口。setIfAbsent()方法尝试设置键lockKey的值为clientMap,如果设置成功,则返回true;如果设置失败(即该键已存在),则返回false。在设置时,设置了键的过期时间为10秒(Duration.ofSeconds(10))。整个操作会在设置成功之前一直循环尝试。
            while (!redisTemplate.opsForValue().setIfAbsent(lockKey, clientMap, Duration.ofSeconds(10))) {
                //获取锁失败,循环等待,超过5秒就超时
                if (System.currentTimeMillis() - start >= 5000) {
                    System.err.println("***");
                    System.err.println(System.currentTimeMillis() - start);
                    throw new JobException("等待超时,请重新请求");
                }
                Thread.sleep(100); // 等待一段时间,降低CPU使用率
            }
            // 执行并发方法
            this.bingFaFangFa();
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt(); // 保持中断状态
            throw e;
        } finally {
        //释放许可
            semaphore.release();
            // 释放锁
            if (acquiredLock) {
                releaseLock(lockKey, clientMap);
            }
        }
	}
private void releaseLock(String lockKey, Map<String, List<String>> clientMap) {
            Map<String, List<String>> currentClientMap = (Map<String, List<String>>) redisTemplate.opsForValue().get(lockKey);
            if (currentClientMap != null && currentClientMap.equals(clientMap)) {
                redisTemplate.delete(lockKey);
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值