Java并发添加数据,如何保证不会添入相同的数据?

我有这样的业务场景:

一个接口往mysql的user表中insert数据,一个realname字段和一个groupid字段。

我现在想保证realname添入的时候同一group下不能有重复的,但是我现在不能给这两个字段加联合唯一索引。

因为库里realname有很多是空的情况。

问题:

现在我在用大量线程访问这个接口,添加user。这些线程realname如果有相同的,就可能会添入realname一样的数据。

我如何处理才能保证一定不会添入重复数据?不能用synchronized关键字,因为是多机集群部署。

一个服务器保证同步,其他的依然肯定会出现这个问题。

小弟请教各位大神,这种情况如何处理,小弟技术小白一个,请详细一点说明,先谢谢各位了。

每次插入,写个额外线程去查重,如果有重复则删除只剩一个

如果不可以重复的是一个字段的话 可以设为主键 如果不是一个的话只能在insert前检测

这种情况的话,你可以借助于消息队列,比如rabbitmq,或redis的list,即你把你的所有线程的操作不要直接插入数据库,而是先放到消息队列中,再另起一个服务,从消息队列中接收数据并存储。在这个服务上再加一层缓存,把插入过的数据都缓存起来,插入的时候从缓存中查看是否已经存在了。
这样你的业务也不用再等数据库返回了。可以增加处理效率。

在服务启动的时候,要把数据库中已存在的数据加载到缓存中,如果数据量大,可以使用带持久化的缓存,比如redis。