2个Redis实例:作为缓存和持久数据存储

时间:2014-10-19 16:39:22

标签: caching redis

我想设置2个Redis实例,因为我对要存储在Redis中的数据有不同的要求。虽然我有时不介意丢失一些主要用作缓存数据的数据,但我想避免在某些情况下丢失一些数据,例如当我使用python RQ存储到Redis中要执行的作业时。

我在下面提到了实现这一目标的主要设置。

你怎么看?

我忘了重要的事吗?

1)Redis作为缓存

# Snapshotting to not rebuild the whole cache if it has to restart
# Be reasonable to not decrease the performances
save 900 1
save 300 10
save 60 10000

# Define a max memory and remove less recently used keys
maxmemory X  # To define according needs
maxmemory-policy allkeys-lru
maxmemory-samples 5

# The rdb file name
dbfilename dump.rdb

# The working directory.
dir ./

# Make sure appendonly is disabled
appendonly no

2)Redis作为持久性数据存储区

# Disable snapshotting since we will save each request, see appendonly
save ""

# No limit in memory
# How to disable it? By not defining it in the config file?
maxmemory

# Enable appendonly
appendonly yes
appendfilename redis-aof.aof
appendfsync always # Save on each request to not lose any data
no-appendfsync-on-rewrite no

# Rewrite the AOL file, choose a good min size based on the approximate size of the DB?
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 32mb

aof-rewrite-incremental-fsync yes

aof-load-truncated yes

来源:

2 个答案:

答案 0 :(得分:4)

我认为您的持久性选项过于激进 - 但主要取决于数据的性质和数量。

对于缓存,使用RDB是个好主意,但请记住,根据数据量,将内存内容转储到磁盘上会产生成本。在我的系统上,Redis可以以400 MB / s的速度写入内存数据,但请注意,数据可能(或可能不)被压缩,可能(或可能不)使用密集数据结构,因此您的里程会有所不同。使用您的设置,支持大量写入的缓存将每分钟生成一次转储。您必须检查您的音量,转储持续时间远低于该分钟(6-10秒就好了)。实际上,我建议只保存900 1并删除其他保存行。甚至每15分钟一次转储也可能被认为太频繁了,特别是如果你的SSD硬件会逐渐耗尽。

对于持久性存储,您还需要定义dir参数(因为它还控制AOF文件的位置)。除非吞吐量非常低,否则appendfsync always选项对于大多数用途而言都是过度杀伤且速度太慢。你应该把它设置为everysec。如果即使在系统崩溃的情况下也不能丢失一点数据,那么使用Redis作为存储后端并不是一个好主意。最后,您可能必须将auto-aof-rewrite-percentage和auto-aof-rewrite-min-size调整为Redis实例必须维持的写入吞吐量级别。

答案 1 :(得分:2)

我完全赞同@Didier--这更像是一个补充而不是一个完整的答案。

首先请注意Redis提供可调持续性 - 您可以使用RDB和/或AOF。虽然您选择将RDB用于持久性缓存非常有意义,但我建议您考虑将两者用于持久性存储。这将允许您基于快照(即备份)进行时间点恢复,以及使用AOF进行最后一次记录操作的崩溃后恢复。

对于持久性商店,您希望将maxmemory设置为0(如果在conf文件中注释掉,则为默认值)。当设置为0时,Redis将使用尽可能多的内存,因为操作系统将最终提供,因此随着数据集的增长,您将遇到操作系统将其终止以释放内存的情况(这通常发生在您最不期望的时候; ))。相反,您应该使用一个真实值,该值基于服务器具有足够的操作系统填充量的RAM量。例如,如果您的服务器有16GB的RAM,根据经验,我限制Redis使用超过14GB。

但是有一个问题。因为您已经阅读了有关Redis的所有信息。持久性,你可能还记得Redis forks将数据写入磁盘。在子进程期间,分叉可以使内存消耗(分叉副本+更改)增加一倍以上。执行所以你需要确保你的服务器有足够的可用内存来容纳,如果你使用数据持久性。另请注意,您应该在maxmemory计算中考虑其他潜在的内存消耗因素,例如复制和客户端缓冲区,具体取决于您和应用程序使用Redis的方式/方式。