Redis与memcached区别html
参考:http://blog.csdn.net/tonysz126/article/details/8280696redis
http://blog.csdn.net/colorant/article/details/21089057算法
https://www.zhihu.com/question/21419897缓存
少许的数据存储,高速读写访问。此类产品经过数据所有in-memory的方式保证高速访问,同时提供数据落地功能服务器
Memcached只支持简单的K/V数据类型网络
Redis不只仅支持简答的K/V类型数据,同时还提供了List,Set,SortedSet,Hash等数据结构的存储数据结构
Redis能够以master-slave的方式配置服务器,Slave节点对数据进行replica备份,Slave节点也能够充当Read only的节点分担数据读取的工做多线程
memcached不保证存储的数据的有效性,Slab内部基于LRU也会自动淘汰旧数据。架构
客户端不能假设数据在服务器端的当前状态,这应该说是Memcached的Feature设定,用户没必要太多关心或者本身管理数据的淘汰更新工做。Memcached也不作数据的持久化工做,可是有许多基于memcached协议的项目实现了数据的持久化,例如memcacheDB使用BerkeleyDB进行数据存储,但本质上它已经不是一个Cache Server,而只是一个兼容Memcached的协议key-valueData Store了。并发
Redis支持数据的持久化,能够将内存中的数据保存在磁盘中,重启时能够再次加载使用。Redis内建支持两种持久化方案,snapshot快照和AOF 增量Log方式。快照顾名思义就是隔一段时间将完整的数据Dump下来存储在文件中。AOF增量Log则是记录对数据的修改操做(实际上记录的就是每一个对数据产生修改的命令自己),两种方案能够并存,也各有优缺点,具体参见 http://redis.io/topics/persistence。
Redis并非全部的数据都一直存储在内存中,这是和Memcached相比最大的区别。Redis只会缓存全部的key信息,若是Redis发现内存的使用量超过一个阀值后,将进行swap操做,计算出哪些key须要交换到磁盘中。而后再将这些key对应的value持久化到磁盘,同时在内存中清除这些数据。
Redis将内存中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操做的子线程会共享这部份内存,因此若是更新须要swap的数据,Redis将阻塞这个操做,直到子线程完成swap操做后才能够进行修改。
Memcached提供了cas命令,能够保证多个并发访问操做同一份数据的一致性问题。
除了increment/decrement这样的原子操做命令,不存在对事务的支持
Redis没有提供cas 命令,并不能保证这点。不过Redis提供了事务的功能,能够保证一串 命令的原子性,中间不会被任何操做打断。
Redis经过Multi / Watch /Exec等命令能够支持事务的概念,原子性的执行一批命令。在2.6之后的版本中因为添加了对Script脚本的支持,而脚本固有的是以transaction事务的方式执行的,而且更加易于使用
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络链接,接受请求后,将链接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型能够发挥多核做用,可是引入了cache coherency和锁的问题,好比,Memcached最经常使用的stats 命令,实际Memcached全部操做都要对这个全局变量加锁,进行计数等工做,带来了性能损耗。
Redis使用单线程的IO复用模型,本身封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操做来讲,单线程能够将速度优点发挥到最大,可是Redis也提供了一些简单的计算功能,好比排序、聚合等,对于这些操做,单线程模型实际会严重影响总体吞吐量,CPU计算过程当中,整个IO调度都是被阻塞住的。
Memcached使用预分配的内存池的方式,使用slab和大小不一样的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式能够省去申请/释放内存的开销,而且能减少内存碎片产生,但这种方式也会带来必定程度上的空间浪费,而且在内存仍然有很大空间时,新的数据也可能会被剔除,缘由能够参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
Redis使用现场申请内存的方式来存储数据,而且不多使用free-list等方式来优化内存分配,会在必定程度上存在内存碎片,Redis跟据存储命令参数,会把带过时时间的数据单独存放在一块儿,并把它们称为临时数据,非临时数据是永远不会被剔除的,即使物理内存不够致使swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合做为存储而不是cache
Memcached自己并不支持分布式,所以只能在客户端经过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。下图给出了Memcached的分布式存储实现架构。当客户端向Memcached集群发送数据以前,首先会经过内置的分布式算法计算出该条数据的目标节点,而后数据会直接发送到该节点上存储。但客户端查询数据时,一样要计算出查询数据所在的节点,而后直接向该节点发送查询请求以获取数据。
Redis3.0以前
客户端Redis Sharding技术其主要思想是采用一致性哈希算法(consistent hashing),将key和节点name同时hashing。采用一致性哈希而不是采用简单相似哈希求模映射的主要缘由是当增长或减小节点时,不会产生因为从新匹配形成的rehashing。一致性哈希只影响相邻节点key分配,影响量小。
Redis3.0
Redis Cluster中,Sharding采用slot(槽)的概念,一共分红16384个槽,这有点儿类pre sharding思路。对于每一个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。
http://doc.redisfans.com/topic/cluster-tutorial.html
1.Redis使用最佳方式是所有数据in-memory。
2.Redis更多场景是做为Memcached的替代者来使用。
3.当须要除key/value以外的更多数据类型支持时,使用Redis更合适。
4.当存储的数据不能被剔除时,使用Redis更合适。