Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度.
Redis是一个key-value存储系统,和Memcached类似。但是它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都 是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期 性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便.
下面主要介绍一下Redis与Memcached的不同。
1.网络IO模型
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。
Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只 有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影 响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。
2.内存管理方面
Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能 减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文 章:http://timyang.net/data/Memcached-lru-evictions/
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和Redis都有丰富的第三方客户端可供选择,不过因为Memcached发展的时间更久一些,目前看在 客户端支持方面,Memcached的很多客户端更加成熟稳定,而Redis由于其协议本身就比Memcached复杂,加上作者不断增加新的功能等,对 应第三方客户端跟进速度可能会赶不上,有时可能需要自己在第三方客户端基础上做些修改才能更好的使用。
根据以上比较不难看出,当我们不希望数据被踢出,或者需要除key/value之外的更多数据类型时,或者需要落地功能时,使用Redis比使用Memcached更合适。
关于Redis的一些周边功能
Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原理,清楚地了解到它的局限 性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢失的,又比如聚合计算和 scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。
总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。
总结:
1.Redis使用最佳方式是全部数据in-memory。
2.Redis更多场景是作为Memcached的替代者来使用。
3.当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
4.当存储的数据不能被剔除时,使用Redis更合适。
相关推荐
3. Redis 与 Memcached 的比较: - 数据类型:Redis 支持丰富的数据结构,而 Memcached 只支持简单的字符串。 - 持久化:Redis 提供持久化机制,而 Memcached 不具备。 - 性能:在纯内存操作下,两者性能相近,但...
分布式缓存 Redis + Memcached 经典面试题!
在众多的缓存解决方案中,Redis和Memcached是最受欢迎的两个选择。本文将深入探讨Redis与Memcached的选型对比,分析它们的性能测试结果,并探讨各自的优缺点。 Redis与Memcached都是基于NoSQL的内存数据结构存储...
3. **Zend_Cache**: `Zend_Cache` 是 Zend Framework 中用于缓存处理的核心组件,它可以方便地与其他缓存后端(如 Redis 和 Memcached)集成。通过 `Zend_Cache`,开发者可以定义缓存策略,设置缓存前缀,控制缓存...
在Linux环境下部署TreeNM并使用Redis和Memcached进行数据访问,是一项涉及到缓存系统和网络监控软件的技术操作。为了更深入地理解这一过程,我们需要分别了解Redis、Memcached以及TreeNM三个主要技术组件的原理和...
**TreeNMS for Redis, memcached v1.7.5** TreeNMS 是一款由 TreeSoft 开发的数据库管理系统,特别针对 Redis 和 memcached 这两种流行的数据存储系统设计。这款工具提供了一种免费且高效的解决方案,用于管理和...
标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。这个过程在 IT 领域中是常见的,因为不同的缓存系统有不同的特性和优势。让我们深入探讨这个...
互联网分布式缓存技术 课程主讲: 互联网应用高级架构师 白贺翔涉及技术: Redis、SSDB、Memcached课程描述: 介绍互联网分布式技术的重要性、背景、应用范围;目前互联网行业使用分布 式缓存进行设计的比例,...
这个组合通常用于搭建一个高性能的Web环境,其中Nginx负责接收HTTP请求,通过FastCGI与PHP交互处理动态内容,MySQL存储数据,Redis和Memcached作为缓存层,提升整体性能。这样的架构在现代Web开发中非常常见,尤其...
支持Winform和Web等应用开发,以及支持多种流行的缓存实现,如MemoryCache、Redis、Memcached、Couchbase、System.Web.Caching等。 可以实现多层的缓存,让进程内缓存在分布式缓存之前,且仅需几行代码来处理,它使...
Redis 和 Memcached 都是广泛使用的内存数据存储系统,它们常用于缓存和快速数据访问。本文主要讨论了这两种技术的缓存失效原理,特别是针对 Redis 的失效机制进行了深入解析。 首先,我们要明白如何触发 key 的...
标题“memcached完全剖析ehcache memcached redis 缓存技术总结”表明,这篇内容将深入探讨三种流行的缓存技术——Memcached、Ehcache和Redis。缓存是IT行业中用于提高系统性能的关键技术,尤其是在大数据量和高并发...
这些进程中包括用作缓存的 Memcached(有时还有 Redis)。利用空闲磁盘空间进行缓存不是很好吗?Django 是 Python 最流行的 Web 框架,附带多个缓存后端。遗憾的是,Django 中基于文件的缓存本质上存在问题。剔除...
支持多个后端(内存,redis和memcached)的Asyncio缓存。 该库旨在简化而不是专业化。 所有缓存都包含相同的最小接口,该接口包含以下功能: add :仅在键不存在时才添加键/值。 get :检索由键标识的值。 set :...