Redis 和Memcached比较

我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个内存数据库系统,而Memcached只是简单的K/V缓存,mongodb本质上是一个物理数据库。

区别:

  1. 性能(网络IO模型)
    Memcached是多线程,非阻塞IO复用的网络模型。Memcache可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS,适用于最大程度扛量。
    Redis使用单线程的IO复用模型。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。

  2. 内存使用
    MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。
    使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcache。
    Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/
    Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。

  3. 数据一致性
    Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作。
    redis使用的是单线程模型,提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断,保证了数据按顺序提交。

  4. 可靠性
    memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
    redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化。

  5. 数据备份
    Redis支持数据的备份,即master-slave主从复制。

  6. 分布式存储
    redis支持master-slave复制模式
    memcache可以使用一致性hash做分布式

  7. 数据支持类型
    Memcached基本只支持简单的key-value存储,不过memcache还可用于缓存其他东西,例如图片、视频等等。
    Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构。也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。

  8. 应用场景:
    Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
    Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

  9. 关于不同语言的客户端支持
    在不同语言的客户端方面,Memcached和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目前看在客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能等,对应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。

  10. 应用举例
    memcache:Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度,现在已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。
    redis:国内像新浪、淘宝,国外像 Flickr、Github等均在使用Redis的缓存服务。

    对于两者的选择还是要看具体的应用场景,如果需要缓存的数据只是key-value这样简单的结构时,我在项目里还是采用memcache,它也足够的稳定可靠。如果涉及到存储,排序等一系列复杂的操作时,毫无疑问选择redis。
    有持久化需求或者对数据结构和处理有高级要求的应用,只能选择redis,其他简单的key/value存储,选择memcache。

应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能。

需要慎重考虑的部分
1.Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
2.Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高
3.从本质上讲,Memcached只是一个单一key-value内存Cache;而Redis则是一个数据结构内存数据库,支持五种数据类型,因此Redis除单纯缓存作用外,还可以处理一些简单的逻辑运算,Redis不仅可以缓存,而且还可以作为数据库用
4.新版本(3.0)的Redis是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。

参考链接:
https://blog.csdn.net/chaoluo001/article/details/70740307
https://www.cnblogs.com/EE-NovRain/p/3268476.html
https://blog.csdn.net/hhjianlong/article/details/73928653
https://www.cnblogs.com/haoyu521/p/5608309.html
https://www.cnblogs.com/JavaBlackHole/p/7726195.html

你可能感兴趣的:(redis)