在循环中调用redis'get'来显示论坛帖子查看数据

时间:2011-09-03 05:24:19

标签: ruby-on-rails redis

我正在重建一个论坛/董事会。其中一个要求是为主题记录视图信息。

在当前系统中,每次加载页面时都会进行数据库调用,从而更新该帖子的查看计数。

我想避免这种情况,并且正在考虑使用类似于此帖子的技术实现redis来记录该信息 - jQuery Redis hit counter to track view of cached Rails pages

所以我会向一个记录视图的控制器发出请求 - 通过javascript - 然后一个cron作业会将redis使用数据移动到数据库(从redis中删除它)。

我的窘境在于,当前的系统提供实时使用信息,因此这将是未来的预期。使用Heroku - 按照我的计划 - 最常见的cron工作将按小时运行,我认为这是不可接受的。

我的想法是我可以将使用信息存储在redis中然后当我循环访问主题时,我会将存储在redis中的使用值与从cron作业保存在数据库中的值结合起来。

这是一个愚蠢的想法吗?我是redis的新手,所以我真的不知道什么是可能的。像我建议的那样在循环中进行redis调用是否是一个巨大的禁忌?

1 个答案:

答案 0 :(得分:3)

如果您真的需要旧的应用程序来保存实时统计信息,并且想要使用Redis,那么您必须更改旧代码才能访问它。

这是代码的起点。

每次点击,你都可以在Redis中检查线程的计数器。如果计数器键不存在,则激活加载。

所以这将是一种保持统计数据更新的方法(使用php,phpredis客户端):

try {
    $redis = new \Redis();
    $thread_id = getFromPostGet("thread_id"); //suppose so
    $key = 'ViewCounterKey:' . $thread_id; //each thread has a counter key

    $redis->multi(); //begin transaction
    if (!$redis->exists($key)) {
        $counter = getFromDB("count(*) where thread_id = $thread_id"); //suppose so
        $redis->set($key, $counter);
    }
    $redis->incr($key); //every hit incrs the counter
    $redis->exec(); //end transaction
}
catch (\RedisException $e) {
    echo "Server down";
}

因此,这个解决方案可以与cron作业放在一起,这将保持视图计数,每个cron之间1h的延迟无关紧要,因为你总是在调查内存(Redis,而不是DB)。 p>

希望这是有道理的。