【问题标题】:How to namespace keys on redis to avoid name collisions?如何在 redis 上命名键以避免名称冲突?
【发布时间】:2017-01-04 16:06:40
【问题描述】:

我想使用 redis 来存储我自己的一些键值对,但是我的一些模块已经在使用它。用于会话数据的 redis express 会话存储,以及用于套接字 io 的 redis 适配器。所以我的问题很简单,如何创建或指定数据库/命名空间来存储我自己的密钥而不会发生密钥冲突?我正在使用 node-redis 驱动程序。

【问题讨论】:

    标签: node.js redis namespaces node-redis


    【解决方案1】:

    方案一:将不同模块的数据存储在不同的Redis实例中

    最严格的隔离是将每个模块的数据存储在一个单独的 Redis 实例中,即一个单独的 Redis 进程中。

    方案二:将不同模块的数据存储在单个Redis实例的不同数据库中

    一个Redis实例可以有多个数据库,你可以在config文件中配置数据库的个数。默认有16个数据库。

    这些数据库以从零开始的数字索引命名。通过select command,您可以使用ith 数据库。选择后,任何后续命令都会对ith数据库进行操作。

    因此,如果为每个模块分配一个独立的数据库,就可以避免名称冲突。

    注意:此解决方案不适用于Redis ClusterRedis Cluster 只允许你使用 0th 数据库。

    解决方案 3:使用键前缀创建命名空间

    如果您的所有数据都必须存储在单个数据库中,您仍然可以使用 键前缀 隐式创建 命名空间。对于每个模块,该模块的所有数据都应具有相同的键模式:ModuleName:KeyName,即该模块的每个键具有相同的前缀:ModuleName

    由于每个模块都有不同的名称,因此这些模块之间不会有任何名称冲突:

    // Set keys for module1
    SET module1:key1 value
    SET module1:key2 value
    
    // Set keys for module2
    SET module2:key1 value
    SET module2:key2 value
    

    注意:此解决方案也适用于 Redis Cluster

    【讨论】:

    • 您将如何使用这种方法处理 Redis 搜索?
    • @quarks 我不熟悉 Redisearch。看来FT.CREATE 命令可以为要索引的键指定前缀。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    相关资源
    最近更新 更多