2

Service1 运行在 Node1 Service1 中添加用户数据到 Redis Bucket "UserBucket"

Node2中运行的Service2 Service2需要从Redis Bucket“Users”中获取最新的用户数据

我在 Service2 中维护 org.redisson.api.RedissonClient 的单例实例

最初我的 getCache() 看起来像

private static RMap<String, Map<String,User>> getCache(String bucketName) {
  return redissonCacheClient.getMap(bucketName);
}

然后我查看了 org.redisson.api.RedissonClient 中的 getMap() 实现

return new RedissonMap<K, V>(connectionManager.getCommandExecutor(), name, this, null);

似乎每个 getMap(..) 调用都创建了 RedissonMap(..) 的新实例

所以我现在维护一个 RMap 实例如下(而不是每次都调用 getMap() )......

private static RMap<String, Map<String,User>> getCache(String bucketName) {
        RMap<String, Map<String,User>> userMap;
        if (cacheByOrg.containsKey(bucketName)) {
            userMap = cacheByOrg.get(bucketName);
        } else {
            userMap = redissonCacheClient.getMap(bucketName);
            cacheByOrg.put(bucketName, userMap);
        }
        return geoFenceMap;
    }

但现在我怀疑,我没有从缓存中获取最新数据。

如果有人可以确认 Redisson 客户端的正确用法,那就太好了。

多次调用 getMap() 是否可以(它是否会在内部连接到同一个缓存实例实例以便我始终获取最新数据?如果是,那么创建这么多 RedissonMap 实例可能会导致 OOM / GC 开销?

否则我应该只调用一次并保留一个本地副本吗?

4

1 回答 1

1

github 中的 Redisson Group 证实

每次 redisson.getMap() 调用时,它都会返回一个 RMap 实例。这个实例可以在每个线程之间安全地共享,随意重用。

于 2018-03-05T19:03:09.547 回答