如何解决在这种情况下,将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的原子性也仍然允许创建一个条目。然后,在使用计算方法之后,我可以将该条目保存到数据库中。
这种方法的缺点是:
请问还有其他选择吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。