在这种情况下,将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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...