解剖屎山,寻觅黄金之第二弹|天天看热讯

2023-04-12 06:54:20 来源: 程序员客栈

大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重。

在最开始,我的第一版实现是这样的:

publicvoidduplication(TaskInfotaskInfo){//配置示例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}}JSONObjectproperty=JSON.parseObject(config.getProperty(DEDUPLICATION_RULE_KEY,AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT));JSONObjectcontentDeduplication=property.getJSONObject(CONTENT_DEDUPLICATION);JSONObjectfrequencyDeduplication=property.getJSONObject(FREQUENCY_DEDUPLICATION);//文案去重DeduplicationParamcontentParams=DeduplicationParam.builder().deduplicationTime(contentDeduplication.getLong(TIME)).countNum(contentDeduplication.getInteger(NUM)).taskInfo(taskInfo).anchorState(AnchorState.CONTENT_DEDUPLICATION).build();contentDeduplicationService.deduplication(contentParams);//运营总规则去重(一天内用户收到最多同一个渠道的消息次数)Longseconds=(DateUtil.endOfDay(newDate()).getTime()-DateUtil.current())/1000;DeduplicationParambusinessParams=DeduplicationParam.builder().deduplicationTime(seconds).countNum(frequencyDeduplication.getInteger(NUM)).taskInfo(taskInfo).anchorState(AnchorState.RULE_DEDUPLICATION).build();frequencyDeduplicationService.deduplication(businessParams);}


(资料图片)

那时候很简单,基本主体逻辑都写在这个入口上了,应该都能看得懂。后来,群里滴滴哥表示这种代码不行,不能一眼看出来它干了什么。于是怒提了一波pull request重构了一版,入口是这样的:

publicvoidduplication(TaskInfotaskInfo){//配置样例:{"contentDeduplication":{"num":1,"time":300},"frequencyDeduplication":{"num":5}}Stringdeduplication=config.getProperty(DeduplicationConstants.DEDUPLICATION_RULE_KEY,AustinConstant.APOLLO_DEFAULT_VALUE_JSON_OBJECT);//去重DEDUPLICATION_LIST.forEach(key->{DeduplicationParamdeduplicationParam=builderFactory.select(key).build(deduplication,key);if(deduplicationParam!=null){deduplicationParam.setTaskInfo(taskInfo);DeduplicationServicededuplicationService=findService(key+SERVICE);deduplicationService.deduplication(deduplicationParam);}});}

我猜想他的思路就是把构建去重参数和选择具体的去重服务给封装起来了,在最外层的代码看起来就很简洁了。后来又跟他聊了下,他的设计思路是这样的:考虑到以后会有其他规则的去重就把去重逻辑单独封装起来了,之后用策略模版的设计模式进行了重构,重构后的代码 模版不变,支持各种不同策略的去重,扩展性更高更强更简洁

确实牛逼。

我基于上面的思路微改了下入口,代码最终演变成这样:

publicvoidduplication(TaskInfotaskInfo){//配置样例:{"deduplication_10":{"num":1,"time":300},"deduplication_20":{"num":5}}StringdeduplicationConfig=config.getProperty(DEDUPLICATION_RULE_KEY,CommonConstant.EMPTY_JSON_OBJECT);//去重ListdeduplicationList=DeduplicationType.getDeduplicationList();for(IntegerdeduplicationType:deduplicationList){DeduplicationParamdeduplicationParam=deduplicationHolder.selectBuilder(deduplicationType).build(deduplicationConfig,taskInfo);if(Objects.nonNull(deduplicationParam)){deduplicationHolder.selectService(deduplicationType).deduplication(deduplicationParam);}}}

到这,应该大多数人还能跟上吧?在讲具体的代码之前,我们先来简单看看去重功能的代码结构(这会对后面看代码有帮助)

去重的逻辑可以统一抽象为:在X时间段内达到了Y阈值,还记得我曾经说过:「去重」的本质:「业务Key」+「存储」。那么去重实现的步骤可以简单分为(我这边存储就用的Redis):

通过Key从Redis获取记录判断该Key在Redis的记录是否符合条件符合条件的则去重,不符合条件的则重新塞进Redis更新记录

为了方便调整去重的参数,我把X时间段和Y阈值都放到了配置里{"deduplication_10":{"num":1,"time":300},"deduplication_20":{"num":5}}。目前有两种去重的具体实现:

1、5分钟内相同用户如果收到相同的内容,则应该被过滤掉

2、一天内相同的用户如果已经收到某渠道内容5次,则应该被过滤掉

从配置中心拿到配置信息了以后,Builder就是根据这两种类型去构建出DeduplicationParam,就是以下代码:

DeduplicationParamdeduplicationParam=deduplicationHolder.selectBuilder(deduplicationType).build(deduplicationConfig,taskInfo);

Builder和DeduplicationService都用了类似的写法(在子类初始化的时候指定类型,在父类统一接收,放到Map里管理)

而统一管理着这些服务有个中心的地方,我把这取名为DeduplicationHolder

/***@authorhuskey*@date2022/1/18*/@ServicepublicclassDeduplicationHolder{privatefinalMapbuilderHolder=newHashMap<>(4);privatefinalMapserviceHolder=newHashMap<>(4);publicBuilderselectBuilder(Integerkey){returnbuilderHolder.get(key);}publicDeduplicationServiceselectService(Integerkey){returnserviceHolder.get(key);}publicvoidputBuilder(Integerkey,Builderbuilder){builderHolder.put(key,builder);}publicvoidputService(Integerkey,DeduplicationServiceservice){serviceHolder.put(key,service);}}

前面提到的业务Key,是在AbstractDeduplicationService的子类下构建的:

而具体的去重逻辑实现则都在LimitService下,{一天内相同的用户如果已经收到某渠道内容5次}是在SimpleLimitService中处理使用mget和pipelineSetEX就完成了实现。而{5分钟内相同用户如果收到相同的内容}是在SlideWindowLimitService中处理,使用了lua脚本完成了实现。

LimitService的代码都来源于@caolongxiu的pull request,建议大家可以对比commit再学习一番:https://gitee.com/zhongfucheng/austin/pulls/19

1、频次去重采用普通的计数去重方法,限制的是每天发送的条数。

2、内容去重采用的是新开发的基于redis中zset的滑动窗口去重,可以做到严格控制单位时间内的频次。

3、redis使用lua脚本来保证原子性和减少网络io的损耗

4、redis的key增加前缀做到数据隔离(后期可能有动态更换去重方法的需求)

5、把具体限流去重方法从DeduplicationService抽取出来,DeduplicationService只需设置构造器注入时注入的AbstractLimitService(具体限流去重服务)类型即可动态更换去重的方法 6、使用雪花算法生成zset的唯一value,score使用的是当前的时间戳

针对滑动窗口去重,有会引申出新的问题:limit.lua的逻辑?为什么要移除时间窗口的之前的数据?为什么ARGV[4]参数要唯一?为什么要expire?

A: 使用滑动窗口可以保证N分钟达到N次进行去重。滑动窗口可以回顾下TCP的,也可以回顾下刷LeetCode时的一些题,那这为什么要移除,就不陌生了。

为什么ARGV[4]要唯一,具体可以看看zadd这条命令,我们只需要保证每次add进窗口内的成员是唯一的,那么就不会触发有更新的操作(我认为这样设计会更加简单些),而唯一Key用雪花算法比较方便。

为什么expire?,如果这个key只被调用一次。那就很有可能在redis内存常驻了,expire能避免这种情况。

推荐项目

最后再叨叨吧,很多人可能会发一段截图,跑来问我为什么要这样写,为什么要以这种方式实现,能不能以这种方式实现。这时候,我更想看到的是:你已经实现了第二种方式了,然后探讨你写的这种方案好不好,现有的代码差在哪里。

毕竟问问题很简单,我又不是客服,总不能没诚意的问题我都得一一回答吧。

如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。

仓库地址(可点击阅读原文跳转):https://gitee.com/zhongfucheng/austin

我开通了股东服务内容,感兴趣可以点击下方看看,主要针对的是项目哟

VIP服务

标签:

解剖屎山,寻觅黄金之第二弹|天天看热讯

大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。a...

04-12 06:54:20

IMF最新展望:下调今年全球经济增长预期至2.8% 预计中国经济增速为5.2%-时快讯

当地时间4月11日,国际货币基金组织(IMF)发布最新一期世界经济展望称,2023年全球经济增长率为2 8%,然...

04-12 04:56:27

错失美股科技股反弹 主动投资者一季度输给基准指数 环球视点

错失美股科技股反弹主动投资者一季度输给基准指数来源:华尔街见闻  韩旭阳今年3月,银行业危机震动了...

04-11 23:57:40

真木舜一死了没有_真木舜一

1、第一:与夜袭队没有任何关系,他只是一个空军驾驶员,只不过遇上了奈克斯特的光球装上了,而且在新宿...

04-11 21:49:02

华控赛格股东户数下降1.13%,户均持股8.88万元

华控赛格最新股东户数3 93万户,呈现连续3期下降,高于行业平均水平。公司户均持有流通股份2 56万股;...

04-11 20:27:38

小摩增持招商银行约614.84万股 每股作价约39.72港元

联交所最新资料显示,4月3日,小摩增持招商银行(03968)614 8351万股,每股作价39 7156港元,总金额约...

04-11 19:09:10

天天新消息丨7站超2万人参与 西安城马搭建全新路跑生态圈

赛道分布7个区县、开发区,持续时间4个月,线上线下累计参赛市民超过2万……日前结束的西安城墙国际马拉...

04-11 18:09:29

天天速递!CHATGPT浪潮下 看中国大语言模型产业发展

CHATGPT浪潮下看中国大语言模型产业发展

04-11 17:15:56

天天速递!分析|七问独行侠休赛期:留下欧文还是先签后换?湖人还要欧文?

(原文发表于4月8日,作者为SportsNews网站的StephenNoh,文章内容不代表译者观点)去年季后赛打进西部...

04-11 16:43:40

全球报道:十大顶尖双非大学名单-最厉害最有潜力双非一本大学

在国内,除了知名的985和211大学,还存在着一些实力不可小觑的双非大学,尤其是双非排名最靠前的大学。...

04-11 16:04:20

十方面合作!川渝两地人社签署合作协议,建全国高质量充分就业先行区-短讯

4月11日,由川渝两地就业工作领导小组共同主办的第三届成渝地区双城经济圈就业创业活动周在重庆悦来国际...

04-11 15:08:55

代号鸢哪些阵容厉害 代号鸢强力阵容搭配

代号鸢哪些阵容厉害代号鸢强力阵容搭配,

04-11 14:07:40

每日热门:龙爪可以直接吃吗 龙爪适合直接吃吗

1、龙爪可以直接吃,生吃龙爪叶肉,即把鲜龙爪叶切成3厘米至4厘米的段,洗净去皮即可。还可以将龙爪打汁...

04-11 12:40:44

上百名极氪001车主发布联合声明:不想“氪服”必须道歉-当前资讯

快科技4月11日消息,上百名极氪001车主发表了联合声明,针对的是22款座椅相关问题及3月16日前22款、23款权益问题

04-11 12:00:41

Mac 系统有必要安装安全软件吗? 环球关注

首先,我们需要知道苹果电脑有没有病毒,是不是一直在Mac上裸奔。这样危不危险?目前不危险。安装杀毒软...

04-11 11:17:41

四川古蔺:马嘶茶山美如画 苗族同胞采茶忙

这段时间,四川省古蔺县马嘶苗族乡的高山茶进入采收季。茶山上,翠绿的茶垄层层叠叠,茶树争相冒出新芽...

04-11 10:11:16

《黎明杀机》新治疗系统引玩家不满 官方迅速回滚

非对称PvP恐怖游戏《黎明杀机》最近一直在实验全新的治疗系统。新系统下,玩家治疗的时间从16秒延缓至了...

04-11 09:56:13

今日热文:30℃、大暴雨、强对流、雷雨大风!本周长沙天气很“疯狂”

上周末太阳准时出勤体感温度可以用一句话概括“阴的时候有点冷晴的时候又有点热”本周气温还要继续涨!...

04-11 08:58:24

贷款中介玩花样 垫资买房实为骗取经营贷

今年以来,多个城市的新房与二手房成交量有所回暖,刚需置业者和换房的改善型购房者也都越来越多。或许...

04-11 07:53:48

速读:劳动规章制度的内容包括哪些_公司规章制度包括哪些内容

1、公司的管理规章制度包括五个方面:一、公司员工出勤考勤管理制度。2、二、员工岗位责任制。3、三、业...

04-11 05:50:19

快讯2023-04-11 00:48:08-当前头条

4月11日电,墨西哥证券交易所称交易活动已在当地时间上午10点40分恢复。

04-11 01:04:53

短篇CLQST《美妙又欢乐的2周年假面派对》-当前讯息

年糕汤N6烧肉班倾情汉化,汉化内容仅供兴趣爱好、学习交流的个人使用,请勿商用,请不要随意转载、截取...

04-10 21:51:14

天天视讯!天门山跳崖

文 挪威王志文在《黑冰》里的经典独白,大家可能都看过,在一种残酷的框架下,人被分成三六九等,最高...

04-10 20:44:27

甘肃公共资源交易“全省一张网”加快构建_当前关注

央广网兰州4月10日消息(记者李红军)甘肃省政府办公厅日前印发《甘肃省公共资源交易“全省一张网”建设...

04-10 19:14:01

冲上热搜:西湖醋鱼换鱼了!

今天“西湖醋鱼换鱼了”这一话题冲上了热搜网友反映“报吃”(网络用语:不好吃)的西湖醋鱼,在杭帮菜...

04-10 18:23:07

当前要闻:元太科技推出E Ink Kaleido(TM) 3 Outdoor彩色印刷电子纸技术

为户外公共讯息广告牌提供最佳低碳显示解决方案全球电子纸领导厂商EInk元太科技今宣布推出EInkKaleido™...

04-10 17:31:37

山西省发改委等十五个部门联合下文 进一步降低招投标交易担保成本

近日,山西省发改委等15个部门联合印发《关于进一步降低招标投标交易担保成本的若干措施》(以下简称《...

04-10 16:28:00

全球今热点:常州:公积金贷款额度多孩家庭最高增30万 博士最高贷120万

常州:公积金贷款额度多孩家庭最高增30万博士最高贷120万,购房,常州市,大运河,贷款额度,中国文物,住房公...

04-10 15:57:41

今日要闻!4月10日进口大豆到国内港口C&F及升贴水报价金十期货04月10日讯,①美湾大豆(10月船期)C&F价格584美元/吨,与上个交易日相比持平;美西大豆(10月船期)C&F价格584元/吨,与上个交易日相比持平;巴西大豆(5月船期)C&F价格561美元/吨,与上个交易日相比持平。②进口大豆升贴水

4月10日进口大豆到国内港口C&F及升贴水报价金十期货04月10日讯,①美湾大豆(10月船期)C&F价格584美元...

04-10 15:03:49

一季度我国各种自然灾害共造成472.2万人次受灾,直接经济损失25.5亿元

各种自然灾害共造成472 2万人次受灾,因灾死亡39人;倒塌房屋100余间,严重损坏房屋600余间,一般损坏...

04-10 13:39:13

任天成:4.10黄金继续上周未完成的走势关注1977-75支撑点

上周四笔者分析了日线布林带缩口价格价格必定要下跌才能缩口成功周四价格震荡下跌至2000附近后形成小区...

04-10 12:12:40

平顶山市新华区: 业务培训再提升,助力创文更深入

“考试考出来我的业务知识盲点儿,接下来我要加强业务学习。”4月7日下午,平顶山市新华区创文指挥会部...

04-10 11:29:39

粮农组织:全球食品价格连续12个月下降

联合国粮食及农业组织发布的数据显示,截至今年3月,全球食品价格指数已连续12个月下降,较一年前的历史...

04-10 10:37:10

“枪支暴力已成为极右势力针对美国民众的代理人战争”

上月末发生在美国田纳西州纳什维尔市的小学校园枪击案至今余波未消。连日来,美国多地抗议枪支暴力的呼...

04-10 10:06:07

对事实“不止不休”背后,真相与“真相”的距离在哪?

刘佳(长沙理工大学)近段时间,一则大众讨论度居高不下的,名为“疑似中国电科员工痛批领导加班”的聊...

04-10 09:15:37

农村义务教育本科以上学历专任教师达76.01%

农村义务教育本科以上学历专任教师达76 01%

04-10 08:02:28

曝岳云鹏有私生子,连续4年发文送生日祝福,孩子生母首次曝光|全球讯息

4月8日,岳云鹏发的一条微博引发了热议!岳云鹏发文:生日快乐!永远爱你!然而这条突如其来的微博也激...

04-10 06:15:36

风波不止的B站真的出问题了吗? 焦点观察

作者:刘晓洁作为热搜榜常客的B站,在3月发布财报时因“给UP主分了91亿”登上热搜后,刚进入4月又因UP主...

04-10 01:00:35

盱眙怎么读(盱眙怎么读拼音)-全球新资讯

盱眙怎么读_盱眙读音是什么_盱眙龙虾怎么读?如果问,哪里的龙虾最有名?莫过于盱眙龙虾了,在大街上随...

04-09 21:44:13

天天通讯!昌平这6个老旧小区即将启动改造工程

近日,北京市公共资源交易服务平台发布了昌平区2022年第二批老旧小区市政管线改造项目(施工)的消息项...

04-09 19:54:46

锂电产业链一季度延续业绩增长 亿纬锂能单季预盈超10亿

以碳酸锂为代表的锂盐价格持续下调,使得今年以来锂电池产业链景气度较前期高点下行。不过刚刚过去的一...

04-09 18:12:45

好听霸气的网名男大全

1、好听霸气的网名答:青龙会,古龙小说第一神秘组织,其下按农历一年设立分会,分12堂,以月为代号--“正月...

04-09 16:27:21

华大基因:从工具开发、数据生产、信息分析和知识发现的全链条多环节都可引入和开发AI应用

华大基因接受机构调研时表示,目前华大基因合成生产平台已具备多元化解决方案,将iBEST难度基因合成技术...

04-09 14:38:01

父亲生日礼物可以送手表吗

父亲生日礼物可以送手表(送父亲生日礼物)送老爸一个生日礼物,我是学生,手里的一块手表,一根香烟。爸...

04-09 12:37:17

京东拟今年发布千亿级言犀大规模预训练语言模型_新资讯

据报道,京东集团副总裁何晓冬在人工智能大模型技术高峰论坛上表示,针对真实产业需求,京东计划在今年...

04-09 10:53:04

消息称华为盘古系列AI大模型即将上线?知情人士回应:疑似资本炒作

鞭牛士4月9日消息,近期市场频繁传出消息称:“华为云官网即将上线盘古系列AI大模型,分别为NLP大模型、...

04-09 09:09:45

近身保镖笔趣阁_近身保镖叶秋全文阅读|环球观察

1、《近身保镖》里叶秋有9个女人。2、分别是唐果林宝儿沈墨浓宋寓书宋寓言布布克里斯的诺二丫龙女。3、  

04-09 06:58:04

世界最新:剖腹产后多久可以吃东西_剖腹产后吃什么东西好

1 剖腹产后多久能吃东西:6小时内禁食。麻醉会麻痹肠道,导致肠道蠕动减弱。排气(放屁)是肠道蠕动恢复...

04-09 03:51:43

琼海市青少年文化宫2023年春季公益培训班开班 天天滚动

琼海市青少年文化宫2023年春季公益培训班开班

04-08 22:23:24

@重庆车主 6月1日起施行!|环球热资讯

4月7日,公安部召开新闻发布会,公布了10项公安交管服务群众服务发展便利措施。其中,新车上牌免查验试...

04-08 20:08:22

IMF最新展望:下调今年全球经济增长预期至2.8% 预计中国经济增速为5.2%-时快讯
错失美股科技股反弹 主动投资者一季度输给基准指数 环球视点
真木舜一死了没有_真木舜一
华控赛格股东户数下降1.13%,户均持股8.88万元
小摩增持招商银行约614.84万股 每股作价约39.72港元
天天新消息丨7站超2万人参与 西安城马搭建全新路跑生态圈
天天速递!CHATGPT浪潮下 看中国大语言模型产业发展
天天速递!分析|七问独行侠休赛期:留下欧文还是先签后换?湖人还要欧文?
全球报道:十大顶尖双非大学名单-最厉害最有潜力双非一本大学
十方面合作!川渝两地人社签署合作协议,建全国高质量充分就业先行区-短讯
代号鸢哪些阵容厉害 代号鸢强力阵容搭配
每日热门:龙爪可以直接吃吗 龙爪适合直接吃吗
上百名极氪001车主发布联合声明:不想“氪服”必须道歉-当前资讯
Mac 系统有必要安装安全软件吗? 环球关注
四川古蔺:马嘶茶山美如画 苗族同胞采茶忙
《黎明杀机》新治疗系统引玩家不满 官方迅速回滚
今日热文:30℃、大暴雨、强对流、雷雨大风!本周长沙天气很“疯狂”
贷款中介玩花样 垫资买房实为骗取经营贷
速读:劳动规章制度的内容包括哪些_公司规章制度包括哪些内容
快讯2023-04-11 00:48:08-当前头条
短篇CLQST《美妙又欢乐的2周年假面派对》-当前讯息
天天视讯!天门山跳崖
甘肃公共资源交易“全省一张网”加快构建_当前关注
冲上热搜:西湖醋鱼换鱼了!
当前要闻:元太科技推出E Ink Kaleido(TM) 3 Outdoor彩色印刷电子纸技术
山西省发改委等十五个部门联合下文 进一步降低招投标交易担保成本
全球今热点:常州:公积金贷款额度多孩家庭最高增30万 博士最高贷120万
今日要闻!4月10日进口大豆到国内港口C&F及升贴水报价金十期货04月10日讯,①美湾大豆(10月船期)C&F价格584美元/吨,与上个交易日相比持平;美西大豆(10月船期)C&F价格584元/吨,与上个交易日相比持平;巴西大豆(5月船期)C&F价格561美元/吨,与上个交易日相比持平。②进口大豆升贴水
一季度我国各种自然灾害共造成472.2万人次受灾,直接经济损失25.5亿元
任天成:4.10黄金继续上周未完成的走势关注1977-75支撑点
平顶山市新华区: 业务培训再提升,助力创文更深入
粮农组织:全球食品价格连续12个月下降
“枪支暴力已成为极右势力针对美国民众的代理人战争”
对事实“不止不休”背后,真相与“真相”的距离在哪?
农村义务教育本科以上学历专任教师达76.01%
曝岳云鹏有私生子,连续4年发文送生日祝福,孩子生母首次曝光|全球讯息
风波不止的B站真的出问题了吗? 焦点观察
盱眙怎么读(盱眙怎么读拼音)-全球新资讯
天天通讯!昌平这6个老旧小区即将启动改造工程
锂电产业链一季度延续业绩增长 亿纬锂能单季预盈超10亿
好听霸气的网名男大全
华大基因:从工具开发、数据生产、信息分析和知识发现的全链条多环节都可引入和开发AI应用
父亲生日礼物可以送手表吗
京东拟今年发布千亿级言犀大规模预训练语言模型_新资讯
消息称华为盘古系列AI大模型即将上线?知情人士回应:疑似资本炒作
近身保镖笔趣阁_近身保镖叶秋全文阅读|环球观察
世界最新:剖腹产后多久可以吃东西_剖腹产后吃什么东西好
琼海市青少年文化宫2023年春季公益培训班开班 天天滚动
@重庆车主 6月1日起施行!|环球热资讯
云南大理经济技术开发区原三级调研员杨品红接受纪律审查和监察调查 全球新资讯
X 广告
资讯
X 广告

Copyright ©  2015-2023 华夏畜牧网版权所有  备案号:琼ICP备2022009675号-37   联系邮箱:435 227 67@qq.com