Redis中的商品超卖现象

# 导入依赖

<!--redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
1
2
3
4
5

# 配置文件

redis:
    host: x.x.x.x
    port: 6379
    password: xxxxx
1
2
3
4

# 注入StringRedisTemplate

@Autowired
    private StringRedisTemplate redisTemplate;
1
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

# 测试

image-20221007223636160

image-20221007223740829

吞吐量非常高,但是出现了并发问题

# 方案

  1. JVM本地锁机制
  2. Redis乐观锁:watch、multi、exec
  3. 分布式锁