之前有个扫码下载文件需求,由于要同时进行记录下载人的记录。一开始用的是异步进行日志记录。发现有的用户扫码下载了一次文件,日志记录了三条。这种很容易联想到是因为网络抖动造成的。
问题代码
由于日志记录是异步的,文件下载需要时间。同时发 3 个请求过来,日志会进行记录三次,而文件只会下载一个。
//保存日志
tabDzzzhzService.saveDownLog();
//下载文件
shortLinkGenerator.downFile();
优化后的代码
利用 Consumer 函数解决。当文件下载完成后,触发我们的回掉函数,进行日志记录。从而解决问题。
Consumer、Function区别,前者不带返回值,后者带返回值
其他应用场景
先查缓存,有数据返回缓存值,没数据查 db,返回 db 中的数据。之前有个系统很多地方用到了缓存。每次都重复上面的步骤很烦,于是乎自己写了个工具类封装了一下。
源码
Consumer、Function接口在很多框架的源码中也应用甚广,就不一一列举了