【问题标题】:Redis Object - Get All Objects from DB - Profile View CounterRedis 对象 - 从数据库中获取所有对象 - 配置文件视图计数器
【发布时间】:2014-03-07 00:06:00
【问题描述】:

我目前正在开发一个包含查看计数器的会员网站。过去的经验表明,在 SQL 中使用视图计数器的成本很高。事实上,我一直远离查看柜台,但今天它不是一个选择。

项目使用

  • Rails 4.0.2
  • Redis 对象宝石
  • 为了演示,我希望将 Heroku 与 Redis To Go 插件一起使用
  • 目前计数器基于 PG (Active Record)
  • Redis 对象已用于 AR 计数(但如何保存到 AR 配置文件表?)

需要/考虑实现

  • 在 Redis 中计数并可能使用 Rake + 调度任务定期存储到 PG 表中
  • 效率

问题

  • 我不知道如何查询 Redis DB 以查找其中的所有 Profile 对象。

如果我能得到这个对象列表,我可以编写一个 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

在超薄

    p.text-center#profile-counter
      | Views - 
      = @profile.tviews.value + @profile.views

【问题讨论】:

    标签: ruby-on-rails redis redis-objects


    【解决方案1】:

    1) 不,不是。见redis docs,上面写着Time complexity: O(N) with N being the number of keys in the database, under the assumption that the key names in the database and the given pattern have limited length.

    redis 不仅需要遍历所有键,还必须将它们存储在内存中。同样由于 redis 的单线程特性,它在执行 keys 命令时会无响应。

    2) 这里不是 ruby​​ 用户,但我认为不是。

    3) 您有多种选择

    • 将密钥的 id 存储在 redis set 中,并使用定期任务(如果需要,还可以使用 redis 事务)清理它。这样您就可以始终准确地知道 redis 中有哪些键。
    • 使用 redis 2.8 中的SCAN 命令它只返回有限数量的键并使用内部游标迭代键。

    (redis.io 现在似乎已关闭,因此链接可能无法正常工作)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-19
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多