Guava缓存

Guava缓存是谷歌的一种本地缓存,缓存是通过使用本机的内存来存储的,实现原理类似于ConcurrentHashMap,

Guava适用于以下的场景:

1.消耗内存空间来提升速度

2.你预料到某些键会被查询一次以上

3.缓存中存放的数据总量不会超出内存的容量

缓存回收

1.基于容量的回收

CacheBuilder.maximumSize(long)

这种回收方案使用的策略是LRU算法。

LRU算法(Least recently used,最近最少使用)根据数据的历史访问记录来进行淘汰数据,其核心思想是如果数据最近被访问过,那么将来被访问的几率也会很高。

算法的实现是采用的链表的实现,新数据插入到链表的头部,每当缓存命中(即缓存数据被访问),则将找到的该数据移到链表的头部。

当链表满的时候,将链表尾部的数据丢弃。

命中率

当存在热点数据时,LRU的效率很好,但是偶发性的、周期性的批量操作会导致LRU命中率急剧下降,缓存污染情况比较严重。

时间复杂度为O(n)

优缺点

命中时需要遍历链表,找到命中的数据然后移到链表的头部,和链表的特性一样,查找需要遍历整个链表,插入新数据比较快。

2.定时回收

expireAfterAccess(long, TimeUnit)

缓存在给定的时间内没有被访问则被回收

expireAfterWrite(long, TimeUnit)

缓存没有在给定的时间内被写访问(创建或者覆盖)则被回收。

3.基于引用的回收

CacheBuilder.weakKeys():使用弱引用存储键。当键没有其它(强或软)引用时,缓存项可以被垃圾回收。

CacheBuilder.weakValues():使用弱引用存储值。当值没有其它(强或软)引用时,缓存项可以被垃圾回收。

CacheBuilder.softValues():使用软引用存储值。软引用只有在响应内存需要时,才按照全局最近最少使用的顺序回收。

4.显示清除

        指定key进行个别清除:Cache.invalidate(key)    

        指定key进行批量清除:Cache.invalidateAll(keys)

        清除所有缓存项:Cache.invalidateAll()

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • com.google.common.cache 1、背景 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法...
    拾壹北阅读 22,481评论 0 25
  • 范例 适用性 缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值...
    爱情小傻蛋阅读 686评论 0 2
  • 缓存 范例 适用性 缓存在很多场景下都是相当有用的。例如,计算或检索一个值的代价很高,并且对同样的输入需要不止一次...
    小鸡在路上阅读 3,281评论 0 2
  • Google Guava Cache是一种非常优秀本地缓存解决方案,提供了基于容量,时间和引用的缓存回收方式。基于...
    Acamy丶阅读 26,200评论 3 34
  • 一、接口声明 二、接口方法 ConcurrentMap<K,V> asMap()返回存储在此缓存中的线程安全的键值...
    codeduck1阅读 430评论 0 1