1、概述

分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保证数据的一致性。
解决方案:
在这里插入图片描述
我这里就只介绍Redis的分布式锁的用法。

2、Redis分布式锁

sexnx (SET if Not Exists) 命令在指定的 key 不存在时,为 key 设置指定的值。
在这里插入图片描述
这种加锁的思路是,如果 key 不存在则为 key 设置 value,如果 key 已存在则 SETNX 命令不做任何操作。

  • 客户端A请求服务器设置key的值,如果设置成功就表示加锁成功
  • 客户端B也去请求服务器设置key的值,如果返回失败,那么就代表加锁失败
  • 客户端A执行代码完成,删除锁
  • 客户端B在等待一段时间后再去请求设置key的值,设置成功
  • 客户端B执行代码完成,删除锁

代码实现:

// name:key的名称,不同业务用不同的key;
// expire :过期时间,避免出现死锁
// 返回TRUE,则是获取锁成功;FALSE,则是获取失败
public Boolean tryLock(String name, long expire) {
    name = name + "_lock";
    String value = UUID.randomUUID().toString(); // 随机生成一个UUID作为value
    RedisConnectionFactory factory = stringRedisTemplate.getConnectionFactory();
    RedisConnection conn = factory.getConnection();
    try {
        //参考redis命令:
        //set key value [EX seconds] [PX milliseconds] [NX|XX]
        Boolean result = conn.set(
                name.getBytes(),
                value.getBytes(),
                Expiration.from(expire, TimeUnit.MILLISECONDS),
                RedisStringCommands.SetOption.SET_IF_ABSENT);
        if (result != null && result)
            return true;
    } finally {
        RedisConnectionUtils.releaseConnection(conn, factory,false);
    }
    return false;
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐