如何設計高併發時的秒殺,是面試電商技術職位時必考的題目。今天在這裡分享一下基於redis或memcached的技術方案,能解決重複提交、超發、高併發的問題。
<?php
//預定義總庫存
define("total_stock", 5);
//預定義商品編號
define("item_id", "item_001");
$userid = $_get['userid'];
$useridkey = item_id . '_' . $userid;
$redis = new redis();
//如果有多台redis伺服器,可根據商品編號雜湊後得到其中一台redis的位址
$result = $redis->connect('master104', 6379);
//獲取之前已經領取掉的數量
$requested = $redis->get("requested");
echo "領取前庫存: " . (string)(total_stock - $requested) . "
";//如果已領取大於預定義庫存,則認為庫存為零,不允許繼續
if ($requested && ($requested >= total_stock))
//通過設定使用者對該商品的領取狀態,來檢查該使用者是否已領取過
//如果使用memcached的話,可以使用cas()
if (!$redis->setnx($useridkey, 1))
//增加領取數量以減少庫存。
//高併發情況下可能會有多個incr()是成功的。但是沒關係,在領取數大於庫存數後,通過下面的if判斷後,後面的請求都是無效的。
$requested = $redis->incr("requested");
//如果嘗試增加的時候,發現庫存已經為零了,需要重置使用者領取狀態
if ($requested && ($requested > total_stock))
//以下可以做其他的後續操作,比如各種非同步並行操作,或是投遞訊息到佇列,等等
//step1
//...
//stepn
//如果步驟進行到這裡,不管以上的非同步操作進行得如何,我們都必須認為使用者已經領取成功。
//即使有任何失敗,我們都需要用技術手段幫使用者完成上述step1到stepn
echo "領取成功!
";echo "領取後庫存: " . (string)(total_stock - $requested) . "
";?>
redis memcache 效能比較
from redis和memcache非常像的,都是key,value的方式,將資料存放記憶體中。最近在學習redis,在網上看了一些這方面的資料,有三種觀點 1,redis讀寫記憶體比memcache快 2,memcache讀寫記憶體比redis快 3,memcache讀寫記憶體比redis快,但...
php中redis memcache等快取的應用
在web開發的過程中快取是必不可少的工具,無論是mamcache還是redis我想大家都很有所涉略。我分享一下我個人在工作中的一些使用後的想法。緩衝應用設計 對於快取的使用我想大家應該都會使用,簡單的key value 我就不多說什麼了 不會用的可以看下手冊 快取無外乎就是在應用於資料庫之間建立乙個...
AspectJ基於xml和基於註解
一 基於xml 執行的切入點中具體方法有返回值,則方法結束會立即執行後置通知,然後再執行環繞通知的放行之後的 2 連線點即所有可能的方法,切入點是正真被切的方法,連線點方法名 其中,只有環繞通知的切入點引數不一樣,是可以放行的切入點 3 異常通知是處理異常 切面類中的異常通知的方法引數列表中異常引數...