redis实现分布式锁跟限流

 @Test
    public void testRedisLock(){
	    String uuid = UUID.randomUUID().toString();
	    //  分布式锁使用uuid
        String value = uuid;
        // 自增限流用  字符串1
        value = "1";
        //  加锁要设置过期时间,避免宕机造成死锁

        Boolean lock = stringRedisTemplate.opsForValue().setIfAbsent("lock", value, 300, TimeUnit.SECONDS);
        System.out.println(lock);
        if (lock){
            // 相当与占用到锁了   实现了分布式锁的基础
            //  执行业务逻辑
            // 删除锁要原子操作,避免删除别人的锁,但是我觉得没释放锁  其他也不会进去,
            // 只要设置锁的过期时间大于业务执行时间即可,不过删除锁还是要原子性操作比较安全一点
            // 删除锁  原子删除锁  比较 key value
            // 或者执行这段  直接删除
//                String script =
//                        "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
//                DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>(script, Long.class);
//                Long execute =
//                        redisTemplate.execute(redisScript, Arrays.asList(split[0]), treadCode);
        }else {
            //  分布式锁  可以递归自旋,调用本方法  或者直接占锁失败
            // 限流在这里操作大于指定值返回false
            Long increment = stringRedisTemplate.opsForValue().increment("lock",1);
            if (increment > 2){
                System.out.println("够了");
            }

        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值