如何使用google guava cache创建缓存?

x33g5p2x  于2022-09-21 转载在 Go  
字(3.5k)|赞(0)|评价(0)|浏览(660)

创建普通缓存很简单,但是如果数据的数据结构很复杂,我们需要一个Cache来缓存。

在云原生应用开发中,微服务对于某些主数据是相互依赖的。获取信息意味着发送HTTP请求,当客户端微服务非常频繁地需要数据并且数据源是另一个微服务时,必须进行非常频繁的HTTP请求。这会导致客户端微服务中的处理延迟。由于这些原因,将主数据缓存在不经常更改的客户端微服务中是有意义的。虽然这种实现不仅适用于云原生开发中的微服务,而且可以用于任何类型的应用程序。

在这篇文章中,我将展示如何实现缓存的缓存。缓存的缓存是一个通用的番石榴缓存,其中键是字符串,值是其他番石榴缓存。这些作为值的番石榴缓存也有键值对。键和值可以是任何类型。这里缓存的缓存是 CacheManager 中的 cacheMap。内部缓存定义为 Cache<K,V>。这就是为什么缓存管理器是通用的,可以用来保存任何类型的键值对。 CacheManager 中的 getEntityCache() 方法从 cacheMap 中检索缓存。如果给定 entityId 的缓存不存在,则创建它并将其添加到 cacheMap 然后返回。

CacheManager<K,V> 类

  1. import com.google.common.cache.Cache;
  2. import com.google.common.cache.CacheBuilder;
  3. /** manages a set of caches where each instance of cache belongs to exactly one entity=manager
  4. * @param <K> - type of key
  5. * @param <V> - type of cache object
  6. */
  7. public class **CacheManager****<****K****,****V****>** {
  8. public static final int maxSize = 1024;
  9. protected final Cache<String , Cache<K,V>> cacheMap;
  10. private boolean isWeekKeys;
  11. public CacheManager() { this(false);}
  12. public CacheManager(boolean isWeekKeys) { this. isWeekKeys = isWeekKeys ;}
  13. /** returns a user/manager specific instance of cache
  14. * @param entityId user/manager
  15. */
  16. public Cache<K,V> getEntityCache(String entityId) {
  17. Cache<K,V> entityCache = cacheMap.getIfpresent( entityId );
  18. if( entityCache == null) {
  19. entityId = entityId.intern() //do not remove inturn()
  20. synchronized(entityId) {
  21. entityCache = cacheMap.getIfPresent(entityId);
  22. if( entityCache == null ) {
  23. final CacheBuilder builder = CacheBuilder.newbuilder().maximumsize(256);
  24. if(isWeekKeys) {
  25. builder.weakKeys();
  26. }
  27. entityCache = builder.build();
  28. cacheMap.put(entityId, entityCache);
  29. }
  30. }
  31. }
  32. return entityCache;
  33. }
  34. }

现在我们将使用这个通用的 CacheManager 来实现一个 EmployeeCacheManager。 EmployeeCacheManager 代表组织中的经理列表。缓存中的每个经理都拥有为他们工作的员工列表。管理者由缓存的缓存的键表示,它是字符串,员工是缓存的缓存的值。内部缓存(员工)中的每个元素都由一个 Sting 键表示,该键是employeeId,内部缓存的值是员工对象。

EmployeeCacheManager

  1. import com.google.common.cache.Cache;
  2. import EmployeeCacheManager.Employee;
  3. public class **EmployeeCacheManager** extends CacheManager<String, Employee> {
  4. public String getEmployeeAddress(String managerId, String employeeId) {
  5. Cache< String, Employee > employeeCache = getEntityCache(managerId);
  6. Employee employee = getEmployee(employeeCache, employeeId);
  7. String address = getEmployeeAddress(employee);
  8. return address;
  9. }
  10. public void setEmployeeAddress(String managerId, String employeeId, String address) {
  11. Cache< String, Employee > employeeCache = getEntityCache(managerId);
  12. Employee employee = getEmployee(employeeCache, employeeId);
  13. setEmployeeAddress(employee, address);
  14. }
  15. public Employee getEmployee(Cache< String, Employee > employeeCache,
  16. String employeeId) {
  17. Employee employee = employeeCache.getIfPresent( employeeId );
  18. if( employee == null) {
  19. synchronized( employee ) {
  20. employee = employeeCache.getIfPresent( employeeId );
  21. if( employee == null) {
  22. employee = new Employee(employeeId);
  23. employeeCache.put( employeeId , employee);
  24. }
  25. }
  26. }
  27. return employee;
  28. }
  29. public String getEmployeeAddress(Employee employee) {
  30. return employee.getAddress();
  31. }
  32. public void setEmployeeAddress( Employee employee, String address ) {
  33. employee.setAddress(address);
  34. }
  35. public class **Employee** {
  36. String name;
  37. String address;
  38. String id;
  39. public class Employee(id) { this.id = id;}
  40. public String getName() {return this.name;}
  41. public String getAddress() {return this.address;}
  42. public String getId() {this.id;}
  43. public void setName(String name) {this.name = name;}
  44. public void setAddress(String address) {this.address = address;}
  45. }
  46. }

EmployeeCachecreator

此类创建 EmployeeCacheManager 的一个实例。

  1. public class **EmployeeCachecreator** {
  2. public static void main(String[] args) {
  3. EmployeeCacheManager cacheManager = new EmployeeCacheManager();
  4. cacheManager.setEmployeeAddres("M111", "E111", "adress");
  5. String address = cacheManager.getEmployeeAddres("M111", "E111");
  6. }
  7. }

相关文章

最新文章

更多