使用Memcache作为多个对象的计数器

时间:2010-01-21 01:32:11

标签: mysql memcached hitcounter

我有一个照片托管网站,我想跟踪照片的观看次数。由于我获得了大量的流量,因此在每次点击时增加MySQL中的列会产生太多的开销。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我有一种使用方式。

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

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

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

答案 2 :(得分:0)

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

  1. 跟踪您上次检查日志的时间。
  2. 每隔n秒左右(其中n小于您的日志旋转所需的时间,如果是),扫描最新的日志文件,忽略每次点击,直到您在上次检查时间后找到时间戳
  3. 计算每张图片的访问次数。
  4. 将每个计数添加到存储在数据库中的计数。
  5. 存储下次处理的上一个日志条目的时间戳。