Memchached还是Redis?使用哪一个?当我们谈论提高性能时,这是每次技术讨论中最常见的问题之一。每当需要提高性能时,缓存通常是第一步。同时,选择Memcached还是Redis通常是首先要考虑的地方。哪个能给我们带来更好的性能?它们的优点和缺点是什么?在设计任何缓存系统时,我们都会考虑以下因素:读/写速度内存使用磁盘I/O转储。可扩展性。考虑到您已经了解这些缓存的基础知识,我编写了本教程。Redis和Memchached之间的相似之处:Memcached/Redis都提供基于内存的键值数据存储,尽管Redis更准确地说是一种结构化数据存储。Redis是用于数据库、缓存和消息代理的内存结构化数据存储。两者(Memcached/Redis)都属于数据管理方案中的NoSQL家族,都是基于key-value存储。它们都将数据保存在内存中,这当然使它们作为缓存层特别有用。时至今日,Memcached提供的每一个主要功能和优势都是Redis功能和特性的一个子集。如果Memcached可用于任何用例,则Redis可用作等效物。它们都是闪电般快速的缓存。Memcached提供的只是Redis的冰山一角。Memcached是一种基于易失性内存的键值存储。Redis可以做同样的事情(以及Memcached),但它仍然是一个结构化数据服务器。为什么选择内存缓存?当缓存比较小并且使用静态数据时,例如HTML代码片段,Memcached可能更可取。Memcached内部的内存管理在最简单的用例中效率更高,因为它的元数据消耗的内存资源相对较少。当数据大小是动态的时候,Memcached的内存管理效率会迅速下降,这时候Memcached的内存就会变得碎片化。此外,大型数据集通常涉及数据序列化,这总是需要更多的存储空间。如果您使用Memcached,数据会随着重启而丢失,并且重建缓存是一个昂贵的过程。Memcached优于Redis的另一个场景是可扩展性。由于Memcached是多线程的,您可以通过为其提供更多计算资源来轻松扩展它。Redis是单线程的,可以通过集群进行无损扩展。集群是一种有效的扩展方案,但配置和操作相对复杂。Memcached不支持复制(数据自动从一台机器复制到另一台机器)。Memcached非常适合处理高流量网站。它可以一次读取大量信息并以出色的响应时间返回。Redis不仅可以处理高流量的读,还可以处理重写。为什么选择Redis?Redis有五种主要的数据结构可供选择。它通过智能缓存和处理缓存数据为应用程序开发人员开辟了新的可能性世界。由于其数据结构(使用多种格式存储数据:列表、数组、集合、有序集合)属性,Redis作为缓存系统提供了更大的容量和更高的整体效率。缓存使用一种称为“数据回收”的机制通过从内存中删除旧数据来为新数据腾出空间。Memcached的数据回收机制采用了LRU(LeastRecentlyUsed-最近最少使用)算法,但是在回收与新数据大小相近的数据时有点随意。Redis允许对回收进行细粒度控制,让您可以从六种不同的回收策略中进行选择。Redis同时支持惰性(被动)和主动回收,仅在需要更多空间或主动激活时才回收数据。另一方面,Memcached只支持惰性回收。以下是Redis提供的一些功能,可用于“真正的”数据存储,而不仅仅是缓存。可以利用它们的强大数据类型和强大的命令支持。Hash、sortedsets、lists等。默认磁盘持久化支持使用乐观锁(WATCH/MULTI/EXEC)发布/订阅功能的事务支持,速度极快,最大key大小限制为512MB(Memcached每个key值被限制为1MB大小)Lua脚本支持(2.6及以上)内置集群支持(3.0及以上)一切都非常快,强大的数据类型尤为重要。它们允许Redis提供一个很棒的共享队列(列表)、一个很棒的消息传递解决方案(发布/订阅)、一个存储会话信息(哈希)的好地方,以及一个引人注目的高分跟踪区域(排序集)。它们只是可以轻松探索的用法示例。结论与Memcached相比,Redis具有非常相似的性能和内存使用情况。除非您已经对Memcached进行了大量投资,否则继续使用Redis是显而易见的解决方案。Redis不仅是更好的选择,它还支持全新类型的用例和使用模式。Redis可能非常有用的一些示例应用程序:电子商务应用程序:大多数电子商务应用程序都是重量级的,Redis可以提高您的页面加载速度。你可以把所有的配置文件都存储在Redis中,从内存中读取这些配置信息的速度会非常快。由于Redis的键值容量很大,您还可以将整页缓存存储在其中。您还可以将会话信息存储在Redis中。物联网应用:在物联网应用中,物联网设备向服务器发送数据的频率很高,比如每秒数千条。您可以将这些大量原始数据推送到Redis,然后再将它们存储在任何持久性存储中。实时分析:实时分析引擎可以在Memcached上实现,由数据库支持。但是Redis非常擅长统计列表和一系列的东西。在Redis的所有特性中,它对键值排序的能力超过了Memcached,它还会计算一组页面的命中数等数据,然后将这些数字聚合到分析系统中。这些数据可以被工作人员输入到更大的分析引擎中,在这些应用中选择Redis是一个正确的决定。***有一件事:无论您选择什么,缓存系统都不是数据库。不能单靠缓存,系统同时需要缓存和数据库。这段是我的评论。总体来说,Redis在功能和特性上都远超Memcached,完全是下一代产品。选择使用哪一个似乎答案很明确。但必须指出的是,Redis的单线程设计也带来了一些重要的隐患。Redis具有数据持久化功能。这个功能加上Redis的单线程特性,成为了Redis故障的高发区。默认的RDB持久化会阻塞线程,导致Redis无法响应正常的请求,在高流量的网站上容易出现大量的请求错误。这在体制上叫做“涌现”,当然这是不好的。当然后来Redis也开发了AOF持久化方式(默认不开启,需要手动开启),一定程度上缓解了Redis的持久化问题。Redis将派生一个子进程来单独处理持久性。但是,fork功能不是免费的。它还会消耗内存资源并影响主程序对请求的响应。阻塞是Redis应用程序的噩梦,就像Node.js一样。所以,当出现故障时,可以从这个角度去分析原因,可能会很快解决。
