4

我有一个照片托管网站,我想跟踪照片的浏览量。由于我得到的流量很大,每次点击时增加 MySQL 中的一列会产生过多的开销。

我目前有一个使用 Memcache 实现的系统,但它几乎只是一个 hack。

每次查看照片时,我都会在 Memcache 中增加其 photo-hits_uuid 键。此外,我将包含 uuid 的行添加到同样存储在 Memcache 中的失效数组中。每隔一段时间,我就会获取失效数组,然后循环遍历其中的行,将照片命中推送到 MySQL 并减少它们的 Memcache 键。

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

4

3 回答 3

2

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

于 2010-01-21T02:28:18.157 回答
0

我有一种方法可以使用。

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

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

我会使用方法 1,因为虽然文件更大,但速度更快。

于 2010-01-21T01:34:40.463 回答
0

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

  1. 跟踪您上次检查日志的时间。
  2. 每隔 n 秒左右(其中 n 小于轮换日志所需的时间,如果它们是的话),扫描最新的日志文件,忽略每次命中,直到找到最后一次检查时间之后的时间戳。
  3. 计算每个图像被访问的次数。
  4. 将每个计数添加到存储在数据库中的计数中。
  5. 存储您下次处理的最后一个日志条目的时间戳。
于 2010-01-21T01:42:39.733 回答