在循环内调用redis“获取”以显示论坛帖子查看数据
我正在用Rails重建论坛/委员会。要求之一是记录主题的观看信息。
在当前系统中,每次页面加载时都会进行数据库调用,以更新该帖子的视图计数。
我想避免这种情况,并且正在考虑使用类似于此帖子的技术来实现redis来记录该信息-jQuery Redis hit
counter跟踪缓存的Rails页面的视图
因此,我将向一个请求请求的控制器(通过javascript)记录视图,然后执行cron作业将redis使用情况数据移至数据库(将其从redis中移除)。
我的难题是,当前的系统提供实时的使用信息,因此这将是前进的期望。按照我的计划,使用Heroku-最频繁的Cron工作将每小时运行一次,我认为这是不可接受的。
我的想法是,我可以将使用情况信息存储在redis中,然后在遍历主题时,我会将redis中存储的使用价值与cron作业中保存在数据库中的值结合起来。
这是一个愚蠢的主意吗?我是Redis的新手,所以我真的不知道有什么可能。像我建议的那样,在循环中进行redis呼叫是否是大禁忌?
回答:
如果您确实需要旧的应用程序来维护实时统计信息,并且想要使用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)。
希望有道理。
以上是 在循环内调用redis“获取”以显示论坛帖子查看数据 的全部内容, 来源链接: utcz.com/qa/430720.html