高并发应用利器-缓存

56 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 26 天,点击查看活动详情

1 前言

在前文中已经讲述了限流有关的内容,缓存作为高并发的三大利器之一,也是非常重要的,在本文中将分享缓存有关的内容。

2 缓存类型

从缓存类型来看,可以分为:堆缓存、堆外缓存、磁盘缓存和分布式缓存。

  • 1 堆缓存 使用 java 堆内存来存储对象,使用堆缓存的好处是不需要序列化和反序列化,也是最快的缓存。缺点是当缓存的数据量大时,会增加垃圾回收的停顿时间,而且存储容量受制于堆空间的大小,一般通过软引用/弱引用来 存储对象,当堆内存不足的情况下,就会回收这一部分的内容,常见的使用对象为 WeakHashMap 。

  • 2 堆外缓存 即存储在堆内存外的缓存,优点是可以减少 GC 停顿时间,可以支持更大的缓存空间,缺点就是在存取数据时需要进行序列化和反序列化。因此堆外缓存的效率比堆缓存的效率低,常用的使用对象为 Ehcache。

  • 3 磁盘缓存 磁盘缓存即存储在数据磁盘上的缓存,既然在磁盘上,那么当项目重启后,堆缓存和堆外缓存数据会丢失,需要重新加载,但是磁盘缓存不需要,但是磁盘缓存会比对外缓存存取速度要慢。

  • 4 分布式缓存 分布式缓存即使用外围缓存设备,比如 Redis 和 Memcached,分布式缓存需要进行网络 IO, 可能比磁盘缓存还要慢。

3 缓存回收策略

缓存的回收策略按照类型可以分为四种类型:

  • 1 基于空间的回收策略 设置缓存的容量大小,当缓存的存储空间达到上限时,即按照一定的策略移除缓存中的数据。

  • 2 基于数量的回收策略 基于数量的缓存数量则是固定缓存数据的条目,当达到上限时即可移除旧的缓存数据。

  • 3 基于时间的回收策略 存活期 TTL(time to live),当缓存数据从创建开始到到期的时间段,空闲期 TTI (time to idle), 即当数据缓存多久没有访问后才移除改缓存。

  • 4 基于对象引用的回收策略 当一个对象是软引用时,当 jvm 内存不足时,垃圾回收就会回收这些对象,软引用适合用来做缓存,当 jvm 内存不足则进行对象回收以释放内存空间,从而避免 OOM。 当一个对象是弱引用时,垃圾回收器就会立即进行回收,相对于软引用,弱引用有更短的生命周期。

4 回收算法

在 Redis 和 InnoDB 的学习中,我们都会接触到一些回收策略的算法,常见的有 FIFO 算法、 LRU 算法、 LFU 算法。

  • 1 FIFO:先进先出算法,即先放入缓存的先被移除。
  • 2 LRU:最近最少使用算法,时间距离现在最久的数据被移除。
  • 3 LFU(:最不常用算法,单位时间段内使用次数最少数据被移除。

5 总结

在本文中,主要讲述了缓存相关的内容,分享了缓存类型、缓存策略和一些缓存清除算法。另外还有一个内容就是如何评价缓存的有效性。 缓存命中率是评价缓存效率的参数,命中率是越高越好。 $ 缓存命中率 = \frac{从缓存中读取的次数}{总读取次数(从缓存中读取的次数 + 从硬件设备读取)}$