一尘不染

在循环内调用redis“获取”以显示论坛帖子查看数据

redis

我正在用Rails重建论坛/委员会。要求之一是记录主题的观看信息。

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

我想避免这种情况,并且正在考虑使用类似于此帖子的技术来实现redis来记录该信息-jQuery Redis hit
counter跟踪缓存的Rails页面的视图

因此,我将向一个请求请求的控制器(通过javascript)记录视图,然后执行cron作业将redis使用情况数据移至数据库(将其从redis中移除)。

我的难题是,当前的系统提供实时的使用信息,因此这将是前进的期望。按照我的计划,使用Heroku-最频繁的Cron工作将每小时运行一次,我认为这是不可接受的。

我的想法是,我可以将使用情况信息存储在redis中,然后在遍历主题时,我会将redis中存储的使用价值与cron作业中保存在数据库中的值结合起来。

这是一个愚蠢的主意吗?我是Redis的新手,所以我真的不知道有什么可能。像我建议的那样,在循环中进行redis呼叫是否是大禁忌?


阅读 970

收藏
2020-06-20

共1个答案

一尘不染

如果您确实需要旧的应用程序来维护实时统计信息,并且想要使用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)。

希望有道理。

2020-06-20