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

jicheng1014 · October 08, 2014 · Last by jicheng1014 replied at October 10, 2014 · 3001 hits

是这样的,我想根据我设备传回的最后时间判断我自己的一个设备是否在线(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 分钟检查一次,将结果硬性的记录到数据库中?

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

看是实现场景是什么。

如果是即时聊天,那么即时聊天使用什么实现的呢?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 比较容易

You need to Sign in before reply, if you don't have an account, please Sign up first.