原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/13200032.html
原理
SET key value [NX] [XX] [EX <seconds>] [PX [millseconds]]
必选参数说明
- SET:命令
- key:待设置的key
- value: 设置的key的value
可选参数说明
- NX:表示key不存在才设置,如果存在则返回NULL
- XX:表示key存在时才设置,如果不存在则返回NULL
- EX seconds:设置过期时间,过期时间精确为秒
- PX millseconds:设置过期时间,过期时间精确为毫秒
以上set 代替了 setnx + expire 需要分2次执行命令操作的方式,保证了原子性。
如果setnx 返回ok 说明拿到了锁;如果setnx 返回 nil,说明拿锁失败,被其他线程占用。
Project Directory
Maven Dependency
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.8.RELEASE</version> <relativePath/> </parent> <modelVersion>4.0.0</modelVersion> <groupId>org.fool.redis</groupId> <artifactId>redis-lock-setnx</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.12</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>