1. Guava Cache 介绍


  • Guava Cache 是 google guava 中的一个内存缓存模块,用于将数据缓存到 JVM 内存中。
  • 使用场景
    • 愿意消耗一些内存空间来提升速度。
    • 预料到某些键会被查询一次以上。
    • 缓存中存放的数据总量不会超出内存容量。
  • Guava Cache 是单个应用运行时的本地缓存。它不把数据存放到文件或外部服务器。

2. 工具简单使用


1. pom.xml 文件中添加依赖

  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>27.0.1-jre</version>
  5. </dependency>

2. 创建 pojo 用户类

  1. package com.study.cache.java.pojo;
  2. import java.io.Serializable;
  3. /**
  4. * 用户实体类
  5. * @author 华夏紫穹
  6. */
  7. public class User implements Serializable {
  8. private String userName;
  9. private String userId;
  10. public User(String userName, String userId) {
  11. this.userName = userName;
  12. this.userId = userId;
  13. }
  14. public String getUserName() {
  15. return userName;
  16. }
  17. public String getUserId() {
  18. return userId;
  19. }
  20. public void setUserId(String userId) {
  21. this.userId = userId;
  22. }
  23. @Override
  24. public String toString() {
  25. return userId + " --- " + userName;
  26. }
  27. }

3. guava cache 简单使用实例

  1. package com.study.cache.java.guava;
  2. import com.google.common.cache.*;
  3. import com.study.cache.java.pojo.User;
  4. import java.util.concurrent.ExecutionException;
  5. import java.util.concurrent.TimeUnit;
  6. /**
  7. * gvava cache 简单使用
  8. * @author 华夏紫穹
  9. */
  10. public class GuavaCacheDemo {
  11. public static void main(String[] args) throws ExecutionException {
  12. // 缓存接口这里是 LoadingCache,LoadingCache 在缓存项不存在时可以自动加载缓存
  13. LoadingCache<String, User> userCache
  14. // CacheBuilder 的构造函数是私有的,只能通过其静态方法 newBuilder() 来获得 CacheBuilder 的实例
  15. = CacheBuilder.newBuilder()
  16. // 设置并发级别为 8,并发级别是指可以同时写缓存的线程数
  17. .concurrencyLevel(8)
  18. // 设置写缓存后 8 秒钟过期
  19. .expireAfterWrite(8, TimeUnit.SECONDS)
  20. // 设置写缓存后 1 秒钟刷新
  21. .refreshAfterWrite(1, TimeUnit.SECONDS)
  22. // 设置缓存容器的初始容量为 10
  23. .initialCapacity(10)
  24. // 设置缓存最大容量为 100,超过 100 之后就会按照 LRU 最近最少使用算法来移除缓存项
  25. .maximumSize(100)
  26. // 设置要统计缓存的命中率
  27. .recordStats()
  28. // 设置缓存的移除通知
  29. .removalListener(new RemovalListener<String, User>() {
  30. @Override
  31. public void onRemoval(RemovalNotification<String, User> removalNotification) {
  32. System.out.println(removalNotification.getKey() + " 被移除了,原因:" + removalNotification.getCause());
  33. }
  34. })
  35. // build 方法中可以指定 CacheLoader,在缓存不存在时通过 CacheLoader 的实现自动加载缓存
  36. .build(
  37. new CacheLoader<String, User>() {
  38. @Override
  39. public User load(String key) throws Exception {
  40. System.out.println("缓存没有时,从数据库加载 " + key);
  41. // TODO jdbc 的代码
  42. return new User("purplesky" + key, key);
  43. }
  44. }
  45. );
  46. // 第一次读取
  47. for (int i = 0; i < 20; i ++) {
  48. User user = userCache.get("uid" + i);
  49. System.out.println(user);
  50. }
  51. // 第二次读取
  52. for (int i = 0; i < 20; i ++) {
  53. User user = userCache.get("uid" + i);
  54. System.out.println(user);
  55. }
  56. System.out.println("cache stats: ");
  57. System.out.println(userCache.stats().toString());
  58. }
  59. }