php - 什么是存储和计算用户积分的好方法和灵活的方法?
问题描述
我想为不同的促销活动归功于用户。例如,在写一篇文章时,给一篇文章打分……
我正在寻找一种灵活的解决方案,我可以在其中调整不同动作的分数,并且总分也会发生变化。
如果我将这些点保存在表格中,之后我将无法更改它们。像这样:
$request->user()->points += 10;
$request->user()->save();
每次重新计算积分时的表现如何?像这样:
$articlepoints = $user->articles->count();
&votepoints = $user->votes->count();
$totalpoints = $articlepoints*10+$votepoints*5;
还有其他选择吗?
解决方案
如果您试图最小化每次加载的计数操作,您可以使用 Cache::remember() 方法。您只需要决定多久“过期”一次 cahced 值。我假设您将从 User 模型中运行此功能,但您可以在任何地方执行此操作:
$articlepoints = Cache::remember('articlepoints_'.$this->id, 5, function () {
return $this->articles->count();
});
这段代码所做的是检查缓存中索引“articlepoints_userID”下是否存在该用户的文章点。userID 是动态的,将为每个用户存储不同的值。如果该索引存在,则将其用作值。
如果缓存中不存在索引,您将传递给返回计算值并将其存储 5 分钟的函数。您可以对等式中的每个值(投票点和总点数)执行此操作,并使用您想要的任何到期时间。
使用此代码,您可以大大减少对 count() 函数的调用。但是,您仍然可能会根据您的缓存驱动程序对其中的每一个进行数据库调用或磁盘调用。为了避免这种类型的开销,您需要查看不同的缓存驱动程序,例如 redis。
查看Laravel Cache 文档,看看你可以用缓存做的所有其他很酷的事情。学习缓存系统是提高 Laravel 应用程序性能的好方法。
推荐阅读
- javascript - 如何关闭除打开的 div 之外的所有 div?
- python - 将两个原始值转换为 32 位 IEEE 浮点数
- javascript - 为什么我的滑块在到达终点后变为空白?
- c# - 如何在 Popups/Tooltips/TeachingTip 上捕获 UWP 指针事件
- reactjs - 我无法通过 Route 渲染传递我的道具
- python - 从python中的不同包导入文件时出现相对导入错误
- sql - 有没有办法将删除和更新的数据追加到历史表中
- apache-spark - Spark - 处理 CSV 文件中的空白值
- php - MySQL Query 在 Workbench 中完美运行,我的 php 仪表板没有返回任何值?
- php - mpdf 将两个 pdf 合并到一页