微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在这种情况下,将ConcurrntHashmap用作缓存是否正确?

如何解决在这种情况下,将ConcurrntHashmap用作缓存是否正确?

嗨,我正在尝试构建服务,但是遇到并发问题,因此寻求您的帮助。我们将此服务称为B。它的上游称为ServiceA。A有数十个实例,每个实例将向B发送相同类型的请求。该请求包含以下字段:

public class request {
    int major;
    int minor;
    int macro;
    /* many other fields */
}

B就像过滤器一样工作:如果两个请求的主,次和宏字段包含相同的值,则尽管其他字段可能有所不同,但它们被认为是重复的。预计B会记住这些请求来自何处,并且仅将一个请求传递给下游服务C。当C将响应发送回去时,B应将其转发到所有请求者地址。

起初,我正在考虑使用组合键@Embeddable和@EmbeddedId。但是这种方法存在严重的重复键问题:当两个重复的请求同时到达时,则只会在数据库中创建一个记录。参考:spring data jpa composite key duplicate key record insertion resulting in update

然后我正在考虑使用ConcurrentHashMap作为缓存:键是一个包含major,minor和macor的类。值是请求者的IP地址和其他字段。基于此线程(How to add new member in ConcurrentHashMap<String,List<String>> without synchronized or lock),我可以使用原子的计算方法。即使两个请求可能同时到达,ConcurrentHashMap的原子性也仍然允许创建一个条目。然后,在使用计算方法之后,我可以将该条目保存到数据库中。

这种方法的缺点是:

  1. 在内存缓存中,数据库可能不同步:官方文件说计算方法必须很小,所以我想使用Async方法来更新数据库中的条目。
  2. 我需要创建更多的类:键是一个类,Value是另一个类,等等。

请问还有其他选择吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。