Redis--秒殺場景應用
在大流量程式開發中,必然會遇到高併發的應用的場景。解決方案大致分為兩個方向,訊息佇列 、鎖
redis 實現訊息佇列核心簡單版本
$key = 'quque'; /** * 秒殺商品數量有限,預先儲存到訊息佇列 */ public function qnquque() { for($i = 1 ; $i<=5 ;$i++) { $redis->lpush($key,$i); } } /** * 這裡省略掉業務邏輯處理,預設業務邏輯處理完,出佇列 */ public function dequque() { $redis->rpop($key); /** *這裡開始商品購買後的業務邏輯處理 */ }
訊息佇列是防止超買超賣很好的一種解決方案,要實現訊息佇列的高階功能需要用到專業的訊息佇列工具例如(rabbitmq).使用者Redis 使用者redis實現訊息佇列還是有一些缺點的,可以自行查詢文章補充。這邊不一一概述。最大問題還是分散式叢集的問題。
Redis 樂觀鎖實現秒殺功能
它的優點如下:
- 訊息佇列對記憶體消耗較大,10000個請求,需要操作10000 出佇列。容易造成記憶體資源瞬間爆棚
- 使用樂觀鎖的邏輯,CPU相對來說消耗較低、記憶體資源佔用少
$redis = new redis(); $result = $redis->connect('127.0.0.1', 6379); $cachekey = $redis->get("cachekey"); $number = 100;//搶購數量 if($cachekey<$number){ $redis->watch("cachekey"); $redis->multi(); //設定延遲,方便測試效果。 sleep(5); //插入搶購資料 $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; } }
結尾
本文並沒有從零開始業務分析,都是核心的業務邏輯程式碼。需要結合實際的業務場景嵌入本文的核心實現邏輯。嘿嘿~