在循环内调用redis’get’来显示论坛post查看数据

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

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

我想避免这种情况,并且正在考虑使用类似于此post的技术实现redis来记录该信息 – jQuery Redis点击计数器来跟踪缓存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)。

希望有道理。