Redis(67)Redis的SETNX命令是如何工作的?

作者:Victor356日期:2025/10/17

SETNX 是 Redis 提供的一个原子性命令,用于在键不存在时设置键值对。SETNX 是 "SET if Not eXists" 的缩写,主要应用于实现分布式锁等场景。下面是详细的工作原理以及如何在 Java 中使用 SETNX 命令的示例。

SETNX 命令的工作原理

  1. 检查键是否存在:Redis 首先检查给定的键是否存在。
  2. 设置键值对:如果键不存在,Redis 将设置键值对,并返回 1
  3. 不做任何操作:如果键已经存在,Redis 不会设置新的值,并返回 0

Java 使用 SETNX 示例

环境准备

  1. 需要 Redis 服务运行中。
  2. 需要引入 Jedis 库,这是一个 Redis 的 Java 客户端。

Maven 依赖

1<dependency>
2    <groupId>redis.clients</groupId>
3    <artifactId>jedis</artifactId>
4    <version>4.0.1</version>
5</dependency>
6

基本使用示例

1import redis.clients.jedis.Jedis;
2
3public class RedisSetNXExample {
4    public static void main(String[] args) {
5        // 连接到 Redis 服务器
6        Jedis jedis = new Jedis("localhost", 6379);
7
8        // 键和值
9        String key = "mykey";
10        String value = "Hello";
11
12        // 使用 SETNX 命令
13        Long result = jedis.setnx(key, value);
14
15        if (result == 1) {
16            System.out.println("Key was set successfully.");
17        } else {
18            System.out.println("Key already exists.");
19        }
20
21        // 再次尝试设置相同的键
22        String newValue = "World";
23        result = jedis.setnx(key, newValue);
24
25        if (result == 1) {
26            System.out.println("Key was set successfully with new value.");
27        } else {
28            System.out.println("Key already exists, new value was not set.");
29        }
30
31        // 关闭连接
32        jedis.close();
33    }
34}
35

使用 SETNX 实现分布式锁

分布式锁是 SETNX 的一个典型应用场景。下面是一个使用 SETNX 实现分布式锁的示例:

获取锁

1import redis.clients.jedis.Jedis;
2
3public class RedisDistributedLock {
4    private Jedis jedis;
5    private String lockKey;
6    private String lockValue;
7    private int lockExpireTime;
8
9    public RedisDistributedLock(Jedis jedis, String lockKey, int lockExpireTime) {
10        this.jedis = jedis;
11        this.lockKey = lockKey;
12        this.lockExpireTime = lockExpireTime;
13        this.lockValue = String.valueOf(Thread.currentThread().getId());
14    }
15
16    public boolean acquireLock() {
17        Long result = jedis.setnx(lockKey, lockValue);
18
19        if (result == 1) {
20            // 设置过期时间,防止死锁
21            jedis.expire(lockKey, lockExpireTime);
22            return true;
23        }
24
25        return false;
26    }
27
28    public boolean releaseLock() {
29        // 使用 Lua 脚本确保原子性
30        String luaScript = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
31                           "return redis.call('del', KEYS[1]) " +
32                           "else return 0 end";
33
34        Object result = jedis.eval(luaScript, 1, lockKey, lockValue);
35        return result.equals(1L);
36    }
37}
38

使用示例

1public class TestDistributedLock {
2    public static void main(String[] args) {
3        Jedis jedis = new Jedis("localhost", 6379);
4        String lockKey = "distributed_lock";
5        RedisDistributedLock lock = new RedisDistributedLock(jedis, lockKey, 10);
6
7        if (lock.acquireLock()) {
8            try {
9                System.out.println("Lock acquired, performing critical operations.");
10                // 执行需要同步的操作
11            } finally {
12                lock.releaseLock();
13                System.out.println("Lock released.");
14            }
15        } else {
16            System.out.println("Failed to acquire lock.");
17        }
18
19        jedis.close();
20    }
21}
22

总结

通过上述代码示例,我们详细介绍了 SETNX 命令的工作原理,并展示了如何在 Java 中使用 SETNX 命令以及使用 SETNX 实现分布式锁的方式。这样可以确保在分布式环境中多个进程或线程能够协调地访问共享资源。


Redis(67)Redis的SETNX命令是如何工作的?》 是转载文章,点击查看原文


相关推荐


什么是断言?
你的人类朋友2025/10/15

前言 你好啊,我是你的人类朋友! 今天主要介绍断言(Assertion)相关的知识。 先定个小目标:看完你将可以用自己的语言向别人解释:啥是断言? 正文 一、初印象 断言(Assertion)在信息安全领域中,是一种用于证明身份的数字凭证。 简单来说,断言是一个【包含身份声明信息的安全令牌】,用于向服务端证明客户端的合法身份。 它通常包含三要素: 身份标识(如:AppId) 验证凭证(如:加密的 Secret) 完整性证明(如:数字签名) 二、工作流程 断言的工作过程可以分为四个核心步骤:


Kotlin互斥锁(Mutex):协程的线程安全守护神
稀有猿诉2025/10/14

本文译自「Kotlin Mutex: Thread-Safe Concurrency for Coroutines」,原文链接carrion.dev/en/posts/ko…,由Ignacio Carrión发布于2025年10月3日。 使用 Kotlin 协程构建并发应用程序时,保护共享的可变状态至关重要。虽然传统的 Java 同步工具(例如 synchronized 块和 ReentrantLock)可以正常工作,但它们会阻塞线程,并且与协程的挂起模型不兼容。因此,引入 Mutex——一


Coze源码分析-资源库-编辑数据库-前端源码-核心逻辑与接口
lypzcgf2025/10/13

编辑数据库逻辑 1. 表单验证系统 文件位置:frontend/packages/data/memory/database-v2-base/src/components/base-info-modal/index.tsx 编辑数据库表单的验证规则: // 数据库名称验证规则 const nameValidationRules = [ { required: true, whitespace: true, message: I18n.t('database_name_c


C++ 中 rfind 方法详解
oioihoii2025/10/11

rfind 是 C++ 字符串类 std::string 和 std::wstring 的成员函数,用于从字符串的末尾向前搜索指定的子字符串或字符。 函数原型 // 搜索整个字符串 size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; size_type rfind(const CharT* s, size_type pos = npos) const; size_type rfind(Cha


HTML 元素帮助手册
hubenchang05152025/10/9

#HTML 元素帮助手册 转载自 MDN #主根元素 元素描述<html>表示一个 HTML 文档的根(顶级元素),所以它也被称为根元素。所有其它元素必须是此元素的后代。 #文档元数据 元素描述<base>指定用于一个文档中包含的所有相对 URL 的根 URL。一份中只能有一个该元素。<head>包含文档相关的配置信息(元数据),包括文档的标题、脚本和样式表等。<link>指定当前文档与外部资源的关系。该元素最常用于链接 CSS,此外也可以被用来创建站点图标(比如“favicon”样式图标和


Rust语言简介
xqlily2025/10/8

Rust是一种现代的系统编程语言,由Mozilla基金会开发,并于2010年首次发布。它旨在解决传统语言(如C和C++)中的常见问题,如内存安全错误和并发性挑战,同时保持高性能。Rust强调安全性、速度和并发性,使其在系统开发、嵌入式系统和WebAssembly等领域广受欢迎。下面,我将从核心特点、优势和应用场景入手,逐步介绍Rust,并附上一个简单示例。 核心特点 内存安全:Rust通过独特的“所有权系统”避免空指针解引用、缓冲区溢出等常见错误。例如,编译器在编译时检查内存访问,确保


SpringBoot安全进阶:利用门限算法加固密钥与敏感配置
风象南2025/10/7

一、背景:单点密钥的隐患 在企业信息系统中,密钥是最核心的安全资产。无论是数据库加密、支付签名,还是用户隐私保护,背后都依赖一把"超级钥匙"。 然而,现实中我们常常遇到这些场景: 单点保管风险:某个核心密钥仅由一个运维人员或系统服务持有,一旦泄露或者丢失,整个系统可能崩盘。 操作合规问题:金融或政府系统中,法规往往要求多方共同参与,才能执行高风险操作。 分布式架构挑战:在云环境或多数据中心下,如何既能保证数据安全,又能防止任何一个节点"作恶"? 一句话总结: 👉 一个人掌握所有密钥 = 系统安


纯电汽车emc整改:设计缺陷到合规达标的系统方案|深圳南柯电子
深圳南柯电子2025/10/5

在新能源汽车产业迈入智能化、电动化深水区的当下,电磁兼容性(EMC)已成为决定产品安全与市场竞争力的核心指标。某头部车企曾因电机控制器辐射超标导致整车上市延迟,直接损失超3亿元;某新势力品牌因车载充电机传导骚扰超标引发用户投诉,召回成本高达1.2亿元。这些案例揭示了一个残酷现实:EMC整改不再是产品上市前的“补救措施”,而是贯穿研发、生产、运维全生命周期的系统工程。 一、纯电汽车emc整改的标准为纲:构建EMC合规的“法律底线” 纯电汽车EMC整改需严格遵循国内外双重标准体系。国内以GB/T


零基础从头教学Linux(Day 45)
小白银子2025/10/4

OpenResty介绍与实战 一、概述 OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web应用、Web服务和动态网关。 简单地说 OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Me


从汇编角度看C++优化:编译器真正做了什么
oioihoii2025/10/3

我们写的C++代码,对人类来说是清晰的逻辑表达,但对机器来说,只是一串抽象的字符。编译器,特别是像GCC、Clang这样的现代编译器,扮演着“翻译官”兼“优化大师”的角色。它们将高级代码转化为机器指令,并在此过程中,对代码进行脱胎换骨般的重塑,以求达到极致的性能。 今天,我们将深入汇编层面,揭开编译器优化的神秘面纱,看看我们的代码在编译器的“熔炉”中究竟经历了什么。 为什么选择汇编语言? 汇编是机器指令的人类可读形式,是连接高级语言与硬件执行的最直接桥梁。通过查看编译器生成的汇编代码,我们可以:

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0