Memcached与Redis对比

2022-04-13 00:00:00 数据 分布式 节点 缓存 内存

之前的文章我们讲解了Memcached与Redis,这篇文章我们来对比一下两种缓存。

一、Redis与Memcached主要特性对比


二、网络IO模型

Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。


  Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。


三、性能对比

由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。


四、内存管理方面

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除;缓存的数据不能超过内存的大小。


Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache;缓存数据超过一定内容时,Redis会把缓存的值存储到硬盘上,缓存的key依旧在内存中;缓存的key不能超过内存大小。


五、集群管理

Memcached是全内存的数据缓冲系统,作为基于内存的存储系统来说,机器物理 内存的大小就是系统能够容纳的大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。

Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。当客户端向Memcached集群-发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数 据会直接发送到该节点上存储。但客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。

相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储。新版本的Redis已经支持了分布式存储 功能。Redis Cluster是一个实现了分布式且允许单点故障的Redis版本,它没有中心节点,具有线性可伸缩的功能。Redis Cluster的分布式存储架构,节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。在数据的放置策略上,Redis Cluster将整个key的数值域分成4096个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的大节点数就是4096。Redis Cluster使用的分布式算法也很简单:crc16( key ) % HASH_SLOTS_NUMBER。

为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点。在Redis Cluster中,每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用。当 Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。


六、使用场景

1、如果有持久方面的需求或对数据类型和处理有要求的应该选择Redis;另外还能用做消息队列、数据堆栈和数据缓存,如果涉及到存储,排序(排行榜/计数器)、队列、订阅/发布等一系列复杂的操作时;适合所有数据in-momory的场景。

2、如果简单的key/value 存储应该选择memcached;用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding)


七、个人总结

有持久化需求或者对数据结构和处理有要求的应用,选择redis,其他简单的key/value存储,选择memcache。


参考:

https://blog.csdn.net/hackercn9/article/details/54846048

https://cloud.tencent.com/developer/article/1171238

https://www.cnblogs.com/a164266729/p/4371053.html

https://cloud.tencent.com/developer/article/1340984

相关文章