代码之家  ›  专栏  ›  技术社区  ›  Justin

将memcache用作多个对象的计数器

  •  4
  • Justin  · 技术社区  · 15 年前

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

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

    每次看到一张照片,我都会在memcache中增加它的photo-hits_uid键。另外,我将一个包含UUID的行添加到一个同样存储在memcache中的无效数组中。每隔一段时间,我都会提取失效数组,然后循环遍历其中的行,将照片命中数推送到MySQL,并减少它们的memcache键。

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

    3 回复  |  直到 10 年前
        1
  •  2
  •   Justin    15 年前

    我做了一些调查,看起来Redis可能是我的解决方案。看起来它本质上是具有更多功能的memcache——对我来说最有价值的是列表,它可以解决我的问题。

        2
  •  0
  •   ambiguousmouse    15 年前

    我有一种方法。

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

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

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

        3
  •  0
  •   pib    15 年前

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

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