Redis命名基础

Sid*_*Sid 1 ruby namespaces redis

我是Redis的新手,并且已经将它与我的Ruby on Rails(Rails 2.3和Ruby 1.8.7)应用程序一起使用,使用redis gem将简单标记功能作为键值存储.我最近意识到我可以使用它来维护用户活动源.

问题是我需要在内存中标记数据(存储为key => Sets),这对于确定标记相关操作的结果非常重要,对于活动源,可以先进先出的方式删除数据.假设我为每个用户存储了X个活动

我是否有可能命名redis数据集,并使其永久保留在内存中,让另一个暂时保留在内存中.当使用不相关的数据集需要在内存中具有不同的生存期时,一般方法是什么.

真的很感激任何帮助.

Did*_*zia 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
#
Run Code Online (Sandbox Code Playgroud)

出于您的目的,应设置volatile-lru策略.

你只需要在你想要变化的键上调用EXPIRE,然后让Redis逐出它们.但请注意,一旦触发超时,很难保证最旧的密钥将被逐出.这里有更多解释.

但是,对于您的特定用例,我不会使用密钥到期,而是尝试模拟上限集合.如果给定用户的活动源表示为对象列表,则很容易LPUSH活动对象,并使用LTRIM限制列表的大小.您可以获得FIFO行为并免费控制内存消耗.

更新:

现在,如果您真的需要隔离数据,Redis有两种主要的可能性:

  • 使用两个不同的数据库 Redis数据库由整数标识,每个实例可以有几个.使用select命令在数据库之间切换.数据库可用于隔离数据,但不能为它们分配不同的属性(例如,过期策略).

  • 使用两个不同的实例.一个空的Redis实例是一个非常轻的过程.因此可以毫无问题地启动其中几个.它实际上是与Redis隔离数据的最佳和更具可扩展性的方式.每个实例都可以有自己的策略(包括驱逐策略).客户端应该打开与实例一样多的连接.

但同样,您不需要隔离数据来实施驱逐策略要求.