我目前正在开发一个包含查看计数器的成员(member)网站。过去的经验表明,在 SQL 中使用 View 计数器的成本很高。事实上,我远离查看计数器,但今天它不是一个选项。
项目使用
- rails 4.0.2
- Redis 对象 gem
- 为了演示,我希望将 Heroku 与
Redis To Go
插件一起使用 - 目前计数器是基于PG(Active Record)
- Redis Objects已经和AR一起使用来统计(但是如何保存到AR profiles表中呢?)
需要/想实现
- 在 Redis 中计数并可能使用 Rake + 计划任务定期存储到 PG 表
- 效率
问题
- 我不知道如何查询 Redis 数据库以找到其中的所有配置文件对象。
如果我可以获得这个对象列表,我可以编写一个 rake 任务来遍历每个项目并将模态值保存/更新到数据库中。
经过一些搜索 KEYS profile:*
似乎是将所有配置文件值保存到数据库的唯一方法。然后我必须从中手动获取对象并更新值。
问题
- 正在使用
keys
查找键,然后找到合理的对象(在效率方面)以在可能每天一次的计划任务中使用。 - 有没有办法直接从 Redis 数据库中获取所有
Profile
对象,就像我们可以在ActiveRecord
中执行Profile.all
一样? - 非常感谢任何实现计数器的建议(即使不是基于 Redis 的)
-
class Profile < ActiveRecord::Base
# To handle the profile counter
include Redis::Objects
counter :tviews
# Associations
belongs_to :user
# Other attributes
end
profiles_controller.rb
class ProfilesController < ApplicationController
def public
@profile.tviews.increment
# @profile.save # Save of AR based counting
end
end
在 slim 的地方
p.text-center#profile-counter
| Views -
= @profile.tviews.value + @profile.views
最佳答案
1) 不,不是。参见 redis docs它表示 时间复杂度:O(N),其中 N 是数据库中键的数量,假设数据库中的键名称和给定模式的长度有限。
不仅 Redis 必须遍历所有键,而且还必须将它们存储在内存中。同样由于 redis 的单线程特性,它在执行 keys 命令时会没有响应。
2) 这里不是 ruby 用户,但我认为不是。
3) 你有几个选择
- 将您的 key 的 ID 存储在 redis
set
中,并使用您的周期性任务(以及需要时的 redis 事务)对其进行清理。通过这种方式,您将始终准确知道 Redis 中有哪些键。 - 使用SCAN来自 redis 2.8 的命令它仅返回有限数量的键并使用内部游标迭代键。
(redis.io 现在好像挂了,所以链接可能失效了)
关于ruby-on-rails - Redis 对象 - 从数据库中获取所有对象 - 配置文件 View 计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22215053/