到目前为止,我一直在使用Dalli进行缓存,今天我遇到了Redis -Store。
我想知道我应该切换到redisstore。我的应用程序已经使用redis来处理某些东西,所以我有一个redis服务器,它相当大(在资源方面),我还有另一个memcached服务器。因此,如果我在哪里切换到redis-store,那就意味着我可以删除memcached服务器(减少维护服务器以节省成本)。
是否有人对这两种解决方案进行了比较。
答案 0 :(得分:20)
Redis既可以用作缓存,也可以用作永久存储,但如果你尝试混合两者,你最终可能会遇到“有趣的问题”。
当你有memcached时,你有最大的进程内存量,所以当memcached被填满时,它会自动删除最近最少使用的条目,为新条目腾出空间。
您可以将Redis配置为具有该行为,但如果您使用Redis进行持久存储,则不希望这样做,因为在这种情况下,您可能会丢失旨在持久存储的密钥。
因此,如果您使用Redis的持久存储,则需要有两个不同的Redis进程:一个用于持久密钥,一个用于缓存。当然,您可以始终只有一个进程并为每个缓存项设置到期时间,但没有人会向您保证在它们到期之前没有达到内存限制并且您丢失了数据,因此在实践中您需要两个进程。此外,如果您为持久数据设置主/从配置并在同一服务器上存储缓存,则基本上是在浪费RAM,因此需要单独的进程。
关于性能,redis和memcached都非常高效,并且在不同的测试中,它们在获取/提取数据时处于相同的范围,但是当你只需要缓存时,memcached会更好。
为什么会这样?首先,由于memcached只有一个任务,即存储键/值,因此在存储元数据时没有任何开销。另一方面,Redis提供不同的数据结构,因此它存储了每个密钥的更多元数据。这方面的一个例子是:在Redis中将数据存储在散列上而不是使用单独的密钥要“更便宜”。你没有在memcached上得到任何这个,因为只有一种类型的数据。这意味着在服务器中使用相同数量的内存,可以在memcached上存储比在redis上更多的数据。如果你有一个相对较小的安装你并不在乎,但是当你开始看到增长的那一刻,相信我你会想要控制这些数据。
所以,就像我喜欢Redis一样,我更喜欢为我的缓存需求而memcached,以及我的持久存储/临时存储/队列需求的redis。我仍然使用redis作为“缓存”,但不是临时缓存,而是作为查找缓存来节省更昂贵的存储读取。例如,我在Redis上保留用户ID和昵称之间的映射。我永远不会过期这些映射,所以Redis是一个完美的地方。
如果您正在处理少量数据,那么您可能有理由为所有事情使用单一技术,但是当您开始增长几百MB时,我会说同时使用这两种数据他们。