1

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

该项目使用

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

需要/想实现

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

问题

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

如果我能得到这个对象列表,我可以编写一个 rake 任务来遍历每个项目并将模态值保存/更新到数据库。

经过一番搜索KEYS profile:*似乎是将所有配置文件值保存到数据库的唯一方法。然后我必须从中手动获取对象并更新值。

问题

  1. 用于keys查找密钥,然后是合理的对象(就效率而言),以便在计划任务中使用,可能每天一次。
  2. 有没有办法Profile像我们一样直接从 Redis 数据库Profile.all中获取所有对象ActiveRecord
  3. 非常感谢任何实施计数器的建议(即使不是基于 Redis 的)

-

class Profile < ActiveRecord::Base

  # To handle the profile counter
  include Redis::Objects
  counter :tviews

  # Associations

  belongs_to  :user

  # Other attributes
end

profile_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
4

1 回答 1

1

1)不,不是。查看它说的redis文档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)这里不是红宝石用户,但我认为不是。

3)你有几个选择

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

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

于 2014-03-06T16:06:00.253 回答