缓存数据库选型 -- Redis vs Memcache

2018-09-11 14:27:48   最后更新: 2018-09-11 14:27:48   访问数量:43




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 命令参考

丰富的数据结构让 redis 使用起来非常灵活,但通常来说,除非业务形态过于复杂,否则 memcache 的 k-v 存储也是完全可以满足需求的

但对于数据去重、通过 redis 实现消息队列等复杂的工作,redis 显然更胜一筹

 

我们曾经介绍过 redis 的两种持久化方式 -- AOF 与 RDB

redis 持久化方式 -- AOF & RDB

优于 RDB 的持久化方式是定时执行的,两次执行过程期间一旦发生故障,那么就会存在未持久化数据,而 AOF 持久化方式则会降低效率

两种持久化方式,无论是哪一种,都会在数据量很大的情况下降低服务器的性能

所以,虽然 redis 支持持久化到硬盘,但也绝不应该将 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 每次都临时申请空间,也可能造成内存空间碎片的产生

 

swap

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 事务特性令 redis 的使用更加灵活,而结合 lua 脚本,则让这一特性变得异常强大

 

总的来说,redis 作为缓存服务器的后起之秀,可以说在诸多方面领先于 memcache,也确实逐渐显现出代替 memcache 的趋势

但是,memcache 的性能与简单的优势仍然是不可忽略的,具体选择哪种解决方案仍然必须要结合具体的使用场景而言,不能够一概而论

 






技术帖      技术分享      缓存      redis      数据库      nosql      cache      memcache      kv      菲关系型数据库     


京ICP备15018585号