Redis、Memcached

共同点

Memcached 和 Redis 都很类似:都是内存型数据库,数据保存在内存中,通过 TCP 直接存取,速度快,并发高,但数据类型有限,查询功能不强,一般用作缓存。

Memcached

优点

  • 可以利用多核优势,单实例吞吐量极高,可以达到几十万 QPS(取决于 key/value 的字节大小以及服务器硬件性能,日常环境中 QPS 高峰大约在4-6w左右)。
  • 适用于最大程度扛量,有效为服务器减压。
  • 支持直接配置为 Session handle。

缺点

  • 数据结构很简单单一,只支持简单的 key/value 数据结构,不像 Redis 可以支持丰富的数据类型。
  • 无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失。
  • 无法进行数据同步,不能将 MC 中的数据迁移到其他 MC 实例中。
  • 内存分配采用 Slab Allocation 机制管理内存,value 大小分布差异较大时会造成内存利用率降低,并引发低利用率时依然出现踢出等问题,需要用户注重 value设计。
  • 服务端原生不支持水平扩展,必须在客户端编写缓存分布策略来实现分布式缓存,并且由于无法进行数据同步,因此生产环境中出现单机故障时可能会影响部分业务运行。

Redis

优点

  • 支持多种数据结构,比如 string(字符串)、list(双向链表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基数估算)等。
  • 支持持久化操作,可以进行 aof 及 rdb 数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
  • 支持通过 Replication 进行数据复制,通过 master-slave 主从机制,可以实时进行数据的同步复制,支持多级复制和增量复制, master-slave 机制是 Redis 进行 HA 的重要手段。
  • 单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
  • 支持 pub/sub 消息订阅机制,可以用来进行消息订阅与通知。
  • 支持简单的事务需求,但业界使用场景很少,并不成熟。

缺点

  • Redis 只能使用单线程,性能受限于 CPU 性能,故单实例 CPU 最高QPS才可能达到每秒5-6w(取决于数据结构,数据大小以及服务器硬件性能,日常环境中 QPS 高峰大约在1-2w左右)。
  • 支持简单的事务需求,但业界使用场景很少,并不成熟,既是优点也是缺点。
  • Redis 在 string 类型上会消耗较多内存,可以使用 dict(hash表)压缩存储以降低内存耗用。

总结

  • Memcached 是多线程非阻塞IO复用的网络模型;Redis 使用单线程的IO复用模型。
  • Memcached 使用预分配的内存池的方式;Redis 使用现场申请内存的方式来存储数据。
  • Memcached 的服务器端互相完全独立;Redis 计划在服务器端内建对集群的支持。
  • Memcached 可以使用多核;Redis 只使用单核。
Author

Zoctan

Posted on

2018-07-22

Updated on

2023-03-14

Licensed under