首页 > 编程知识 正文

redis解决高并发问题,如商品秒杀,Redis 并发

时间:2023-05-04 02:26:41 阅读:182951 作者:41

【实例简介】

【实例截图】

【核心代码】

namespace appwebcontroller;

use thinkController;

use thinkModel;

use thinkCookie;

use libRsa;

use libExcel;

class Redisorder extends Common {

public function newList() {

return json(["success"=>false,"data"=>["name"=>input("name")]]);

}

public function rudui() {

$store = 10;

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$res = $redis->llen('goods_store');

$count = $store - $res;

for ($i = 0; $i < $count; $i ) {

$redis->lpush('goods_store', 1);

}

echo "ok";

}

public function xbuy() {

for ($i = 0; $i < 15; $i ) {

echo $i . "
";

$this->buy();

}

echo "ok";

}

public function buy() {

//下单前判断redis队列库存量

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$count = $redis->lpop('goods_store');

if (!$count) {

echo '已经抢光了哦';

} else {

echo '恭喜您!抢到了哦';

}

}

public function memberRedis() {

$uniqid = uniqid('uid-', TRUE); // 模拟唯一用户ID

$redis = new Redis();

$redis->connect('127.0.0.1', 6379); // 连接 redis

$redis->watch('rest_count'); // 监测 rest_count 是否被其它的进程更改

$rest_count = intval($redis->get("rest_count")); // 模拟唯一订单ID

if ($rest_count > 0) {

echo "抢到了" . PIPELINEHP_EOL;

$value = "{$rest_count}-{$uniqid}"; // 表示当前订单,被当前用户抢到了

// do something ... 主要是模拟用户抢到单后可能要进行的一些密集运算

$rand = rand(100, 1000000);

$sum = 0;

for ($i = 0; $i < $rand; $i ) {

$sum = $i;

}

// redis 事务

$redis->multi();

$redis->lPush('uniqids', $value);

$redis->decr('rest_count');

$replies = $redis->exec(); // 执行以上 redis 事务

// 如果 rest_count 的值被其它的并发进程更改了,以上事务将回滚

if (!$replies) {

echo "订单 {$value} 回滚" . PIPELINEHP_EOL;

}

}

$redis->unwatch();

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。