首页 > redis实现对账(集合比较)功能

redis实现对账(集合比较)功能

现状:每日在进行系统之间的订单对账时,往往是这样的操作流程; 

1.从外部系统拉取数据存入本地数据库; 

2.查询本地订单数据集合localSet; 

3.查询外部系统订单数据集合outerSet; 

4.以本地localSet为基准,对照outerSet,进行遍历,将数据不一致(金额、状态等),或者localSet存在而outerSet不存在的数据,放入新集合localDiffSet; 

5.以外部outerSet为基准,对照localSet,进行遍历,将数据(金额、状态等)不一致,或者outerSet存在而localSet不存在的数据,放入新集合outerDiffSet; 

6.将localDiffSet与outerDiffSet的数据,存入差异账表 

问题: 

当比对数据无限多,数据全部在JVM中比对,对服务器的影响就比较大,执行效率也低下;

——redis解决方案

步骤一:外部系统数据拉取入库 

步骤二:从数据库查询需要比对的数据,本地数据(localSet),外部系统数据(outerSet)

//---查询订单信息,组成字符串
SELECT CONCAT(order_no,','outer_order_no,',',trans_amount,',',status) FROM `order_info` where create_time BETWEEN '2015-12-01 00:00:00' and  '2015-12-31 23:59:59'; 

为什么组合成字符串,而不是object对象;因为我们届时要比对的信息就是上述字段,如果字符串一致,那么就说明订单信息一致,而不用再去一一比对对象的属性; 

步骤三:将localSet与outerSet分别存入redis

//相关函数:redis.clients.jedis.JedisCluster.sadd(String key, String... member)
redisClusterUtils.sadd("{account}:localSet", "GM002215120800002,0.01,3","GM002215120800003,0.01,3");
redisClusterUtils.sadd("{account}:outerSet", "CZ001215120800010,0.01,3","CZ001215120800013,0.01,1");

注意点:这里的key,必须要用{}形式,来指定,使我们要比对的集合都处于同一slot,不然在稍后比对时会出现异常:

No way to dispatch this command to Redis Cluster because keys have different slots.

步骤四:进行2个集合的比对,得出交集union,将交集放入key”{account}:union”中

redisClusterUtils.sinterstore("{account}:union", "{account}:localSet", "{account}:outerSet");

步骤五:localSet和outerSet分别与交集进行比较,得出差集{account}:localDiff、{account}:outerDiff

redisClusterUtils.sdiffstore("{account}:localDiff", "{account}:localSet", "{account}:union");
redisClusterUtils.sdiffstore("{account}:outerDiff", "{account}:localSet", "{account}:union");

步骤六:将差集的数据存入数据库差异账表

//--获取差集的每个成员
redisClusterUtils.smembers("{account}:localDiff");
redisClusterUtils.smembers("{account}:outerDiff");

 

关于redis集合(Set)操作的的相关命令,Redis集合命令相关资料

转载:https://blog.csdn.net/qq_33144861/article/details/79467888

转载于:https://www.cnblogs.com/duanxz/p/9203651.html

更多相关:

  • 本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...

  • 我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...

  • 作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...

  • 这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...

  • 这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...