一旦发生特定事件,我希望能够在Ruby on Rails应用程序中使基于Ohm对象的全部内容到期。目前是否可以配合Redis + expires执行此操作?使用Ohm时,对象具有与之关联的多个键,包括索引等。我想确保所有东西都被正确清理了-这就是为什么我想知道是否存在官方支持的方法。
最佳答案
不幸的是,没有。 已经尝试解决这个难题,但是我见过的每一个都在Ohm数据集中留下了伪像。它们都不具有唯一的属性,据我所知,它们都使Ohm数据处于不一致状态。
一些例子:
例如,当保存欧姆模型时,会将几个字段添加到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/