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 的那一刻,我会说同时使用它们。