看到很多人使用redis做分布式锁,公司中有简单的使用redis做分布式锁,
我们需要怎样的分布式锁

  • 可以保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器-上的一个线程执行。
  • 这把锁要是一把可重入锁(避免死锁)
  • 这把锁最好是一把阻塞锁(根据业务需求考虑要不要这条)
  • 这把锁最好是一把公平锁(根据业务需求考虑要不要这条)
  • 有高可用的获取锁和释放锁功能
  • 获取锁和释放锁的性能要好
    举个简单的栗子,发送验证码,防止用户重复点击,说简单也就是表单的重复提交:
    我使用的是setIfAbsent方法:这个方法就是先判断对应的key有没有,如果没有就加进去,2.1版本之后可以指定过期时间,添加成功返回true

    失败返回false

    通过这个方法我们就可以实现一个简单的锁了:

    测试方法:
@GetMapping("/testLock/{userId}")
    public String testLock(@PathVariable("userId") Integer userId) {
        //每个用户 每五秒请求一次
        Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent(userId+"", "das",3L, TimeUnit.SECONDS);
        if (!aBoolean) {
            return "请求速度太快了...";
        }
        return "欢迎光临";
    }