2016-01-24 59 views
0

我使用Redis的作为客户端的缓存机制。 用C#使用stackexchange.redis实现。 我将快照配置为“保存5 1”并打开了rdbcompression。 每次需要添加数据时,RDB机制都会将rdb文件加载到内存中。 问题是当你有一个相当大的RDB文件,并且它一次加载到内存中。它扼杀了平均端点的内存,磁盘和CPU。Redis的快照超载内存

有没有一种方法,而无需加载整个文件到内存空间更新RDB文件? 也欢迎任何其他解决方案降低内存和CPU的负载。

+2

这似乎是完全的服务器端;删除SE.Redis标签,因为它使用什么客户端库无关紧要。 –

+1

@MarcGravell这似乎完全是MSFT-fork ...你认为应该有一个'redis-microsoft'标签吗? –

+0

@MarcGravell我同意Itamar。我们正在使用微软的分支,如果你可以添加标签,我会很高兴,因为我没有足够的信誉。 –

回答

0

我们使用RDB解决了这个问题,现在使用AOF完全。 我们已经通过减少自动AOF重写百分比,并且还限制了自动AOF重写分钟大小到所需的大小降低存储器峰。

3

RDB机制每次需要追加数据时都会将rdb文件加载到内存中。

这不是开源Redis的服务器执行(其它变体,如MSFT叉,行为可能不同) - RDBS通过用叉形过程复制存储的内容,以磁盘创建。转储的文件从不加载,除非用于恢复。保存过程中增加的内存使用量取决于由于写入时复制(COW)机制而正在进行转储时执行的写入数量。

此外,任何其他解决方案,降低内存和CPU的负载是值得欢迎的。

根据您的要求和预算,有几种方法可以解决这个问题。其中包括:

  • 同时使用RDB和AOF进行数据持久性,从而减少转储的频率。
  • 将持久性委托给从实例。
  • 分片数据库和进行级联转储。
+0

我们使用MSFT fork for windows。为了更清楚一点,我们使用客户端端点上的redis-server作为缓存机制。我现在正在尝试的只是使用AOF作为持久性机制,这似乎解决了我的记忆痛苦。 但据我所知,没有办法限制AOF文件的大小。 有没有办法在被驱逐的数据和aof文件之间建立某种关联。意思是使用lru机制驱逐的任何数据都不应该保留在磁盘上。 磁盘上的内存镜像不会超出分配给redis的内存大小。 –