Memcached 是一个高性能的分布式内存对象缓存系统,由LiveJournal的Brad Fitzpatrick开发,用于动态Web应用以减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。redis的作者,叫Salvatore Sanfilippo,来自意大利的西西里岛,居住在卡塔尼亚。目前供职于Pivotal公司。他使用的网名是antirez。
Redis和Memcache都是保存键值对的内存数据库,那么Memcache和Redis的区别是什么呢,下面我们将在以下几个方面进行比对。
1. 数据类型的支持
- Redis 6.0支持7种对象类型,包括:字符串(OBJ_STRING)、列表(OBJ_LIST)、集合(OBJ_SET)、有序集合(OBJ_ZSET)、哈希(OBJ_HASH)、模块(OBJ_MODULE)和消息队列(OBJ_STREAM);
- Memcache只支持k-v结构,但它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等;
2. 持久化的支持
- Redis两种持久化方式,分别是RDB持久化和AOF持久化,如果Redis宕机重启之后,Redis可以根据AOF文件进行恢复;
- Memcache不支持持久化功能,宕机重启之后,无法恢复;
3. 分布式的支持
- Redis在v3.0开始支持Redis集群,这样可以把Redis从单机扩展到集群,容量上也可以进行扩展;
- Memcache服务器端没有分布式功能,如果想实现分布式,可以通过客户端进行实现;
4. 键值对大小支持
- Redis的键值对中支持value的最大值是512M;
- Memcache一个value最大只支持1MB,key 最大250个字符;
5. 网络通信实现
- Redis的网络通信通过自己实现epoll、kqueu、/dev/poll等各个接口,可以在Linux、BSD、Solaris等操作系统上进行移植;
- Memcache的网络通信模块使用了libevent库,libevent封装了各个操作系统下的各种网络接口,方便进行程序移植;
6. 内存管理实现
- Redis的内存管理使用FaceBook开源的Jemalloc进行内存管理,Jemalloc的实现参考这里;
- Memcache使用Slab Allocation机制进行内存管理,Slab Allocation的机制很简单,按照预先规定的大小,将分配的内存分割成各种尺寸的chunk,并把尺寸相同的chunk分成组,分配的块可以重复利用,不释放到内存中。
7. 多线程的支持
- Redis 6.0开始支持多线程,通过在redis.conf配置文件中可以配置线程个数;
- Memcache也支持多线程,在memcache启动时,可以通过-t参数指定需要启动的线程个数;
8. 主从复制的支持
- Redis支持主从复制,并且支持哨兵机制,当master服务器不可用时,可以从slave服务器中选择一个服务器作为master继续提供服务;
- Memcache不支持主从复制,单机可靠性收到影响;
9. 使用场景
- 如果有持久方面的需求或对数据类型和处理有要求的应该选择redis;
- 如果简单的key/value 存储应该选择memcached;