我正在用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)。
希望有道理。