2017-08-16 55 views
0

我正在使用允许用户更改显示名称的帐户系统。要完成此操作,每个用户都有一个UUID。在我的程序中的不同点,我可能有一个UUID,并希望它的当前显示名称,或者我可能有一个当前的显示名称,我想查找UUID。查找它涉及数据库调用或http请求,所以我想将结果缓存在内存中。我熟悉Guava's LoadingCache,但似乎我必须创建两个缓存(名称 - > UUID和UUID - >名称)才能完成此操作。 This seems bug-prone, similar to how a BiMap is better than two synchronous maps有没有类似于双向的LoadCache那里?类似于番石榴的LoadingCache,但双向?

+0

两个用户可以有相同的显示名称吗?如果是这样,那么你的反向查找必须以某种方式处理,而不是一对一。您可能想要使用显示名称隐藏ID。 –

回答

1

对于这种情况,我不一定担心一对缓存容易出错:您不必担心这两个方向是同步的,如果不这样做,就不会有真正的失败。 UUID及其与用户的关系不会改变。

保持双向缓存正确同步是困难的,但在这种情况下,它似乎是矫枉过正。

+0

不够公平,我想我主要关心的是查询UUID - >名称,并在询问同名UUID后不久。我不想去查找我已经拥有的信息(虽然是在另一个缓存中倒退) – ThankThePhoenicians

+1

这种竞争条件有些不可避免,但是您可以通过执行'putIfAbsent'在反向缓存中。你将会有比赛,而且他们会导致比你想要的更多的问题,但是他们会是良性的比赛,如果有可能的话,更好的比赛会变得非常复杂。 –