在日常開發中,我們經常會給某個使用者或訂單寫入一些臨時的快取資料,比如使用者簡訊驗證碼,或者某個被鎖定的商品庫存
// 儲存使用者 ID 為 1 的驗證碼
$code = Cache::put('user_sms_code_' . Auth::id(), '1234', 60); // user_sms_code_1
// 儲存 ORDER_ID 為 1 商品秒殺庫存
$code = Cache::put('order_locked_stock_' . $order_id, '1', 60); // order_locked_stock_1
以上場景是開發中經常遇到的,看上去沒什麼問題,但有個隱患是我們的 Cache key
是一個字串,如果我們需要在業務中頻繁的讀寫,那麼很可能會敲錯導致出現意外的 bug。
為了解決這個問題,我們需要將 Cache key
定義為一個常量。
define('USER_SMS_CODE', 'user_sms_code_%d');
define('ORDER_LOCKED_STOCK', 'order_locked_stock_%d');
再次回到上面的程式碼:
// 儲存使用者 ID 為 1 的驗證碼
$code = Cache::put(sprintf(USER_SMS_CODE, Auth::id()), '1234', 60); // user_sms_code_1
// 儲存 ORDER_ID 為 1 商品秒殺庫存
$code = Cache::put(sprintf(ORDER_LOCKED_STOCK, $order_id), '1', 60); // order_locked_stock_1
這樣我們在敲快取 key 時會有 IDE 提示,用 sprintf
方法可以直接把 id
替換,避免了拼接的形式導致程式碼可讀性變差。
這只是個簡單的例子,如果要更嚴謹還需要對 key 合法性進行判斷。
本作品採用《CC 協議》,轉載必須註明作者和本文連結