一只小开发仔...

PHP使用Redsi处理库存类问题

304 2021-03-20 07:23:34

Redis单一操作指令都是原子性的,因此,可以应用Redis这一特性进行去处理例如库存类的问题;当前除了Redis还有其他例如顺序队列、锁等。

这里我们使用Redis的GET和DESRBY 两个操作处理库存。

1.使用redis创建一个库存为20

set stock 20

2.使用PHP连接redis演示库存操作流程

<?php
// 随机模拟购买数量
$num = mt_rand(1,10);

$redis = new \Redis();
$redis->connect('192.168.31.154',6379);
$redis->auth('123456');

$stock = $redis->get('stock');
if ($stock < $num) {
    $f = fopen('./stock.log', 'w+');
    fwrite($f, "库存不足{$stock}--{$num}\n");
    fclose($f);
} else {
    // 减库存
    $redis->decrBy('stock',$num);
}

3.使用ab进行压测验证

ab -n 1000 -c 100 http://192.168.31.154/stock.php

-n 表示请求总数,-c 表示并发用户数

这行表示同时处理1000个请求并运行100次stock.php文件。

4.查看库存

5.扩展

库存类的场景也可以使用Redsi的SETNX操作作为同步锁处理。

Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。

设置成功,返回 1 。 设置失败,返回 0 。