Redis 和 Memcached 的区别

来源:互联网 发布:大麦户源码下载 编辑:程序博客网 时间:2024/05/01 22:15

Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并发支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再Set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis是不错的选择。

内存使用效率对比:使用简单的key-value存储的话,Memcached的内存效率更高,而如果Redis采用Hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

性能对比:由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能进行了优化,但是比起Memcached,还是稍有逊色。

之所以二者相比会产生以上的差别,原因在于:

1、数据类型支持不同

与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富的多。最为常用的数据类型主要有五种:String、Hash、List、Set和Sorted Set。Redis内部使用一个RedisObject对象来表示所有的key和value。

           2、内存管理机制不同

在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。当物理内存用完时,Redis可以将一些很久没用到的Value交换到磁盘。Redis只会缓存所有的Key的信息,如果Redis发现内存的使用量超过了某一个阈值,将触发swap操作。Redis的内存管理主要通过源码中的zmalloc.h和zmalloc.c两个文件来实现。Redis为了方便内存的管理,在分配一块内存之后,会将这块内存的大小存入内存块的头部,Redis通过一个数据来记录所有的内存分配情况。

在Memcached中,默认使用Slab Allocation机制管理内存,其主要思想是按照预先设定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片的问题。Slab Allocation机制只为存储外部数据而设计,也就是所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请。

3、数据持久化支持

Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。而Memcached是不支持数据持久化操作 的。

4、集群管理不同

Memcached是全内存的数据缓冲系统,Redis虽然支持数据持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。

0 0