memcache 和 redis 是目前使用频率最高的两个缓存服务器的选型,各公司也常常在面试中问到二者的区别。 虽然在实际的使用中,有着用 redis 取代 memcache 的趋势,但是二者究竟有什么区别呢?本文就来详细介绍一下。
memcache 与 redis 主要有以下区别: 1. 数据结构 — memcache 只支持基本的 k-v 结构,redis 支持六大数据结构 2. 持久化 — memcache 不支持持久化,redis 支持 3. 集群 — memcache 不支持集群,redis 支持集群,主从复制、读写分离,以及集群管理工具 4. 存储内容限制 — memcache 限制 value 最大存储 1MB,redis 没有限制 5. 执行效率 — memcache 执行效率优于 redis 6. 线程模型 — memcache 是多线程模型,redis 是但线程模型
redis 拥有的六种基本数据结构: 丰富的数据结构让 redis 使用起来非常灵活,但通常来说,除非业务形态过于复杂,否则 memcache 的 k-v 存储也是完全可以满足需求的。 但对于数据去重、通过 redis 实现消息队列等复杂的工作,redis 显然更胜一筹。
我们曾经介绍过 redis 的两种持久化方式 — AOF 与 RDB。 优于 RDB 的持久化方式是定时执行的,两次执行过程期间一旦发生故障,那么就会存在未持久化数据,而 AOF 持久化方式则会降低效率。 两种持久化方式,无论是哪一种,都会在数据量很大的情况下降低服务器的性能。 所以,虽然 redis 支持持久化到硬盘,但也绝不应该将 redis 用于数据的固化存储。
redis 持久化通常是为了在 redis 服务宕机重启以后,内存里能够有热数据用于快速恢复,而不是瞬间将流量全部打到后端存储服务器。 但是,业务服务一定需要注意的是在重启后 redis 中的数据可能是与后端数据库中的数据不一致的。 因此,通常只有只读场景,或者允许短时间不一致的业务场景,可以尝试开启 redis 的持久化功能。 而大部分情况下,其实 redis 的持久化功能并非必要。
redis3.0 版本以后支持 cluster 特性,它包含: 1. 节点自动发现 2. master 自动选举 3. 在线分片 4. 集群管理 5. ASK 转向/MOVED 转向机制
如图所示,redis 集群中所有节点都是彼此互联的,内部使用二进制协议优化传输速度和带宽。 节点的 fail 是通过集群中超过半数的节点检测失效时才生效的。 客户端与 redis 节点直连,不需要 proxy,连接集群中的任意节点。
redis 集群对于用户来说使用非常简单,与使用单一 redis server 并没有明显区别,但其强大的集群功能可以让缓存的可用性和负载能力得以显著提升,官方提供的 sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入。 但是,大部分场景下,redis 作为缓存服务器,可用性要求并没有那么高。 一旦不可用,即相当于 cache miss,通过直接从后端数据库服务器读取数据是完全可以接受的。 同时,redis 不支持水平扩展,如果业务严重依赖 redis 集群,在业务量上升到一定程度,如何扩展 redis 集群将会是一个问题。
memcache 的执行效率由于 redis 的原因是多方面的。
memcache 通过预分配内存池管理内存,当需要申请空间时,如果内存池充足,则不需要通知系统内核分配内存。 这在很大程度上节省了内存分配的时间,同时,redis 每次都临时申请空间,也可能造成内存空间碎片的产生。
memcache 将所有数据都存储在内存中,而 redis 有自己的 VM 机制,一旦数据超量,则会引发 swap,把冷数据刷到硬盘上,但他是自己实现的 swap 置换,既不是操作系统 4K/page 为单位的置换,也并不是置换到操作系统的 swap 区域中。 redis swap 的过程性能显著低于内存操作,因此大数据量的情况下,memcache 性能要显著优于 redis。
redis 是单线程模型,无法利用多核 CPU 提升性能和吞吐量。 而 memcache 是多线程模型,主线程监听 fd,worker 线程接受请求,执行读写操作。 显然 memcache 的模型会更快一些。
在实际使用中,redis 由于其 单线程的特性,可以有更为灵活的使用方式。 例如作为分布式集群的计数器、分布式锁等。
我们曾经系统介绍过 redis 事务与 lua 脚本的编写 redis 事务特性令 redis 的使用更加灵活,而结合 lua 脚本,则让这一特性变得异常强大。
总的来说,redis 作为缓存服务器的后起之秀,可以说在诸多方面领先于 memcache,也确实逐渐显现出代替 memcache 的趋势。 但是,memcache 的性能与简单的优势仍然是不可忽略的,具体选择哪种解决方案仍然必须要结合具体的使用场景而言,不能够一概而论。