如何设计缓存

1. 分布式缓存?进程缓存?

进程内缓存:ConcurrentHashMap、LRUMap、Ehcache、Guava Cache、Caffeine
分布式缓存:Memcache、Redis

1.1 一致性

① 进程内缓存:当使用进程内缓存时,缓存元素是特定应用程序实例本地的。然而,许多中到大型应用通常会做负载均衡,从而不存在一个作为整体的独立应用。在这种情况下,很可能会构建出一个有多少应用实例就有多少缓存的解决方案,每个缓存都有各自的状态,这就导致了不一致性。随着缓存元素的过期或被逐出,所有缓存实例间可能达到最终一致性。

②:分布式缓存:虽然部署在由多个节点构成的集群上,会提供一个单一缓存的逻辑视图(以及状态)。多数情况下,分布式缓存中的对象将会存在于集群中的单个节点。通过哈希算法,缓存引擎总是可以判断出某个键值对位于哪个特定节点。由于整个集群总是会有一个特定状态,所以从来不会存在不一致的情况。

备注:如果你需要缓存不变的对象,一致性将不是一个问题。在这种情况下,进程内缓存是一个更好的解决方案,因为它没有分布式缓存的典型管理开销。如果你的应用部署在多个节点上,想要缓存可变的对象同时需要每次读都是一致的而不仅仅满足最终一致性,则应当采用分布式缓存。

1.2 开销

进程内缓存:进程内缓存可能会影响垃圾回收进而影响系统性能。而这将会由缓存大小以及对象逐出和过期的频率决定。

分布式缓存:有两大主要开销会导致其慢于进程内缓存:网络延迟和对象序列化。

备注:正如之前所提到的,如果你试图寻求一个多节点部署情况下的强一致性缓存解决方案,采用分布式缓存。

1.3 可靠性

进程内缓存:使用与应用程序相同的堆空间,因此必须非常小心地决定缓存所能使用的内存大小上限。如果应用程序用光了内存,想要试图恢复并不容易。

分布式缓存:作为多个节点的独立进程运行,因此单点故障并不会导致缓存失效。丢失的缓存元素将会在下一次缓存未命中时进入存活的节点。分布式缓存情况下,缓存整体失效的最坏后果是降低系统性能,而不是导致系统整体故障。

备注:进程内缓存适用于较小且频率可预见的访问场景,尤其适用于不变对象。对于较大且不可预见的规模的访问,最好采用分布式缓存。

1.4 建议

  • 对于不变对象的较小规模的、可预见次数的访问,进程内缓存是一个理想解决方案,性能上它优于分布式缓存。
  • 对于要缓存的对象数量是未知的并且较大的情况下,同时要求读一致性,分布式缓存是一个更好的解决方案,尽管它可能具备与进程内缓存相同的性能。自不用说,应用程序可以同时应用两种类型的缓存,取决于最适用的应用场景。

2. 选型

2.1 进程缓存

在这里插入图片描述

2.2 分布式缓存

在这里插入图片描述

3. 设计思路

3.1 进程缓存设计

3.2 分布式缓存设计

  • 如何做持久化?
  • 如何提升读写性能?redis单线程模型
  • 存储数据的数据结构支持哪些?如何设计?
  • 如何保证高可用?(主从复制、哨兵)
  • 如何处理缓存穿透、缓存击穿、缓存雪崩?
  • 缓存淘汰策略?
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值