• 谷歌工具包之Cache


    序言

    就我个人理解而言,缓存分为两种,线程间缓存和线程内缓存,

    线程间缓存:在分布式环境下,多台服务器使用同一台数据库作为缓存,常见的如Redis。

    线程内缓存:也叫本地缓存,外部请求请求到网关时,网关将请求转发送到各个服务器时,各个服务器本地做的缓存只有各个服务器自己才能用。

    Guava Cache

    下面来看一下谷歌工具包的Cache是怎么做的,下面一个简单的demo,缓存的部分参数解释如下:

    • initialCapacity:初始容量,默认值16;
    • concurrencyLevel:并发控制级别,可以同时写缓存的线程数,默认值4;
    • maximumSize:缓存最多可以放多少个元素;
    • maximumWeight:指定缓存可能包含的项的最大权重。使用#weiger指定的称重器确定重量,使用此方法需要在调用#build之前对#weiger进行相应的调用;
    • weigher:能够决定缓存中实体对象的权重;
    • expireAfterAccessNanos:指定在条目创建、最近一次替换其值或最后一次访问后经过固定的持续时间后,应自动从缓存中删除每个条目;所有缓存读写操作(包括cache.asMap())都会重置访问时间。获取(对象)和缓存。
    • expireAfterWriteNanos:指定在创建条目或最近替换其值后经过固定的持续时间后,应自动从缓存中删除每个条目;
    • refreshNanos:刷新时间;
    • keyEquivalence:设置用于比较键的自定义等效策略;
    • valueEquivalence:设置用于比较值的自定义等效策略;
    • removalListener:设置缓存的移除通知,通过重写onRemoval方法实现。
    1. import com.google.common.cache.Cache;
    2. import com.google.common.cache.CacheBuilder;
    3. import java.util.concurrent.TimeUnit;
    4. public class CacheBuilderDemo {
    5. private static final int EXPIRE_TIME = 2;
    6. private static final int MAXIMUM_SIZE = 2;
    7. private static final long SLEEP_TIME = 1000;
    8. /**
    9. * maximumSize 当缓存达到其最大大小maximumSize时,最早的值将被逐出。默认驱逐策略——LRU(Least Recently Used)
    10. */
    11. private static final Cache CACHE = CacheBuilder.newBuilder()
    12. .expireAfterAccess(EXPIRE_TIME, TimeUnit.SECONDS)
    13. .maximumSize(MAXIMUM_SIZE)
    14. .build();
    15. public static void main(String[] args) throws InterruptedException {
    16. CACHE.put("test", "hello world!");
    17. CACHE.put("test1", "hello world! ok");
    18. Thread.sleep(SLEEP_TIME);
    19. System.out.println(CACHE.getIfPresent("test"));
    20. }
    21. }

    它使用了建造者设计模式,利用CacheBuilder中间对象去传入值,使用build方法去实例化对象,build方法不会更改此CacheBuilder实例的状态,因此可以再次调用它以创建多个独立缓存。

    1. @GwtCompatible(emulated = true)
    2. public final class CacheBuilder {
    3. private static final int DEFAULT_INITIAL_CAPACITY = 16;
    4. private static final int DEFAULT_CONCURRENCY_LEVEL = 4;
    5. private static final int DEFAULT_EXPIRATION_NANOS = 0;
    6. private static final int DEFAULT_REFRESH_NANOS = 0;
    7. private static final Logger logger = Logger.getLogger(CacheBuilder.class.getName());
    8. int initialCapacity = UNSET_INT;
    9. int concurrencyLevel = UNSET_INT;
    10. long maximumSize = UNSET_INT;
    11. long maximumWeight = UNSET_INT;
    12. Weighersuper K, ? super V> weigher;
    13. Strength keyStrength;
    14. Strength valueStrength;
    15. long expireAfterWriteNanos = UNSET_INT;
    16. long expireAfterAccessNanos = UNSET_INT;
    17. long refreshNanos = UNSET_INT;
    18. public static CacheBuilder newBuilder() {
    19. return new CacheBuilder();
    20. }
    21. ... ...
    22. public extends K, V1 extends V> LoadingCache build(
    23. CacheLoadersuper K1, V1> loader) {
    24. checkWeightWithWeigher();
    25. return new LocalCache.LocalLoadingCache(this, loader);
    26. }
    27. }

    其他Cache

    JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。使用方法与Guava/Caffeinecache类似。

    参考链接:

    1、com.google.common.cache.CacheBuilder.weigher()方法的使用及代码示例_其他_NULL123

     2、JetCache官网教程 - 开源资源分享

    3、Guava Cache

    4、Guava Cache官方文档 - 简书

  • 相关阅读:
    BS-GX-017基于SSM实现的在线考试管理系统
    联合索引中,什么时候索引是有效的,什么时候所以是无效的?
    Linux 文件、目录和用户权限管理指南
    koa2+vue3通过exceljs实现数据导出excel文档
    基于Web html的“我的家乡”网站前端设计
    Maven项目分模块开发
    cpu 支持内存带宽与内存最大长度的关系《鸟哥的 Linux 私房菜》
    MySQL视图&导入导出&索引&执行计划
    Python3出现的Error总结
    解锁数据库运维秘籍:掌握AntDB-T动态共享内存,提升进程间通信效率
  • 原文地址:https://blog.csdn.net/zkkzpp258/article/details/127947564