首先Memcache是一个基于内存的key/value分布式缓存系统,不过memcache还可用于缓存其他东西,例如图片、视频等等。Redis是一个开源的基于内存亦可持久化的日志型、Key-Value的数据库。
一、缓存时,具体是key、value分别是怎样的数据
首先Memcache是一个基于内存的key/value分布式缓存系统,不过memcache还可用于缓存其他东西,例如图片、视频等等。Redis是一个开源的基于内存亦可持久化的日志型、Key-Value的数据库。
Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
大部分缓存实现时都是基于key/value形式,主要是缓存的使用场景决定的。另外,Redis是一种NoSQL数据库,使用场景也不仅仅限于缓存。
Memcached通过使用key-value形式存储和访问数据,在内存中维护一张巨大的HashTable,使得对数据查询的时间复杂度降低到O(1),保证了对数据的高性能访问。
memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe传递给worker线程,进行读写IO,网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如:memcached最常用的stats命令,实际memcached所有操作都要对这个全局变量加锁,进行技术等工作,带来了性能损耗。
延伸阅读:
二、Memcached内存管理机制
Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。Slab Allocation机制只为存储外部数据而设计,也就是说所有的key-value数据都存储在Slab Allocation系统里,而Memcached的其它内存请求则通过普通的malloc/free来申请,因为这些请求的数量和频率决定了它们不会对整个系统的性能造成影响Slab Allocation的原理相当简单。 如图所示,它首先从操作系统申请一大块内存,并将其分割成各种尺寸的块Chunk,并把尺寸相同的块分成组Slab Class。其中,Chunk就是用来存储key-value数据的最小单位。每个Slab Class的大小,可以在Memcached启动的时候通过制定Growth Factor来控制。假定图中Growth Factor的取值为1.25,如果名列前茅组Chunk的大小为88个字节,第二组Chunk的大小就为112个字节,依此类推。