我正在重建一个论坛/董事会。其中一个要求是为主题记录视图信息。
在当前系统中,每次加载页面时都会进行数据库调用,从而更新该帖子的查看计数。
我想避免这种情况,并且正在考虑使用类似于此帖子的技术实现redis来记录该信息 - jQuery Redis hit counter to track view of cached Rails pages
所以我会向一个记录视图的控制器发出请求 - 通过javascript - 然后一个cron作业会将redis使用数据移动到数据库(从redis中删除它)。
我的窘境在于,当前的系统提供实时使用信息,因此这将是未来的预期。使用Heroku - 按照我的计划 - 最常见的cron工作将按小时运行,我认为这是不可接受的。
我的想法是我可以将使用信息存储在redis中然后当我循环访问主题时,我会将存储在redis中的使用值与从cron作业保存在数据库中的值结合起来。
这是一个愚蠢的想法吗?我是redis的新手,所以我真的不知道什么是可能的。像我建议的那样在循环中进行redis调用是否是一个巨大的禁忌?
答案 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>
希望这是有道理的。