Redis 和 Memcached 都是基于内存的数据存储系统。Memcached 是高性能分布式内存缓存服务,其本质上就是一个内存 key-value 数据库。Redis 是一个开源的 key-value 存储系统。与 Memcached 类似,Redis 将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。那么,Memcached 与 Redis 有什么区别呢?
1、数据操作不同
与 Memcached 仅支持简单的 key-value 结构的数据记录不同,Redis 支持的数据类型要丰富得多。Memcached 基本只支持简单的 key-value 存储,不支持枚举,不支持持久化和复制等功能。Redis 支持服务器端的数据操作相比 Memcached 来说,拥有更多的数据结构和并支持更丰富的数据操作,支持 list、set、sorted set、hash 等众多数据结构,还同时提供了持久化和复制等功能。而通常在 Memcached 里,使用者需要将数据拿到客户端来进行类似的修改再 set 回去,这大大增加了网络 IO 的次数和数据体积。在 Redis 中,这些复杂的操作通常和一般的 GET/SET 一样高效。所以,如果需要缓存能够支持更复杂的结构和操作, Redis 会是更好的选择。
2、内存管理机制不同
在 Redis 中,并不是所有的数据都一直存储在内存中的。这是和 Memcached 相比一个最大的区别。当物理内存用完时,Redis 可以将一些很久没用到的 value 交换到磁盘。Redis 只会缓存所有的 key 的信息,如果 Redis 发现内存的使用量超过了某一个阀值,将触发 swap 的操作,Redis 根据 “swappability = agelog (sizein_memory)” 计算出哪些 key 对应的 value 需要 swap 到磁盘。然后再将这些 key 对应的 value 持久化到磁盘中,同时在内存中清除。这种特性使得 Redis 可以保持超过其机器本身内存大小的数据。
而 Memcached 默认使用 Slab Allocation 机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的 key-value 数据记录,以完全解决内存碎片问题。
从内存利用率来讲,使用简单的 key-value 存储的话,Memcached 的内存利用率更高。而如果 Redis 采用 hash 结构来做 key-value 存储,由于其组合式的压缩,其内存利用率会高于 Memcached。
3、性能不同
由于 Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。而在 100k 以上的数据中,Memcached 性能要高于 Redis,虽然 Redis 也在存储大数据的性能上进行了优化,但是比起 Memcached,还是稍有逊色。
4、集群管理不同
Memcached 是全内存的数据缓冲系统,Redis 虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。
Memcached 本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现 Memcached 的分布式存储。相较于 Memcached 只能采用客户端实现分布式存储,Redis 更偏向于在服务器端构建分布式存储。
**小结:Redis _和 Memcached 哪个更好?*
Redis 更多场景是作为 Memcached 的替代者来使用,当需要除 key-value 之外的更多数据类型支持或存储的数据不能被剔除时,使用 Redis 更合适。如果只做缓存的话,Memcached 已经足够应付绝大部分的需求,Redis 的出现只是提供了一个更加好的选择。总的来说,根据使用者自身的需求去选择才是最合适的。
It’s not uncommon to hear Redis compared to memcached, which is a very high-
performance, key-value cache server. Like memcached, Redis can also store a mapping
of keys to values and can even achieve similar performance levels as memcached. But the similarities end quickly—Redis supports the writing of its data to disk automatically
in two different ways, and can store data in four structures in addition to plain string keys
as memcached does. These and other differences allow Redis to solve a wider range of
problems, and allow Redis to be used either as a primary database or as an auxiliary data-
base with other storage systems.