新手问题 选择综合症,Rails.cache 还是 Redis 还是我思路已经错了?

jicheng1014 · 2014年10月08日 · 最后由 jicheng1014 回复于 2014年10月10日 · 2311 次阅读

是这样的,我想根据我设备传回的最后时间判断我自己的一个设备是否在线(DateTime.Now 与updated_at 相差5min以上理解为掉线了)

每当设备有返回信息的时候,我就更新设备本身这条记录,这样就刷新了updated_at

目前我有几种思路

1、在after_find 中与updated_at 进行比较,这样每次查询的时候就能判断出来设备是否在线 优点:简单粗暴 缺点:必须使用ActiveRecord 查询才会触发,如果是其他程序来查看数据库,则就不能判断了

2、使用rails.cache.fetch 进行实现 优点:依然很简单 ,设置缓存过期时间为5min,当有缓存命中的时候认为在线,缺点:第一次设备有返回时由于没建立缓存,则仍然会显示掉线

3、使用Redis 进行实现 我觉得跟rails.cache.fetch 差不多,但我觉得又要去启动一个redis 似乎很麻烦的说,我设备也不是很多,最多100个,应该对效率没太大影响??

4、使用cron 等技术,10分钟检查一次,将结果硬性的记录到数据库中?

新手不太清楚,如果问题很傻,还请多多包涵

共收到 6 条回复

看是实现场景是什么.

如果是即时聊天,那么即时聊天使用什么实现的呢? xmpp的话是有状态的 faye的话也是有状态的.

如果是客户端轮询的话就最后轮询时间判断.

#1楼 @hging

多谢指导

faye是依赖web socket,我的设备不支持web socket,所以就没有考虑了

cron应该是最稳的,但是总觉得设置linux 的cron 略麻烦,特别是使用了rvm,还需要考虑环境变量什么的

还请问为什么2,3 不符合这个场景呢?

#2楼 @jicheng1014 cron不麻烦. 有一个叫whenever的gem可以把你需要的cron命令都列出来 只要贴进去就行了.

友情顶

这样的应用场景建议毫不犹豫的选择redis,定义1个key(和设备或者用户有关)和1个列表,设置5min的expire,因为你才100个设备,随时去取redis这个key对应的数据缓存就好了,取不到就是不在线了。有新请求的时候,在before_action里面把你的key的expire重置一下就好了,这样思路比较清楚,蓉易扩展维护,性能也好。当然如你所说,需要维护1个redis server。不知道你的数据库用什么,如果是mongodb,mongodb可以提供expire的机制,实现方案类似,应该更简单。

#5楼 @debugger 历史最怂的mysql ^_^ mongodb 什么的公司都不想上,因为要跟其他的程序打交道,mysql比较容易

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册