Redis中的商品超卖现象
早睡蛋
# 导入依赖
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1
2
3
4
5
2
3
4
5
# 配置文件
redis:
host: x.x.x.x
port: 6379
password: xxxxx
1
2
3
4
2
3
4
# 注入StringRedisTemplate
@Autowired
private StringRedisTemplate redisTemplate;
1
2
2
为何使用StringRedisTemplate?
因为RedisTemplate在底层使用的序列化时JDK的方式,展示的是二进制,在调试时很不方便。StringRedisTemplate的序列化都是String形式的,所以用StringRedisTemplate比较方便。
# 编写业务代码
@Autowired
private StringRedisTemplate redisTemplate;
public void deduct() {
//1.查询库存信息
String stock = redisTemplate.opsForValue().get("stock");
//2.判断库存是否充足
if (stock != null && stock.length() != 0) {
Integer st = Integer.valueOf(stock);
if (st > 0) {
//3.扣减库存
redisTemplate.opsForValue().set("stock", String.valueOf(--st));
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 测试
吞吐量非常高,但是出现了并发问题
# 方案
- JVM本地锁机制
- Redis乐观锁:watch、multi、exec
- 分布式锁