Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 跟进[按数据库分割Redis]_Performance_Redis_Key_Time Complexity - Fatal编程技术网

Performance 跟进[按数据库分割Redis]

Performance 跟进[按数据库分割Redis],performance,redis,key,time-complexity,Performance,Redis,Key,Time Complexity,这是一个后续问题。 我最初询问了一个redis实例中不同数据库中redis键操作的时间复杂性。我问这个问题的原因是因为我试图实现一个缓存,其中有x多段密钥,每个密钥可能有y实际数据实例,从而产生xy总密钥 但是,我希望支持对主键的通配符搜索,并且在redis中,似乎唯一实现的对键的通配符查询是keys命令,不鼓励使用该命令。在我看来,将x键放在一个单独的数据库中是一个不错的折衷办法,在这个数据库中,键的数量越少,键的操作性能越好 有人能提出更好的选择吗 谢谢。我仍然认为在Redis中使用密钥是不

这是一个后续问题。 我最初询问了一个redis实例中不同数据库中redis键操作的时间复杂性。我问这个问题的原因是因为我试图实现一个缓存,其中有x多段密钥,每个密钥可能有y实际数据实例,从而产生xy总密钥

但是,我希望支持对主键的通配符搜索,并且在redis中,似乎唯一实现的对键的通配符查询是keys命令,不鼓励使用该命令。在我看来,将x键放在一个单独的数据库中是一个不错的折衷办法,在这个数据库中,键的数量越少,键的操作性能越好

有人能提出更好的选择吗


谢谢。

我仍然认为在Redis中使用密钥是不可伸缩的,不管你能用什么聪明的方案来解决线性复杂性

分区是这种方案之一,在传统的RDBMS中通常使用分区来降低在平面表上进行表扫描的成本。您的想法实际上是将此概念改编为Redis

但与提供此功能的传统RDBMS(Oracle、MySQL等)相比有一个重要区别:Redis是一个单线程事件循环。因此,扫描不能与任何其他活动同时进行(例如,为其他客户端连接提供服务)。当Redis扫描数据时,所有连接都会被阻止

您必须设置大量的分区(即数据库)才能获得良好的性能。大约是全局密钥数的1/1000或1/10000。这就是它不可伸缩的原因:Redis不是为处理如此多的数据库而设计的。您可能会遇到在所有数据库上迭代的内部机制问题。以下是从源代码中提取的列表:

  • 自动灰化
  • 项目到期管理
  • 数据库状态日志记录(每5秒一次)
  • 信息命令
  • 最大内存管理
您可能必须限制数据库的数量,这也限制了可伸缩性。如果您设置1000个数据库,那么对于100万个项目来说,它可以正常工作,对于1000万个项目来说,它的速度会慢一些,对于100万个项目来说,它是不可用的

如果您仍然希望坚持使用线性扫描来实现此功能,那么其他支持并发扫描的商店(如MySQL、MongoDB等)将为您提供更好的服务。对于其他商店,关键点将是以一种有效的方式实现商品过期

如果您真的必须使用Redis,您可以轻松地对数据进行分段,而无需依赖多个数据库。例如,您可以使用我描述的方法。使用此策略,以增量方式检索密钥列表,搜索实际上在客户端完成。主要的好处是可以有大量的分区,这样Redis就不会阻塞

现在,AFAIK no storage engine提供了使用任意正则表达式高效搜索数据的功能(即避免线性扫描)。然而,这个特性是由一些搜索引擎提供的,通常使用n-gram索引

以下是Russ Cox关于它的一篇好文章:

这种索引机制可能适用于Redis(您可以使用Redis来存储密钥的三元索引),但它代表了要编写的大量代码

您还可以想象将正则表达式限制为前缀搜索。例如,U:SMITH:(*)实际上是一个前缀为U:SMITH:

在这种情况下,您可以使用zset索引键,并在检索到您感兴趣的键范围后在客户端执行线性搜索。zset中项目的分数是从客户端的键计算出来的,因此分数顺序对应于键的字典顺序


有了这样的zset,就可以通过zscore和zrange命令的组合检索必须逐块扫描的密钥范围。结果是要扫描的密钥数量受到限制(由前缀决定),搜索发生在客户端,并且对Redis并发模型很友好。缺点是复杂性(特别是处理项目过期)和网络带宽消耗。

我仍然认为使用密钥在Redis中是不可扩展的,不管你能采用什么聪明的方案来解决线性复杂性

分区是这种方案之一,在传统的RDBMS中通常使用分区来降低在平面表上进行表扫描的成本。您的想法实际上是将此概念改编为Redis

但与提供此功能的传统RDBMS(Oracle、MySQL等)相比有一个重要区别:Redis是一个单线程事件循环。因此,扫描不能与任何其他活动同时进行(例如,为其他客户端连接提供服务)。当Redis扫描数据时,所有连接都会被阻止

您必须设置大量的分区(即数据库)才能获得良好的性能。大约是全局密钥数的1/1000或1/10000。这就是它不可伸缩的原因:Redis不是为处理如此多的数据库而设计的。您可能会遇到在所有数据库上迭代的内部机制问题。以下是从源代码中提取的列表:

  • 自动灰化
  • 项目到期管理
  • 数据库状态日志记录(每5秒一次)
  • 信息命令
  • 最大内存管理
您可能必须限制数据库的数量,这也限制了可伸缩性。如果您设置1000个数据库,那么对于100万个项目来说,它可以正常工作,对于1000万个项目来说,它的速度会慢一些,对于100万个项目来说,它是不可用的

如果您仍然想坚持使用线性扫描来实现此功能,您需要