一文帶你了解Redis秒殺應(yīng)用場景
redis 實現(xiàn)消息隊列核心簡單版本
$key = 'quque';
/**
* 秒殺商品數(shù)量有限,預(yù)先存儲到消息隊列
*/
public function qnquque() {
for($i = 1 ; $i<=5 ;$i++) {
$redis->lpush($key,$i);
}
}
/**
* 這里省略掉業(yè)務(wù)邏輯處理,默認業(yè)務(wù)邏輯處理完,出隊列
*/
public function dequque() {
$redis->rpop($key);
/**
* 這里開始商品購買后的業(yè)務(wù)邏輯處理
*/
}消息隊列是防止超買超賣很好的一種解決方案,要實現(xiàn)消息隊列的高級功能需要用到專業(yè)的消息隊列工具例如(rabbitmq).用戶Redis 用戶redis實現(xiàn)消息隊列還是有一些缺點的,可以自行查找文章補充。這邊不一一概述。最大問題還是分布式集群的問題。
Redis 樂觀鎖實現(xiàn)秒殺功能
它的優(yōu)點如下:
消息隊列對內(nèi)存消耗較大,10000個請求,需要操作10000 出隊列。容易造成內(nèi)存資源瞬間爆棚
使用樂觀鎖的邏輯,CPU相對來說消耗較低、內(nèi)存資源占用少
$redis = new redis();
$result = $redis->connect('127.0.0.1', 6379);
$cachekey = $redis->get("cachekey");
$number = 100; //搶購數(shù)量
if($cachekey<$number){
$redis->watch("cachekey");
$redis->multi();
//設(shè)置延遲,方便測試效果。
sleep(5);
//插入搶購數(shù)據(jù)
$redis->hSet("cachekeyList","user_id_".mt_rand(1, 9999),time());
$redis->set("cachekey",$cachekey+1);
$result = $redis->exec();
if($result){
$cachekeyList = $redis->hGetAll("cachekeyList");
echo "恭喜".$cachekeyList."搶購成功!<br/>";
}else{
echo "再接再厲";
exit;
}
}
結(jié)尾
評論
圖片
表情
