Redis中的命名空间是什么?

58

在Redis中是否可以创建命名空间?

根据我发现的信息,所有全局命令(计数、删除所有)都会作用于所有对象。有没有一种方法可以创建子空间,以便这些命令在上下文中被限制?

我不希望为此目的设置不同的Redis服务器。

我认为答案是“否”,想知道为什么没有实现这个功能,因为它似乎是一个有用的功能,而没有太多开销。

3个回答

40
一个Redis服务器可以处理多个编号的数据库。默认情况下,我认为它提供了32个数据库,您可以使用-n选项访问它们,该选项用于redis-cli shell脚本命令以及连接参数的类似选项或使用其连接对象上的"select()"方法。(在这种情况下,.select()是Python Redis模块的方法名称...我假设其他库和接口的命名方式类似。)
在Redis服务器守护程序的配置文件中,有一个选项来控制您想要的独立数据库数量。我不知道上限是多少,并且似乎没有办法动态更改它(换句话说,似乎必须关闭并重新启动服务器才能添加其他数据库)。此外,似乎没有办法将这些数据库编号与任何名称相关联,也没有办法对它们施加单独的ACL或甚至不同的密码。当然,Redis也是无模式的。

7
命名空间不是数据库,数据库由数字(0到15)表示。命名空间用于添加前缀。 - kalelc
4
由于Redis文档中未定义"namespace"一词,因此我认为您对该术语的使用并没有比我更权威。我澄清了在给定Redis服务器上的每个"数据库"都是独立的"命名空间"(相同的键不会发生冲突)。显然,您可以创建任意前缀并将其视为"命名空间"--但这不是Redis中任何特别支持的功能;只是使用它的惯例。 - Jim Dennis
感谢Jim的澄清,有时在Rails中发现Redis命名空间会让人感到困惑。 - kalelc
@JimDennis - 由于某种原因,使用Ruby Gems时,不同数据库中具有相同名称的命名空间会发生冲突。当然这很奇怪。我会看看是否能找到任何新的东西。 - Sachin
1
我的错。我使用了自定义的 $redis 变量,并传递了新创建的 Redis.new 参数(这当然不尊重任何 Rails 配置)。 - Sachin

8

如果你使用Node,ioredis 提供了透明键前缀功能,它通过在每个命令的键之前添加给定的字符串来实现。它的工作方式与 Ruby 的 redis-namespace 相同。这种客户端方法仍将所有的键放入同一个数据库中,但至少添加了一些结构,你也不需要使用多个数据库或服务器。

var fooRedis = new Redis({ keyPrefix: 'foo:' });
fooRedis.set('bar', 'baz');  // Actually sends SET foo:bar baz

2

我不是很清楚,但我不理解它们在技术上如何工作。我认为服务器API不支持它们。 - ripper234
7
这不过是提供一种在 Redis 访问对象/句柄周围提供大多数透明包装的方法。使用这些方法只需在代码中使用的任何键名称前加上“命名空间”前缀,以便在任何引用该“命名空间”中的任何对象时都能生效。正如你所猜测的那样,在服务器端没有对它们进行隔离,它们仅存在于惯例中,甚至是内部标准。 - Jim Dennis
3
redis-namespace 库的顶部,它告诉你这是一个简陋的命名空间,它只会在每个键名前加上 "ns:*" 前缀。 - Mirek Rusin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接