素材牛VIP会员
求存储数据高效过滤重复数据决解方案
 65***14  分类:Java代码  人气:1262  回帖:3  发布于6年前 收藏

问题产生过程描述:

【最近在做一个对接合作方接口业务,该接口返回最近30分钟内的实时订单数据,而我们这边要做的是储存接口返回来的订单数据,且要求我们储存的订单数据必须唯一, 不能有冗余。然后我们根据这一业务要求进行的设计是,系统每1分钟定时去调用接口以获取接口数据,然后把返回的订单信息保存。那么现在问题来了,因为接口返回的是最近30分钟内的订单数据,而我们系统是定时每1分钟去调用,如18:55分去调用接口,返回的是18:25至18:55分时间内的订单信息。1分钟后,也就是18:56分又去调用接口,接口返回18:26至18:56分的订单数据。那么怎么防止插入重复数据】

解决方案:

【我们把保存该订单信息的表的订单号字段设置成唯一索引。那每次插入重复数据的时候就不会重复插入了】

问题:

除了如上利用唯一索引方式是否还有更高效的解决方案?

讨论这个帖子(3)垃圾回帖将一律封号处理……

Lv5 码农
阿***t JS工程师 6年前#1

这个本来就是考虑入时防重复,而不是出时防重复.而至于出时的数据重读问题,每个订单肯定有个独立特征,比如时间戳,ID等,比如第一次取出1-10,那么以10为基点,第二次从10开始不就行了?

Lv6 码匠
wo***fp CEO 6年前#2

如果你只是单一的防重,可以把订单号放入redis中,下次获取的时候比对一下缓存就可以了。既然你是需要最近30分钟内的实时订单数据,为何不每30分钟去获取一次。

Lv5 码农
ni***07 UI设计师 6年前#3

如果你的系统是在一个单机上运行的后台的batch job(每分钟运行一次),你只要定义一个全局变量把每次存储到数据库的最后一个订单id存起来,如果你是按顺序存储订单。然后把get回来的订单list里面订单号在那个全局变量之前的订单都过滤掉,只存储订单后在那个全局变量之后的订单,并记得每存一次订单都update一个那个全家变量。如果系统是第一次启动,可以从数据库load出那个最大的订单号并存在那个全局变量里。最后,为了保持数据库的完整性和一致性,你最好还是把要订单号字段设置成唯一索引。

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取