我是Redis的新手,并且已经将它与我的Ruby on Rails(Rails 2.3和Ruby 1.8.7)应用程序一起使用,使用redis gem将简单标记功能作为键值存储。我最近意识到我可以使用它来维护用户活动源。
问题是我需要在内存中标记数据(存储为key => Sets),这对于确定标记相关操作的结果非常重要,对于活动源,可以先在第一个中删除数据出基础。假设我为每个用户存储了X个活动
我是否有可能命名redis数据集并使其永久保留在内存中并使另一个暂时保留在内存中。当使用不相关的数据集需要在内存中具有不同的生存期时,一般方法是什么。
真的很感激任何帮助。
答案 0 :(得分:5)
您无需为此定义特定的命名空间。使用Redis,您可以使用EXPIRE命令按键设置密钥超时。
关键到期的一般政策在配置文件中定义:
# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory
# is reached? You can select among five behavior:
#
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# allkeys-lru -> remove any key accordingly to the LRU algorithm
# volatile-random -> remove a random key with an expire set
# allkeys->random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
#
出于您的目的,应设置volatile-lru政策。
你只需要在你想要变化的键上调用EXPIRE,然后让Redis逐出它们。但请注意,一旦触发超时,很难保证最旧的密钥将被逐出。更多解释here。
但是,对于您的特定用例,我不会使用密钥过期,而是尝试模拟上限集合。如果给定用户的活动供稿表示为对象列表,则很容易LPUSH活动对象,并使用LTRIM来限制列表的大小。您可以获得FIFO行为并免费控制内存消耗。
更新:
现在,如果您真的需要隔离数据,Redis有两种主要的可能性:
使用两个不同的数据库。 Redis数据库由整数标识,每个实例可以有几个。使用select command在数据库之间切换。数据库可用于隔离数据,但不能为它们分配不同的属性(例如过期策略)。
使用两个不同的实例。一个空的Redis实例是一个非常轻的过程。因此可以毫无问题地启动其中几个。它实际上是与Redis隔离数据的最佳和更具可扩展性的方式。每个实例都可以有自己的策略(包括驱逐策略)。客户端应该打开与实例一样多的连接。
但同样,您不需要隔离数据来实施驱逐政策要求。