【问题标题】:Redis namespacing basicsRedis 命名空间基础知识
【发布时间】:2012-03-17 03:58:35
【问题描述】:

我对 Redis 非常陌生,并且一直将它与我的 Ruby on Rails(Rails 2.3 和 Ruby 1.8.7)应用程序一起使用,使用 redis gem 来实现简单的标记功能作为键值存储。我最近意识到我也可以使用它来维护用户活动提要。

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

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

非常感谢您对此的任何帮助。

【问题讨论】:

    标签: ruby namespaces redis


    【解决方案1】:

    您不需要为此定义特定的命名空间。使用 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 隔离数据的最佳且更具可扩展性的方式。每个实例都可以有自己的策略(包括驱逐策略)。客户端应该打开与实例一样多的连接。

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

    【讨论】:

    • 感谢 Didier,但有没有一种方法可以将用于标记的键与用于活动源的键分开。有什么办法可以防止这些密钥通过任何过期策略过期。在处理两个完全不相关的独立数据集时,如何使用 Redis。
    • 我的意思是:您不必将它们分开。只需在应该过期的那些上使用 EXPIRE 命令。现在,如果您真的想隔离数据,您有两种选择:不同的数据库或不同的实例。我更新了我的答案。
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 2018-05-25
    • 2014-11-28
    相关资源
    最近更新 更多