一旦发生特定事件,我希望能够在Ruby on Rails应用程序中使基于Ohm对象的全部内容到期。目前是否可以配合Redis + expires执行此操作?使用Ohm时,对象具有与之关联的多个键,包括索引等。我想确保所有东西都被正确清理了-这就是为什么我想知道是否存在官方支持的方法。

最佳答案

不幸的是,没有。 已经尝试解决这个难题,但是我见过的每一个都在Ohm数据集中留下了伪像。它们都不具有唯一的属性,据我所知,它们都使Ohm数据处于不一致状态。

一些例子:

  • ohm-expire gem
  • expiring.rb
  • ohm-expiring

  • 例如,当保存欧姆模型时,会将几个字段添加到Redis哈希,还将成员添加到Redis集。虽然您可以在整个哈希或集合上设置到期时间,但不能使Redis哈希的单个字段或集合的单个成员到期。整个哈希或集合都将过期。

    这是主要问题:如果这些集合和哈希值将过期,则将丢失模型上的整个索引或唯一属性的完整记录。因此,使用任何Ohm Expired Mixins时的一个常见问题是,即使主数据键已过期,对find的调用仍将返回索引中的记录,但哈希值为nil。而且,如果您在模型中指定了唯一属性,则即使数据本身已经过期,也永远不会在没有引发异常的情况下再次对该模型调用create,而不会引发异常。

    Redis中没有过期回调,因此当特定密钥过期时,无法触发删除哈希字段或设置成员的方法。有几个人要求允许哈希字段或设置成员在Redis问题列表上具有TTL,但是(相当合理地)所有这些都已用答案such as this关闭:



    例如,以下是欧姆源代码(ohm.rb, 651-699)的一些注释:
      # The base class for all your models. In order to better understand
      # it, here is a semi-realtime explanation of the details involved
      # when creating a User instance.
      #
      # Example:
      #
      #   class User < Ohm::Model
      #     attribute :name
      #     index :name
      #
      #     attribute :email
      #     unique :email
      #
      #     counter :points
      #
      #     set :posts, :Post
      #   end
      #
      #   u = User.create(:name => "John", :email => "[email protected]")
      #   u.incr :points
      #   u.posts.add(Post.create)
      #
      # When you execute `User.create(...)`, you run the following Redis
      # commands:
      #
      #   # Generate an ID
      #   INCR User:id
      #
      #   # Add the newly generated ID, (let's assume the ID is 1).
      #   SADD User:all 1
      #
      #   # Store the unique index
      #   HSET User:uniques:email [email protected] 1
      #
      #   # Store the name index
      #   SADD User:indices:name:John 1
      #
      #   # Store the HASH
      #   HMSET User:1 name John email [email protected]
      #
      # Next we increment points:
      #
      #   HINCR User:1:counters points 1
      #
      # And then we add a Post to the `posts` set.
      # (For brevity, let's assume the Post created has an ID of 1).
      #
      #   SADD User:1:posts 1
      #
    

    但是人们通常尝试使Ohm数据过期的方式是这样简单得多(无需操作唯一性或模型范围的索引):
      Ohm.redis.expire(object.key, @expire)
      Ohm.redis.expire("#{object.key}:_indices", @expire)
    

    总而言之,在Redis中对数据到期进行细粒度控制的最佳方法是使用诸如redis-rb之类的低级接口(interface)设计自己的存储方法。

    关于ruby-on-rails - 可以在Ohm for Ruby中使整个对象的内容过期吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10016719/

    10-10 02:01