背景:项目要统计分公司和总公司四个业务模块的用户数,关键还要根据用户数去重。
方案一:
写一个sql,这个sql包括四个业务的数据
如:
select count(1) from (
select DISTINCT(user_id) from yw1 where fgsdm=?
union
select DISTINCT(user_id) from yw2 where fgsdm=?
union
select DISTINCT(user_id) from yw3 where fgsdm=?
union
select DISTINCT(user_id) from yw4 where fgsdm=?
)as temp
循环分公司列表,统计每个分公司的数据,在保存到统计表里
优点:
逻辑简单
缺点:
如果表数据量很大,分公司越来越多的话,那这个效率就会变的很低。
方案二:
每次分页获取四个业务模块的数据列表,循环调用redis的PFADD方法
优点:
取部分数据,效率高,数据库压力小,PFADD有批量的方法
缺点:
数据统计有一定的误差,(如果对数据要求没那么高可以使用),逻辑相对复杂
方案三:
每次分页获取四个业务模块的数据列表,循环调用redis的SETBIT方法
优点:
取部分数据,效率高,数据库压力小
缺点:
SETBIT没有批量方法,每次调用redis,IO消耗多(不建议使用),逻辑相对复杂
方案四:
每次分页获取四个业务模块的数据列表,调用redis的lua脚本,lua脚本循环调用SETBIT方法
优点:
取部分数据,效率高,数据库压力小,IO消耗小
缺点:
逻辑相对复杂
这边推荐使用方案四,在数据量不大的场景下也可以使用方案一。
方案四实现教程:传送门
注意:本文归作者所有,未经作者允许,不得转载