如何管理需要拼接的缓存 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 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10
陈先生

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

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

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

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

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

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

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

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

我一般都是写一个缓存类

1年前 评论

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