key-value 内存数据库 : memcached vs redis

 

Memcached:

  • 高性能的分布式缓存数据库
  • key-value存储方式(hashmap)
  • 不支持数据持久化,服务器关闭后数据全部被丢失
  • C开发的,基于libevent库,在大多数linux,bsd,solaris,以及windows 等os上都可用
  • 客户端实现软件的语言非常多:C/C++, PHP, Java, Python, Erlang, Perl, Lua,Go 等

 

 

Redis:

  • 开源key-value 存储系统
  • C语言开发
  • 在大多数linux,bsd,solaris 等系统上无需依赖就可以使用
  • 客户端语言:C/C++,C#,Obj-C,PHP, Python,Java,Perl,Lua,Erlang

 

内存管理方式:

  Memcached:默认使用Slab allocation 机制管理内存,主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value记录,以解决内存碎片的问题。 Slab allocation 只是用于外部数据的存储,而memcached其他的内存需求还是通过malloc/free来申请。

      Slab Allocation的原理相当简单。 如图3所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定Figure 1中Growth Factor的取值为1.25,所以如果第一组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。

当内存不足时会采用LRU机制,替换出陈旧数据

      Redis:

      Redis的内存管理主要通过源码中zmalloc.h和zmalloc.c两个文件来实现的。Redis为了方便内存的管理,在分配一块内存之后,会将 这块内存的大小存入内存块的头部。

          size | mem block

    Redis通过定义一个数组来记录所有的内存分配情况,这个数组的长度为ZMALLOC_MAX_ALLOC_STAT。数组的每一个元素代表当前程序所分配的内存块的个数,且内存块的大小为该元素的下标。在源码中,这个数组为zmalloc_allocations。 zmalloc_allocations[16]代表已经分配的长度为16bytes的内存块的个数。zmalloc.c中有一个静态变量 used_memory用来记录当前分配的内存总大小。所以,总的来看,Redis采用的是包装的mallc/free,相较于Memcached的内存 管理方法来说,要简单很多。

采取磁盘存储机制实现数据持久化。但是,当数据量达到1千万左右时,由于内存中不能存储如此大量数目的数据,频繁同磁盘进行数据交换,导致数据查询、存储性能的急剧下降,将导致服务不可用

分布式机制:

  memcached:本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。

  Redis:更偏向于在服务器端构建分布式存储。尽管Redis当前已经发布的稳定版本还没有添加分布式存储功能,但Redis开发版中已经具备了Redis Cluster的基本功能。预计在2.6版本之后,Redis就会发布完全支持分布式的稳定版本,时间不晚于2012年底。下面我们会根据开发版中的实现,简单介绍一下Redis Cluster的核心思想。

  Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能。

 

整体性能:

  

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

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

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

4)如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis。因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。

posted on 2014-11-29 01:42  不忘初衷,方能致远  阅读(585)  评论(0编辑  收藏  举报

导航