ruby-on-rails - Redis 对象 - 从数据库中获取所有对象 - 配置文件 View 计数器

标签 ruby-on-rails redis redis-objects

我目前正在开发一个包含查看计数器的成员(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:* 似乎是将所有配置文件值保存到数据库的唯一方法。然后我必须从中手动获取对象并更新值。

问题

  1. 正在使用 keys 查找键,然后找到合理的对象(在效率方面)以在可能每天一次的计划任务中使用。
  2. 有没有办法直接从 Redis 数据库中获取所有 Profile 对象,就像我们可以在 ActiveRecord 中执行 Profile.all 一样?
  3. 非常感谢任何实现计数器的建议(即使不是基于 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/

相关文章:

php - 我如何在 controller.php 中将 redis 更改为 mysql

java - 将 jedis 与 spring 一起使用,但不与 spring-data lib 一起使用,在哪里存储池?

ruby-on-rails - 带 Rails 的 Redis

ruby - Redis-objects Ruby gem,如何检索 Redis 列表并迭代?

javascript - Rails 中的简单 JavaScript

ruby-on-rails - SSH和S3存储桶之间的桥梁,用于文件传输

jQuery 不会对 Rails 中通过 AJAX 渲染的部分起作用

ruby-on-rails - 如何使用 RSpec 测试 Elasticsearch 和 Searchkick

雷迪斯。获取 where 子句

ruby-on-rails - ruby 中 Redis 对象上的 Redis 对象列表