您的位置:首页 > 数据库 > Memcache

Redis PK Memcached的总结

2016-01-19 20:30 609 查看

序言

Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用从而可以减轻关系数据库负载,它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态,数据库驱动网站的速度。Memcached是基于一个存储键/值对的hashmap。

Redis也是一个key-value存储系统,和Memcached类似。但是它支持存储的value类型相对更多,包括string(字符串),list(链表),set(集合),zset(有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop,add/remove以及取交集并集和差集以及更丰富的操作,而且这些找错都是原子性的。在此基础上,Redis支持各种不同的排序。同Memcached一样,为了保证效率,数据都是缓存在内存中。区别是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis RK Memcached

1.网络IO模型

Memacached是多线程,非阻塞IO多路复用的网络模型,分为监听线程和work子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe传递给work线程,进行读写IO,网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如Memcached最常用的stats命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。

Redis使用单线程的IO多路复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll,kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到极致。但是Redis也提供了一些简单的计算功能,比如排序,聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。

2.内存管理方面

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减少内存碎片的产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除。

Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis根据存储命令参数,会把带过期时间的数据单独存放在一起,并把他们成为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis跟适合作为存储而不是cache。

3.数据一致性问题

Memcached提供cas命令,可以保证多个并发访问操作操作同一份数据的一致性问题。Redis没有提供cas命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串命令的原子性,中间不会被任何操作打断。

4.存储方式以及其他方面

Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能;而Redis除了key-value之外,还支持list,set,sorted set,hash等众多数据结构,提供了keys进行枚举操作,但不支持线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举所有数据。Redis还同时提供了持久化和复制等功能

5.基本架构和思想

Memcached采用客户端-服务器的架构,客户端和服务器的通讯使用自定义的协议标准,只要满足协议要求,客户端可以用任何语言来实现。从用户的角度来说,服务器维护了一个键值对关系的数据表,服务器之前相互独立,相互之前不共享数据也不做任何通讯操作。Memcached的基本应用模型如下图所示



Redis的基本应用模式和上图的Memcached的基本相似
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: