问题产生过程描述:
【最近在做一个对接合作方接口业务,该接口返回最近30分钟内的实时订单数据,而我们这边要做的是储存接口返回来的订单数据,且要求我们储存的订单数据必须唯一, 不能有冗余。然后我们根据这一业务要求进行的设计是,系统每1分钟定时去调用接口以获取接口数据,然后把返回的订单信息保存。那么现在问题来了,因为接口返回的是最近30分钟内的订单数据,而我们系统是定时每1分钟去调用,如18:55分去调用接口,返回的是18:25至18:55分时间内的订单信息。1分钟后,也就是18:56分又去调用接口,接口返回18:26至18:56分的订单数据。那么怎么防止插入重复数据】
解决方案:
【我们把保存该订单信息的表的订单号字段设置成唯一索引。那每次插入重复数据的时候就不会重复插入了】
问题:
除了如上利用唯一索引方式是否还有更高效的解决方案?
3 回答
慕姐4208626
TA贡献1852条经验 获得超7个赞
如果你只是单一的防重,可以把订单号放入redis中,下次获取的时候比对一下缓存就可以了。既然你是需要最近30分钟内的实时订单数据,为何不每30分钟去获取一次。
慕斯709654
TA贡献1840条经验 获得超5个赞
如果你的系统是在一个单机上运行的后台的batch job(每分钟运行一次),你只要定义一个全局变量把每次存储到数据库的最后一个订单id存起来,如果你是按顺序存储订单。然后把get回来的订单list里面订单号在那个全局变量之前的订单都过滤掉,只存储订单后在那个全局变量之后的订单,并记得每存一次订单都update一个那个全家变量。如果系统是第一次启动,可以从数据库load出那个最大的订单号并存在那个全局变量里。最后,为了保持数据库的完整性和一致性,你最好还是把要订单号字段设置成唯一索引。
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
这个本来就是考虑入时防重复,而不是出时防重复.而至于出时的数据重读问题,每个订单肯定有个独立特征,比如时间戳,ID等,比如第一次取出1-10,那么以10为基点,第二次从10开始不就行了?
添加回答
举报
0/150
提交
取消