@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("够了");
}
}
}
redis实现分布式锁跟限流
最新推荐文章于 2024-03-02 18:47:33 发布