Redis对象 - 从数据库获取所有对象 - 配置文件视图计数器

时间:2014-03-06 04:35:20

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

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

该项目使用

  • Rails 4.0.2
  • Redis Objects gem
  • 为了演示,我希望将Heroku与Redis To Go插件
  • 一起使用
  • 目前该计数器基于PG(活动记录)
  • Redis Objects已与AR一起使用以计算(但如何保存到AR配置文件表?)

需要/想到实现

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

问题

  • 我无法弄清楚如何查询Redis DB以查找其中的所有Profile对象。

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

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

问题

  1. 使用keys来查找密钥,然后使用合理的(在效率方面)对象,可能每天在计划任务中使用一次。
  2. 有没有办法直接从Redis数据库中获取所有Profile个对象,就像我们在Profile.all中可以ActiveRecord一样?
  3. 高度赞赏任何实施计数器的建议(即使不是基于Redis)
  4. -

    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 个答案:

答案 0 :(得分: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的单线程特性,它对执行键命令的时间没有响应。

2)这里不是红宝石用户,但我认为不是。

3)你有几个选择

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

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