springboot
<!-- https://mvnrepository.com/artifa ... -starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
return "end";
}
}
1.
JMeter
Number Of Threads[users]:100
Ramp Up Period[in seconds]:0
Loop Count
web
synchronized
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
synchronized(this) {
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
return "end";
}
}
}
2.
nginx
redis
setnx
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
String lockkey = "lockkey";
Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,"lockvalue");//jedis.setnx
if(!result) {
return "";
}
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
springRedisTemplate.delete(lockkey);
return "end";
}
}
200
redis
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
String lockkey = "lockkey";
try{
Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,"lockvalue");//jedis.setnx
if(!result) {
return "";
}
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
}finally{
springRedisTemplate.delete(lockkey);
}
return "end";
}
}
Redis
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
String lockkey = "lockkey";
try{
Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,"lockvalue",10,TimeUnit.SECONDS);//jedis.setnx
//Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,"lockvalue");//jedis.setnx
//stringRedisTemplate.expire(lockkey,10,TimeUnit.SECONDS);
if(!result) {
return "";
}
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
}finally{
springRedisTemplate.delete(lockkey);
}
return "end";
}
}
15s
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
String lockkey = "lockkey";
String clientId = UUID.randomUUID().toString();
try{
Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,clientId ,10,TimeUnit.SECONDS);//jedis.setnx
//Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,"lockvalue");//jedis.setnx
//stringRedisTemplate.expire(lockkey,10,TimeUnit.SECONDS);
if(!result) {
return "";
}
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
}finally{
springRedisTemplate.delete(lockkey);
}
return "end";
}
}
15s
Redission
Redission
pom.xml
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.6.5</version>
</dependency>
Application.java
@bean
public Redission redission {
//
Config config = new Config();
config.useSingleServer().setAddress("redis://120.0.0.1:6379").setDatabase(0);
return (Redission)Redission.creat(config);
}
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate
@Autowired
private Redissionredission
@RequestMapping("/deduct_stock")
public Stirng deductStock() {
String lockkey = "lockkey";
//String clientId = UUID.randomUUID().toString();
RLock lock = redission.getLock();
try{
//Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,clientId ,10,TimeUnit.SECONDS);//jedis.setnx
//Boolean result = stringRedisTemplate.opsForValue.setIfAbsent(lockkey,"lockvalue");//jedis.setnx
//stringRedisTemplate.expire(lockkey,10,TimeUnit.SECONDS);
//
lock.lock(60,TimeUnit.SECONDS);
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));//jedis.get(key)
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue.set("stock",realStock+"");//jedis.set(key,value)
System.out.println(
} else {
System.out.println(
}
}finally{
lock.unlock();
//springRedisTemplate.delete(lockkey);
}
return "end";
}
}