現狀:每日在進行系統之間的訂單對賬時,往往是這樣的操作流程;
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