如何管理需要拼接的缓存 Key

在日常开发中,我们经常会给某个用户或订单写入一些临时的缓存数据,比如用户短信验证码,或者某个被锁定的商品库存

// 存储用户 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 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10
陈先生

佬,你为啥不独立出来做ENUM,或者在对应的Model中做Const,而是选择了全局常量?

1年前 评论
MArtian (楼主) 1年前
随波逐流 1年前

我一般会定义一个获取cachekey的方法

1年前 评论
巴啦啦 8个月前
flc1125

define() 的方式个人见解:最不优雅的方式

1年前 评论
MArtian (楼主) 1年前

file 为什么不单独定义一个枚举文件?

1年前 评论
MArtian (楼主) 11个月前

我一般都是写一个缓存类

11个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!