我有一个照片托管网站,我想跟踪照片的视图。由于我获得的流量大量,在每次命中率上增加了MySQL的一列会导致过多的开销。

我目前有一个使用memcache实现的系统,但这几乎只是一个黑客。

每次查看照片时,我都会在memcache中增加其photo-hits_uuid键。此外,我还将包含UUID的行添加到无效阵列中,也存储在memcache中。每隔一段时间,我都会获取无效阵列,然后循环穿过其中的行,将照片击中到MySQL并减少其Memcache键。

这种方法起作用,比直接使用MySQL快得多,但是有更好的方法吗?

有帮助吗?

解决方案

我做了一些研究,看来Redis可能是我的解决方案。似乎本质上是Memcache具有更多功能 - 对我来说最有价值的是列表,这几乎可以解决我的问题。

其他提示

我有一种方法。

方法1 :(文件的大小)每次有人击中页面时,我都会在文件中添加一个字节。然后,x秒左右(我设置了600个),我将计算文件中有多少个字节,删除文件,然后将其更新为MySQL数据库。如果多个服务器在缓存服务器中的小文件中添加到一个小文件,这也将允许可伸缩性。使用FWRITE将其附加到文件上,您将不必读取该缓存文件。

方法2 :(存储在文件中的数字)另一种方法是在包含命中次数的文本文件中存储一个数字,但是我建议使用此数字,因为如果两个过程同时更新,则数据可能会关闭(也许与方法1)。

我会使用方法1,因为尽管文件大小更大,但速度更快。

我假设您要在服务器上保留此解决方案的访问日志。

  1. 跟踪您上次检查日志的上一次。
  2. 每秒钟左右(如果n少于旋转日志所需的时间(如果是n)的时间),请扫描最新的日志文件,忽略所有点击,直到您在上次检查时间后找到时间戳为止。
  3. 计算每个图像访问多少次。
  4. 将每个计数添加到数据库中存储的计数中。
  5. 存储您下次处理的最后一个日志条目的时间戳。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top