中间件-缓存、索引、日志-分布式缓存中间件

时间:2024-01-26 11:23:47

本地缓存属于单进程管理的范畴,存在单点故障与资源瓶颈,无法应对数据的持续增长。为了适应分布式架构的特点,市面上也出现了一批基于内存存储的分布式存储框架。

由于分布式缓存与应用进程分属不同的进程,存在网络访问开销,所以几乎各个缓存中间件都是基于内存存储的系统,它们的存储容量受限于机器内存容量。

为了解决存储方面的瓶颈,各个分布式缓存中间件都支持集群部署。分布式缓存中间件中比较出名的非 Redis 与 Memcached 莫属。我们以 Redis 为例,来看一下经典的分布式缓存部署架构:

在这里插入图片描述
从这张图中,我们可以提取出下面几个要点。

首先,客户端通常会使用一致性哈希算法进行负载均衡,主要是为了提高节点扩容、缩容时的缓存命中率

第二,Redis 采用主从同步模式,这可以提升数据的存储可靠性。如果是像 Memcache 这种不能持久化的中间件,进程一旦退出,存储在内存中的数据将会丢失,就要重新从数据库加载数据,这会让大量流量在短时间内穿透到数据库,造成数据库层面不稳定。

第三,单台 Redis 受限于机器内存的容量限制,通常会采用集群部署,即每一个节点存储部分数据。

第四,为了提升 Redis 的 master-slave 高可用性能,降低由于 master 节点宕机导致的集群写入节点数量减少问题,通常会引入哨兵集群,使 master-slave 主从自动切换,进一步提升缓存中间件的高可用性。

那么,同为分布式缓存中间件,Redis 和 Memcached 又有什么区别与联系呢?二者的共同点是,它们都是基于内存访问的高性能缓存存储系统,具有高并发、低延迟特性。

但它们的不同点也很多,我总结为了以下四点。

  • 数据类型:Redis 支持丰富的数据类型,不仅支持 key-value 的存储结构,还支持 List、Set 等复杂数据结构,而 Memcache 只支持简单的数据类型。
  • 数据持久化:Redis 支持基于 AOF、快照两种数据持久机制,持久化带来的好处便是进程重启后数据不会丢失,能有效防止缓存被击穿的风险;Memcache 不支持数据持久化。
  • 分布式存储:Redis 自身支持 master-slave、Cluster 两种分布式存储架构,而 Memcache 自身并不支持集群部署,需要使用一致性哈希算法来构建集群。
  • 线程模型:Redis 命令执行采用单线程,故 Redis 不适合大 Value 值的存储,但借助 Redis 单线程模型可以非常方便地实现分布式锁等功能;Memcache 基于多线程运行模型,可以充分利用多核 CPU 的并发优势,提升资源的利用率。

讲了这么多,要一下记住可能有点难度,我给你画了两张图,总结了刚才不同中间件的差异、适用场景,你可以保存下来随时回顾:

在这里插入图片描述
在这里插入图片描述
一句话总结,缓存框架是不断在演进的,在项目中引入缓存相关的中间件技术绝对是一个明智之举。在数据量较少,并且变更不频繁时,我建议你采用本地缓存,其他情况建议使用分布式缓存。

那如何在 Redis 与 Memcache 中进行选型呢?虽然技术选型我们需要结合业务场景来看,但从上述功能的对比来看,Redis 基本在各个对比项中对 Memcache 呈“压制”态势,所以多数情况下,我建议你使用 Redis。