我有一组非常大的密钥,200M密钥,值很小,<100字节,用于存储,我正在尝试使用Redis。问题是我有10个Redis DB来分割密钥,但是目前我在一台服务器上有10个Redis DB。通过Redis数据库,我的意思是使用SELECT
。从我的计算中看起来我将要耗尽内存。我想我需要超过4TB的内存!我有什么选择?首先,我的计算是基于10000个密钥,100个字节值占用220MB RAM(这是我发现的表格。)所以简单地放(2*10^8 / 10^4) * 220MB = 4.4TB
。
如果我的计算看起来正确,我的选择是什么?我在不同帖子上看到Redis VM不再是一个选项。我可以使用Redis群集吗?这仍然需要太多的服务器才能实用。
我知道我可以切换到另一个数据库,但我希望这是最后的选择。
答案 0 :(得分:4)
首先,使用共享数据库(即SELECT
命令)不是推荐的做法,因为所有这些数据库基本上都由相同的Redis进程管理。最好有10个单独的Redis进程(即使在同一台服务器上)以避免争用(更多信息here)。
接下来,有一些方法可以减少数据库的内存占用。例如,您可以执行客户端压缩(请参阅here)或考虑其他优化,例如使用Hashes来保留多个值(如here所述)。
也就是说,Redis服务器最终受主机提供的RAM量的限制。达到该限制后,您需要对数据库进行分片并使用Redis群集。由于您已经在使用多个数据库,因此您的代码应该已经在某种程度上已经兼容,因此不应该构成一个很大的挑战。可以使用以下三种方法之一完成分片:客户端,代理或Redis群集。客户端分片可以在您的代码中实现,也可以由您正在使用的Redis客户端实现(如果您使用的客户端库支持该分片)。预计Redis Cluster (v3)将在不久的将来发布,并且已经有一个稳定的候选版本。对于基于代理的分片,有几种开源解决方案,包括Twitter's twemproxy,Netflix's dynomite和codis。有关分片和分区的其他信息,请参见here。
免责声明:我在Redis Labs工作。最后,AFAIK只有一个Redis-as-a-Service提供商,它已经为集群Redis提供了内置支持。 Redis Labs的Redis Cloud是一项完全托管的服务,可以无缝扩展到任何所需的容量。我们的群集既支持'{}'主题标签以及RegEx分片,也可以找到here的更多信息。
答案 1 :(得分:0)
您可以将LMDB与Dynomite一起使用来存储超出内存容量的数据。 LMDB使用磁盘和内存来存储数据。 Dynomite使LMDB得以分发。
我们用这个组合完成了一个POC,它们很好地协同工作。
有关详细信息,请查看我们的未解决问题: https://github.com/Netflix/dynomite/issues/254