当前位置: 代码网 > it编程>数据库>Redis > 如何使用redis的setnx实现分布式锁

如何使用redis的setnx实现分布式锁

2024年06月17日 Redis 我要评论
redis setnx(setifnot exists) 命令在指定的 key 不存在时,为 key 设置指定的值。语法redis setnx 命令基本语法如下:redis 127.0.0.1:637

redis setnx(set if not exists) 命令在指定的 key 不存在时,为 key 设置指定的值。

语法

redis setnx 命令基本语法如下:

redis 127.0.0.1:6379> setnx key_name value

可用版本

>= 1.0.0

返回值

设置成功,返回 1 。 设置失败,返回 0 。

实例

redis> exists job                # job 不存在
(integer) 0
redis> setnx job "programmer"    # job 设置成功
(integer) 1
redis> setnx job "code-farmer"   # 尝试覆盖 job ,失败
(integer) 0
redis> get job                   # 没有被覆盖
"programmer"

在redis中,setnx 是 “set if not exists”(如果不存在,则设置)的缩写。这是一个原子操作,用于设置一个键的值,前提是这个键不存在。如果键已经存在,.则不会执行任何操作。

封装方法trylock,用于获取分布式锁

/**
     * 尝试获  取一个锁。
     *
     * @param name   锁的名称,通常是一个资源的标识。
     * @param expire 锁的过期时间,单位为毫秒。
     * @return 如果获取锁成功,返回一个唯一的token;如果失败,则返回null。
     */
    public string trylock(string name, long expire) {
        // 为锁名称添加后缀,以避免命名冲突
        name = name + "_lock";
        // 生成一个唯一的token,用于标识持有锁的客户端
        string token = uuid.randomuuid().tostring();
        // 获取redis连接工厂
        redisconnectionfactory factory = stringredistemplate.getconnectionfactory();
        // 获取redis连接
        redisconnection conn = factory.getconnection();
        try {
            // 使用set命令尝试以nx选项(只在键不存在时设置)设置键值对,如果成功,返回true
            // 这里使用了expiration指定键的过期时间,以确保锁在一段时间后自动释放
            // 参考redis命令:set key value [ex seconds] [px milliseconds] [nx|xx]
            boolean result = conn.set(
                    name.getbytes(), //key
                    token.getbytes(), //value
                    expiration.from(expire, timeunit.milliseconds),
                    redisstringcommands.setoption.set_if_absent // nx
            );
            // 如果设置成功,返回生成的token
            if (result != null && result)
                return token;
        } finally {
            // 释放redis连接
            redisconnectionutils.releaseconnection(conn, factory, false);
        }
        // 如果未能成功获取锁,返回null
        return null;
    }

接下来,你可以在需要防止并发执行的方法中使用trylock方法:

public void examplemethod(string taskname) {
		string lockkey = "mylockkey";
        // 尝试获取锁
        string token = trylock(lockkey, 10000); // 锁过期时间为10秒
        if (token != null) {
            try {
                // 获取锁成功,执行业务逻辑
                system.out.println("所获取成功");
                // 模拟任务执行
                // ...
            } finally {
                // 释放锁
                stringredistemplate.delete(lockkey+ "_lock");
            }
        } else {
            // 获取锁失败,处理失败逻辑
            system.out.println("获取锁失败");
        }
    }

到此这篇关于使用redis的setnx实现分布式锁的文章就介绍到这了,更多相关redis setnx分布式锁内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com