- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须分页并显示大量按“分数”排序的文章,这个分数不会保存在任何地方,而是在页面加载时计算。
文章的评分取决于很多因素,比如点击率、分享率、点赞数、收藏夹,我的意思是我不能把逻辑放在 SQL 查询中。
所以,我所做的是:获取完整数据 -> 计算所有数据的分数 -> 按最高分数排序 -> 显示为数组 block (使用 Laravel 自定义分页器)
$Articles = DB::table('articles')->get();
//for test purpose here i can run a for-loop and print its values
foreach ($Articles as $Article) {
echo "Article id : ".$Article->id";
//here i cant print $Article->score
}
$Articles = $this->likesScoreFunction1($Articles);
$Articles = $this->scorefunction2($Articles);
$Articles = $this->scorefunction3($Articles);
我在 scoreFunctions
中所做的是添加一个名称为“score”的额外数组值,以及使用最新分数更新下一个函数等等。我的意思是在这些测试函数之后,我可以运行一个 for
循环,如下所示:
foreach ($Article as $Article) {
echo "Article id : ".$Article->id." score is ".$Article->score."\n";
}
usort($Articles, function($a, $b) {
return $b['score'] - $a['score'];
});
最后,我在 $Articles;
然后我将第一个数组 block 传递给 View 。
我知道这不是一个好方法,因为我将所有文章的值加载到内存中。任何人都可以为此推荐任何更好的方法吗?
The score can be different at different minutes or seconds..
一种可能性是每分钟运行一次 cron 并更新分数字段。这是不切实际的,因为这会处理系统中所有组织的所有文章。
我的客户不想采用上述方法,因为当任何用户发布一篇文章时,它的得分最高,应该排在首位。在 cron 完成它的工作之前,我们不会在顶部看到新文章。
最佳答案
几周前我遇到了一个复杂排名算法的类似问题,并尝试了您描述的各种方法。
Pure SQL 难以调试和维护,而且执行起来很慢。数据库必须选择所有文章,加入所有相关的投票/分数/等,对整个集合进行排序然后返回分页结果。在某些情况下,它不能为此使用索引。数据库缓存中充满了(对我而言)不相关的记录。
纯SQL版本应用了前端缓存。我们无法找到合适的缓存年龄 - 要么是等级过时,要么是太多请求缺少缓存。
未尝试使用SQL 和 PHP 进行实时计算。我认为它只能比纯 SQL 方法慢。
为了及时获得结果,我们必须提前存储计算出的排名值。正如您已经在探索的那样,有几种方法可以实现它;
cron
作业 - 如您所知,这太慢了,太慢了cron
作业重新计算队列中当前事件最多的文章的排名,从而消除最可能排队的作业并使用 CPU 周期以达到最大效果。事件队列对我们有用,所以我不再寻找其他解决方案。我们确实用 Varnish 添加了一个 1-3 秒的微缓存来减轻数据库的流量负担,以确保实时工作和排名计算之间的良好平衡。
SQL 在基于时间的计算方面仍然很好,例如,我不希望在文章上触发常规事件以随着时间的推移降低排名。如果排名是事件和时间的组合,我会存储预先计算的基于事件的排名、发布时间,并让 SQL 查询计算组合。
当我们的排名变得如此复杂时,我们使用了一个单独的表,纯粹用于排名(固定宽度的数据列,巧妙的索引),与文章具有一对一的关系。或者如果用户可以选择如何对它们进行排名,则为多对一关系。这样,数据库就不需要每次都加载所有文章数据并搜索低效索引。只需在排名分页后加入文章数据即可。
如果您正在使用 Doctrine,请注意贪婪的水合作用。
喂!
关于mysql - 显示按 "on the fly score calculation"排序的带分页的文章的最佳做法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33689504/
我在 asp.net 应用程序(使用 IKVM)中使用 flysaucer 和 iText 将 HTML 转换为 PDF。如果我将样式直接放在 html 中,它工作正常(即使样式放在样式标签之间),但
我一直在尝试将带有内容的伪元素添加到正在使用飞碟库转换的页面的 CSS 中。在常规浏览器中以 HTML 格式查看页面时,代码运行良好,我可以看到伪元素 (:before)。然而,当使用 Flying
我使用 Flying Saucer 和 itext 将 html 转换为 pdf,为了在垂直方向写入文本,我尝试了简单的 css: style="writing-mode: tb-rl"; 浏览器的变
我有一个组合框,用户可以在其中选择可用的语言。该应用程序包含每种语言的属性文件。在页面的资源部分,资源包是根据用户配置文档中的语言标记(DE、EN ...)计算的。 有什么简单的方法可以根据组合框的值
我已经在页面上嵌入了Youtube播放器,并使用JavaScript生成了“即时”播放列表。观看期间是否可以在播放列表的末尾添加新视频?我可以从列表的开头删除视频吗? 最佳答案 您可以,但是在尝试在视
...特别是在 Groovy 中(因此是标签)? 在 Java 中你不能这样做......但在动态语言(例如 Python)中你通常可以。 在 Eclipse 中尝试做类似在 Spock 特性(即测试
在编写 shell 脚本(据我所知通常没有 .* 后缀)时,我通常会执行以下操作 1) emacs foo2) 输入 #!/bin/sh3) 关闭并重新打开 emacs 以启用 shell-scrip
嗨,我有一个对象:var myobject = new Object;我想在以这种方式循环 jquery 输入集合时动态填充它的属性: $('.test').each(function(){
我认为可以在 C 中即时连接字符串(字符数组)。 char* str1= "hello" " " "world"; 但是当我尝试以下操作时,我会收到一条错误消息(函数 fopen 的参数太少)。为什么
我有下表: store | dow | turnover ------+-----+----------- 1 | 1 | Eu59.426,00 1 | 2 | Eu33.
我需要使用标准 UNIX diff 命令和 python subprocess 模块创建一个差异文件。问题是我必须在不创建临时文件的情况下比较文件和流。我想过通过 os.mkfifo 方法使用命名管道
Fly-Pie 是一个用于 GNOME 的独特的菜单启动器,以操作鼠标为主的用户可以用它进行一些操作。 应用启动器可以方便地快速切换到一个活动窗口,启动新的应用,等等。 Ulau
strftime(),根据 cpan.org: print strftime($template, @lt); 我只是想不出这个正确的 Perl 代码配方。它在我调用 strftime() 的地方不断
这里有没有人得到 word-wrap: break-word 在 flying-saucer 中工作?我在 flying-saucer 中将 html 渲染为 png。我可以找到一个 3 年前的话题
Windows 7,Emacs 25.1 我需要对我的自定义文本进行“即时”拼写检查(例如,强调不正确的单词)。但我在 中写文字两种语言 : 英语和俄语。我想在两种语言的拼写检查之间轻松切换。 什么是
一直在玩飞碟R8,试过从首页隐藏页眉和页脚 我的PDF。 我关注了 hint试图遵循 的 W3C 规范内容:元素() (W3C running elements)在我的 print.css 中。据描述
我正在使用由按钮触发的 FlyTo 动画来放大 map 。平移缩放动画结束后,无法使用鼠标滚轮缩小。 如果我单击基本的缩小控件,它就可以工作,如果我在触摸屏上测试它,它就可以工作。如果我尝试使用鼠标滚
我无法将Wild-fly容器连接到在其他容器中运行的PostgreSQL服务器。但是,我能够从主机连接到数据库。 最佳答案 看看networking和links。我建议联网。网络内部的容器名称可以由d
我正在使用 Flying Saucer/iText 生成报告。现在报告有一个条件,如果特定条件发生,报告应该移动到 pdf 的下一页,并在 PDF 上添加数据等等。 问候帕万 最佳答案 您必须使用 c
您好,我有一个 tabpanel,其中有两个面板,但是当我尝试使用 tabpanel.show() 显示一个面板时。我收到这条消息 Ext.fly() null or not an object do
我是一名优秀的程序员,十分优秀!