微博热门的排序算法
我有一张微博表,表里记录了点赞、转发、评论的数值,现在想优化热门的排序算法。
Q:热门数值的保存:以前我是在微博表中有一个字段 _hot 表示热度,每隔 60 分钟 UPDATE 这个字段,这样排序的时候就直接按照_hot字段排序就可以获得。这样能在一定程度上实现时间衰减。
更新的算法也可以和大家分享:
<code>UPDATE microblog as v SET _hot = LOG10((_zan*2+_com*5+ _tran*3))+(unix_timestamp(v._createtime)-unix_timestamp(\'2008-12-01 00:00:00\'))/100000; </code>
问题也很明显:
每隔 60s 就对于一张 4W+ 记录的表的每条记录做复杂的计算,对CPU的消耗太大。
A:我自己想实现的解决办法是将数据 SELECT 出来,将计算放在代码里面,然后再 UPDATE 回去。
不知道有没有更好的方式?如果用我的方式怎么实现呢?
回复内容:
我有一张微博表,表里记录了点赞、转发、评论的数值,现在想优化热门的排序算法。
Q:热门数值的保存:以前我是在微博表中有一个字段 _hot 表示热度,每隔 60 分钟 UPDATE 这个字段,这样排序的时候就直接按照_hot字段排序就可以获得。这样能在一定程度上实现时间衰减。
更新的算法也可以和大家分享:
<code>UPDATE microblog as v SET _hot = LOG10((_zan*2+_com*5+ _tran*3))+(unix_timestamp(v._createtime)-unix_timestamp(\'2008-12-01 00:00:00\'))/100000; </code>
问题也很明显:
每隔 60s 就对于一张 4W+ 记录的表的每条记录做复杂的计算,对CPU的消耗太大。
A:我自己想实现的解决办法是将数据 SELECT 出来,将计算放在代码里面,然后再 UPDATE 回去。
不知道有没有更好的方式?如果用我的方式怎么实现呢?
結論:
把密集的運算稀釋掉,充分用好閒置性能。
廢話:
首先,你的算法本身就可以優化。完全可以轉而計算 x*10^y
其中 x = _zan2+_com*5+ _tran*3,y = unix_timestamp(v._createtime)/100000
。
當然,我覺得 100000 應該改成 604800 (也就是 7 * 24 * 60 * 60
) ,或者把 10 改成 2,考慮「半衰期」更方便。
那麼假設你接受了我的建議,使用 x*2^y
表示。等等這個式子不眼熟嘛,這不就是浮點數的形式嘛。。。當然還需要調整好 x 的區間。 這時只要另 x 屬於 [1, 10) 即可(實際操作時,只需要取前幾位,然後將位數加上去即可)。多餘/不夠的部分加/減到 y 裏去。
於是乎,浮點數怎麼比大小,你就怎麼排序。壓根就不需要計算 x*2^y 到底是多少。
首先正負的問題就不用考慮了,然後是指數的二進位表示法更大的其浮點數值更大,也就是 y 更大的。
y 一樣再比較 x。(注意這裏的 x y 已經不是一開始的了)。
當然,又因爲,原本的 y 足夠大時,x 對其影響可忽略,所以,早於一定時間的微博根本不用考慮。
於是乎,你唯一必須知道的,就是 x 和 y。y 不合條件根本不考慮 x。y 符合條件再把 x 的位數(在二進制表示下)加上去。比較 y,y 相等才精確計算 x 並比較 x。(也就是說,一開始,對 x 的計算只用精確到它有多少位。。。根本不需知道精確值)。
所以現在必須知道的只剩下 y,以及一部分 x 的位數,以及個別 x 的精確值。
那麼怎樣快速計算 x 的位數?先睡一覺再告訴你。
算了,其實完全沒必要考慮 x 位數的速算,因爲計算 x 已經很簡單很簡單了。。。你只需要在用戶點讚、評論、轉發的時候,更新一下 x 就行了。哎,順便更新一下 y 也不錯嘛。。。其實根本不用儲存 x 嘛,只需要儲存一個 y + (x 的位數) 就行了。用到 x 的精確值可能性很低,到時候再說吧。。。
等等,其實以上一大堆全都可以刪掉了。
你只要在 _hot 可能更新的時候,更新一下就好了。把密集的運算稀釋掉,充分用好閒置性能。雖然浪費,但是卻避開了鋒芒。
所以不如延遲更新一下?每到距離上一次更新超過 60s,就再更新一次。或者,乾脆把計算 _hot 的任務交給客戶端 js,來個分佈式計算?爲保險起見,在上榜前再計算一次榜上有名的。
前一段时间记得有一个讨论热门算法的帖子,如果数据量非常大的话,直接进行排序等操作是不合适的,
可以考虑建一个表保存热门数据,每次从主表中获取数据时,更新主表访问数量,同时将获取的数据和热门数据表中最小值进行比较,小于则不做操作,大于则对热门表进行插入排序

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

CakePHP 是 PHP 的开源框架。它的目的是使应用程序的开发、部署和维护变得更加容易。 CakePHP 基于类似 MVC 的架构,功能强大且易于掌握。模型、视图和控制器 gu

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

CakePHP 是一个开源MVC 框架。它使开发、部署和维护应用程序变得更加容易。 CakePHP 有许多库可以减少大多数常见任务的过载。

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储
