首页 > 代码库 > key-value 内存数据库 : memcached vs redis
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也是明智的。
key-value 内存数据库 : memcached vs redis