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
總結
以上是生活随笔為你收集整理的redis实现对账(集合比较)功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玉溪多少钱一条啊?
- 下一篇: 糖心和东海龙女哪个好看?