Redis和Memcached的区别

一、Memcached
1、 memcached 是一个高性能的分布式内存对象缓存系统,最初是由BradFitzpatrick于2003年开发而成,当时其直接服务对象为LiveJournal交友网站。在此之后,Memcached被重新用C语言进行了编写(其最初实现方式为Perl语言)且投身于公共领域,并在这里逐步发展为现代Web应用程序的构建基石。Memcached项目的当前开发工作主要关注其运行稳定性及优化效果方面,而不再积极为其打造更多新型功能,其官方网站是:http://memcached.org/,目前的最新版是1.4.29(2016-7-13)。
2、Memcached一个基于存储键/值对的hashmap,其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。memcached作为高速运行的分布式缓存服务器,具有以下的特点: 协议简单、基于libevent的事件处理、内置内存存储方式、memcached不互相通信的分布式。memcached的通信协议很简单,它的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。 memcached具有基于libevent的事件处理,libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口,即使对服务器的连接数增加,也能发挥O(1)的性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高并发性能。
3、为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。 memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。因此其分布式功能完全取决于客户端的实现。
4、由于使用基于文本行协议的关系,memcached服务端仅支持字符串这一数据类型,但是通过客户端,可以使用编程语言中的绝大部分数据类型,只需这种数据类型支持该语言中的序列化/反序列化操作即可。

二、Redis
1、Redis是一个高性能的key-value数据库,由Salvatore Sanfilippo于2009年创建。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用,因此Redis有时候会被人们称为“强化版的Memcached”,其官方网站是:http://redis.io/
2、和Memcached相比,Redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 因此,Redis作为一个高性能的key-value数据库具有多样的数据模型、持久化、主从同步的特性。
3、Redis Cluster是一个实现了服务端分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能,通过这个特性保证了其作为key-value数据库的高可用性。Redis Cluster分布式存储架构中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信,支持的最大节点数是4096。为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点,每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。

三、对比
1、Memcached出来的时间较redis早
2、memcached更专注于实现一个高性能的缓存,而Redis更专注于实现一个多功能、海量数据、高可用的nosql数据库。
3、Memcached只支持简单的key/value存储,redis支持list、set、hash、zset(有序集合)、sorted set数据存储,这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的
4、memcached中保存的数据都存储在memcached内置的内存存储空间中,宕机后数据就会丢失
redis支持数据持久化,内存中的数据保持在磁盘中,重启后可以加载进行使用
5、Memcached不支持分布式数据共享,redis支持分布式系统,支持分片、哨兵模式。
分片有3种方式
a、代码编写调用不同的redis库
b、使用代理工具
c、redis集群,随机访问。
6、Redis支持数据的备份,即master-slave模式的数据备份,每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用
7、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
8、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
9、redis中内存使用到一定阈值时会根据一定的算法将比较久的或者过期了的数据保存到磁盘中,将redis内存中数据删除,但会保存所有的key,当查询改key值获取不到数据则去磁盘中加载。
10、Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。
11、memcached的服务器与客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,读取方面尤其是针对批量读取性能方面memcached占据优势
Redis Cluster分布式存储架构中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信
12、Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

 总结:
  1.Redis使用最佳方式是全部数据in-memory。
  2.Redis更多场景是作为Memcached的替代者来使用。
  3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
  4.当存储的数据不能被剔除时,使用Redis更合适。

参考网站:http://blog.csdn.net/tonysz126/article/details/8280696/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值