如何在 Redis 上命名空间键以避免名称冲突?

How to namespace keys on redis to avoid name collisions?

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

方案一:不同模块的数据存储在不同的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