2017-07-18 18 views
0

我想存储{organizationId, userId} -> userEmail的缓存,但我可以使用的API返回给定组织的所有电子邮件。只要我得到所有这些数值,在CacheLoader::load的调用期间安全地存储它们是否安全?在CacheLoader :: load调用期间更新Guava缓存中不相关的值是否安全?

private final LoadingCache<Pair<UUID, UUID>, String> emailCache = CacheBuilder 
     .newBuilder() 
     .maximumSize(10000) 
     .build(new CacheLoader<Pair<UUID, UUID>, String>() { 
      @Override 
      public String load(final Pair<UUID, UUID> key) throws Exception { 
       final UUID orgId = key.getValue0(); 
       final List<User> users = remoteService.getAllUsers(orgId); 
       final Map<Pair<UUID, UUID>, String> updates = new HashMap<>(); 
       for (User user : users) { 
        updates.put(Pair.with(orgId, user.getId()), user.getEmail()); 
       } 

       // is this safe? 
       emailCache.putAll(updates); 

       return updates.get(key); 
      } 
     }); 
+0

也许改为使用orgId作为键和不可变映射作为值。然后根据地图的大小使用一个秤。这可以让你保留大量的项目,但驱逐整个地图,并可能消耗太多的空间来进行低值映射。 –

回答

2

不,它不是,因为这会导致比赛。另一方面,使用CacheLoader.loadAll来做到这一点是安全的,它具体说明它可以返回比请求更多条目的地图。

相关问题