,php使用redis怎么解决秒杀中的超卖问题?

用户投稿 82 0

关于“php_redis_库”的问题,小编就整理了【4】个相关介绍“php_redis_库”的解答:

php使用redis怎么解决秒杀中的超卖问题?

使用redis 的队列+watch解决,把秒杀商品放入队列,抢到则pop商品,队列用完,则停止抢购

<?php

header("content-type:text/html;charset=utf-8");

$redis = new redis();

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

$mywatchkey = $redis->get("mywatchkey");

$rob_total = 100; //抢购数量

if($mywatchkey<$rob_total){

$redis->watch("mywatchkey");

$redis->multi();

//设置延迟,方便测试效果。

sleep(5);

//插入抢购数据

$redis->hSet("mywatchlist","user_id_".mt_rand(1, 9999),time());

$redis->set("mywatchkey",$mywatchkey+1);

php redis怎么删除hash,而不是只删除了单个或多个域?

//删除单个实体

$redis->hDel('hashkey', 'key1');

//删除整个hash

$redis->del('hashkey');

删除一个redis的key都是用del方法, 不管是string,hash,list,set等类型, 都一样

php使用lua+redis实现限流,计数器模式,令牌桶模式?

协程间可共享全局变量,同时要维护各自的调用栈结构;这两个要求目前在PHP的架构下较难实现。当然,非阻塞IO是可以通过libevent扩展实现,比如使用laruence的YAR。

php redis做mysql的缓存,怎么异步redis同步到mysql数据库?

正常情况下是没有问题的,

但是有人用恶意脚本进行刷奖,也就是同一个人发起大量请求,1秒可能一两百的请求甚至更多,而且不只一个人刷奖。

问题出在1这一步

举个例子,假设每人只能抽一次奖,因为请求太快,同一人的a,b两个请求几乎同时来,a走完抽奖逻辑了,并且在抽奖表中插入记录的过程时,因为mysql的性能的问题,b去走1这一步是读不到表中的记录的,因为a的插入根本没有完成。所以b请求会再走一次抽奖逻辑。造成同一人抽奖两次,然后再插入抽奖表。

我关心的是能否a插入抽奖表的瞬间,b就能判断出抽奖表有数据。

所以我觉得问题是mysql写入的不够快,读取的不够快,所以我要采用redis做一层快速缓存。

我们做的抽奖是单一奖品百分之百中奖,只限制奖品数量,所以必须保证每人只能抽一次,而且尽量在程序层面去解决。

到此,以上就是小编对于“php_redis_库”的问题就介绍到这了,希望介绍关于“php_redis_库”的【4】点解答对大家有用。

抱歉,评论功能暂时关闭!