解剖屎山,寻觅黄金之第二弹_每日热讯
大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。a...
2023-03-25大家好,我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);privatefinalMap serviceHolder=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...
2023-03-251、腹痛腹泻的症状一般是肠炎引起的。2、腹痛剧烈时,可服用6542或颠茄片。3、这种药可以解除平滑肌痉挛...
2023-03-25豫能控股:关于发行股份及支付现金购买资产并募集配套资金暨关联交易2022年度业绩承诺实现情况的公告
2023-03-241、《懒妃之魔王霸爱》,作者是默女;2、《邪王的懒妃》,作者是落声;3、《倾城第一懒妃》,作者是洛骅...
2023-03-24在刚刚的前瞻特别节目中,《崩坏:星穹铁道》官宣游戏未来将登陆PS平台,并放出了一段本作PS5版的实机演...
2023-03-24金山词霸2007破解教程,金山词霸2007激活这个很多人还不知道,现在让我们一起来看看吧!1、你去下载一个...
2023-03-243月23日,中国移动发布2022年全年业绩:营运收入达9373亿元,同比增长10 5%,其中通信服务收入达8121亿...
2023-03-24“就像其他网购一样,售电公司是卖家,在平台创建店铺。我们是买家,可以轻松对比店铺和套餐。”广东省...
2023-03-24导语:大家可以发现,目前智能手机的市场中基本上都是四核手机占领了主要的地位,非四核手机好像已经没...
2023-03-24福莱特玻璃(06865)明显回升,午后升约7%。小摩称,将福莱特玻璃今明两年盈利预测各上调1%及11%,以反映...
2023-03-241、歌词“偏偏喜欢你爱你没道理”出自歌曲《爱不停息》其中的一句歌词,歌手施贵华。2、施贵华演唱的单...
2023-03-24浙江杭州,女生未觉(笔名)做的国风家宴极具观赏性。未觉称,自己是个普通的上班族,做菜和雕刻都是业...
2023-03-24经典回顾|2018年8月25日,那不勒斯在2018 19赛季意甲联赛第2轮比赛中主场3-2击败AC米兰。在前50分钟两...
2023-03-24多重积极因素有望推动险资加速入市,险资,险企,a股,加仓,固收,资产配置
2023-03-24“五社联动”谋服务多元统筹惠民生
2023-03-24全球光电子信息卓越工程师在光谷巅峰对决---湖北日报讯(记者张真真、马文俊、通讯员东新才)3月23日,...
2023-03-241、直接食用。是最简单又好吃的方法。方法:把火龙果从中间切成两半,用小勺吃里面的果肉。2、做成水果...
2023-03-241、应当在5日内进行审查,对不符合本法规定的行政复议申请,决定不予受理。2、并书面告知申请人;对符合...
2023-03-24今天小编肥嘟来为大家解答以上的问题。名词变复数的规则有哪些,名词变复数相信很多小伙伴还不知道,现在...
2023-03-241、dnf守护珠怎么合成:首先我们要去到公会基地,公会基地入口在艾尔文防线的铁匠林纳斯右边,靠近的时...
2023-03-23CFi CN讯:奇精机械(股票代码:603677)公布2022年年度报告摘要。2022年2021年本年比上年增减(%)2020...
2023-03-23如何在高德地图上设置卡车导航?1 打开手机上的高德地图软件,进入主界面,点击左上角的个人头像,如下...
2023-03-23众安在线发布2022年度报告:承保盈利3 29亿元,同比增长338%
2023-03-23三国杀里杨修共有两个技能,分别为:1、啖酪。每当包含你在内的至少两名角色成为锦囊牌的目标后,你可以...
2023-03-23交易商品牌 产地交货地最新报价R134a 产品等级:优级品;含量,w%:≥99 9%;浙江巨化股份有限公司巨化股...
2023-03-23春意盎然,喜讯频至,宏文学校上海校区学子们的Offer纷至沓来,升学成果遍地开花!据了解,2023宏文学校...
2023-03-23《科创板日报》23日讯,对于百度文心一言的文生图功能是套壳的质疑,亚洲视觉科技研发总监陈经表示,“...
2023-03-23欢迎观看本篇文章,小勉来为大家解答以上问题。2020年12生肖运势解析,12生肖2020具体运势很多人还不知...
2023-03-23天龙集团(300063)03月23日在投资者关系平台上答复了投资者关心的问题。
2023-03-23就业指导可分为狭义和广义两大类。1、狭义的就业指导,是给要求就业的劳动者传递就业信息,做劳动者和用...
2023-03-23人民网北京3月22日电(记者李红梅)22日10时,中央气象台发布今年首个强对流天气预警,强对流天气影响区...
2023-03-23三月的初春时节,忍不住就想起了江南,想起了古镇的恬静与悠闲。小红书@遛狗局氤氲的晨雾漫过蜿蜒的河道...
2023-03-23本文转自:西海都市报青海省藏医院养生保健科治未病服务提升患者健康管理水平科室医生学习交流。本组图...
2023-03-231、咬肌肥大最好的治疗方法是注射肉毒杆菌毒素,即肉毒杆菌毒素,利用麻痹肌肉达到禁用萎缩的目的,使原...
2023-03-221、世界之窗:早上九点开门。世界之窗,国家五A级旅游景区,位于中国广东省深圳市南山区华侨城,为中国...
2023-03-22海南网台、视听海南客户端03月22日消息(海南新闻联播记者陈明东通讯员武明王嘉琳唐茜陈伟)3月22日,民...
2023-03-22平安年金险5%复利划算吗?一、从保险公司角度来看,平安是一家具有较高信誉度的保险公司,其在行业内拥...
2023-03-22如下解答:二手发烧音响。其实在懂音响器材的人群里,二手音响反而是最好的。音响设备,全新拆箱的设备不...
2023-03-221、贝多芬身残志坚的励志故事 贝多芬是世界著名的音乐家,也是命运最糟的一个。2、童年,贝多芬是在...
2023-03-22近日,在高新区大华社区时常能看到身着红马甲的志愿者捡拾垃圾、擦拭广告牌、摆放共享单车……“巩固创...
2023-03-22资本市场狂潮涌,光伏企业上市忙。3月20日,全球逆变器龙头古瑞瓦特(GrowattTechnologyCo ,Ltd)向港交...
2023-03-22日本名将张本智和伊藤美诚早就表示2022年不会在新乡夺冠,今年他们肯定会在中国夺冠,主场击败中国乒乓...
2023-03-223月21日,游人在江苏省兴化市千垛菜花景区乘船游览(无人机照片)。 最近,我国多地春暖花开,人们纷...
2023-03-221、区始建于2011年,分三期阶段性建设。2、全园占地面积800余亩,首期占地300余亩。3、涵盖了现代高科技...
2023-03-22近日,网传南华大学一男生造女同学黄谣,P女同学不雅图片牟利。今早,南华大学官博通报称:关于网传何某...
2023-03-221、咖喱酱申请到了学校宿舍。2、2、张伟一直想着去柏林的洪堡大学当一年的国际交换生的女友大力。3、3、...
2023-03-21国际在线报道(记者吴倩):外交部发言人汪文斌21日在例行记者会上表示,中方注意到哈萨克斯坦顺利举行...
2023-03-211、在新媒体的概念下,围绕着楼宇展开的一系列的广告活动。2、其中包括楼宇户外超大液晶屏、电梯等候区...
2023-03-21原标题:徒步检查和无人机高空勘察结合应对“桃花水”侵犯铁路线“近期积冰积雪加速融化,我们要加强检...
2023-03-21“川沙妲己”玲娜贝儿可以说是热搜常客但是昨天的两个热搜却上得有些奇怪相关话题在网上发酵了一天但很...
2023-03-21苹果iPhone15Pro设计图曝光今天的热度非常高,现在也是在热搜榜上了,那么具体的苹果iPhone15Pro设计图...
2023-03-21金价持续飙升,罗湖水贝掀起“淘金热”!,水贝,金价,购金,周大生,罗湖区,现货黄金
2023-03-21据罗马诺报道,曼联准备与边锋佩利斯特里谈续约。曼联主帅滕哈赫最近在接受采访时称赞了佩利斯特里,他...
2023-03-21既然所有的开发模型都具有相同的开发周期,那不同的开发模型的差别从哪里体现呢?或者说不同的开发模型...
2023-03-21研究院研究员杨胜云在中评智库基金会主办的《中国评论》月刊2月号发表专文《拜登政府对华战略转型对台海...
2023-03-201、今天做一个匠魂mod的教程吧,个人觉得它是一个比较有意思的mod。2、※采用的版本 >铭刻(Writable)
2023-03-20“浪漫樱花富美鹤城”第九届中国(鹤壁)樱花文化节将于2023年4月2日盛大启幕。与往届樱花文化节相比,...
2023-03-20一、农村征地新有哪些变化农村征地新有的变化是:农村征地过程中所占用的宅基地和房屋的补偿款都将归村...
2023-03-20羊肉切碎胡椒,生姜,香叶和肉桂米,300克,在水中煮三分钟,让刚刚煮好的汤冷却,每次加入一些搅拌,直...
2023-03-20◆酒企动态 岩石股份发布员工持股计划,筹资总额不超6035万元 3月16日,上海贵酒股份有限公司(股...
2023-03-20螺纹,需求释放较好,基建需求托底支撑,供需矛盾暂不突出,长流程供应增量仍有空间,库存加速去库,短...
2023-03-20青岛新闻网3月19日讯(记者陈志伟刘文超)今晚,“青岛工商银行杯”2023年全国春季游泳锦标赛开幕仪式在...
2023-03-201、去拼音福,组字如下:2、一个人去开会[dndofhu]3、单刀:刀,指一个人。原来,蜀将关羽只带了一把刀...
2023-03-20三局激战75分钟!陈雨菲惜败韩国名将,全英赛遗憾收获亚军,韩国,陈雨菲,全英赛,大满贯,全英公开赛,羽毛...
2023-03-191、vivoX60系列采用vivo和蔡司联合研发的光学镜头,并继承升级拍摄黑科技微云台,拍摄能力毋庸置疑。VivoX60
2023-03-19邹涛:警察“安全员”点亮矿区平安“灯”
2023-03-191、意思是:农历二月,村子前后青草渐渐发芽生长,黄莺飞来飞去。2、杨柳的枝条轻拂着堤岸,在水泽和草...
2023-03-191、2018年一元硬币直径为:25mm,重量为:6克。2、第四套硬币成分及规格如下:3、1角硬币:铝合金(1999)、
2023-03-191、《英国黑室》深入挖掘了第二次世界大战期间作为“英国黑室”的布莱奇利庄园的秘密历史,书中对庄园核...
2023-03-191、同学你好,很高兴为您解答! 您好,以前都是三年,但是今年改革了,变成了五年。2、 希望我的...
2023-03-181、五年级什么即景作文1 随着秋天的到来,我们来到了一望无际的田野。2、 刚到田野映入我们眼帘的...
2023-03-18这个周末将决定瑞信命运,2008会不会重演?
2023-03-181、就是指网站的看的人流量大不大。2、点击率是指点击的人数【忧乐美团队---·韩小拽·】为您解答=====...
2023-03-18【本文来自《IMAX中国首席执行官:不信中国人再也不想看好莱坞电影,中国观众只是更看重质量》评论区,...
2023-03-18本报讯(记者任珊)东城区建国门智云应急安全生产联合会昨天成立,这是核心区首个基层应急枢纽组织。挂...
2023-03-18截至2023年3月17日收盘,佳缘科技(301117)报收于79 67元,下跌1 03%,换手率1 79%,成交量7695 0手,成交额6149 77万元。
2023-03-17新华社新加坡3月17日电专访:中国式现代化为其他国家实现现代化提供新思路——访新加坡国立大学东亚研究...
2023-03-17业余赚钱的途径很多,哪个最靠谱?,威客,自媒体,网约车,创业者,业余时间,业余赚钱
2023-03-17外交部发言人:美方用望远镜看待自身人权问题,却用放大镜挑剔他国人权状况,人权,外交部,汪文斌,美国政...
2023-03-171、六书,最早见于《周礼》,清代以后一般指象形字、指法、会意、形声字、意译、借用。汉代学者将汉字的...
2023-03-17本报评论员陈琳近日,广东深圳,一小学四年级男孩因沉迷于玩手机,被父亲采取反向式教育“逼”他连续玩...
2023-03-171、凯恩斯45°线说明凯恩斯定律:需求决定供给。2、通过45度线,可以看到45度线上的点表示需求=供给,此...
2023-03-17美国白宫能源事务顾问:拜登政府适当时候将回补战略石油库存:美国白宫能源事务顾问Hochstein表示,拜登...
2023-03-17汽车走进生活,选最适合自己的车。哈喽,大家好,我是红涛说车。湖北政企推出了购车补贴政策,雪铁龙C6...
2023-03-17挖贝网3月16日,声屏传媒(872602)发公告称,股东中山影声投资有限公司、中山广播电视台在股转系统通过...
2023-03-16八方旅人2温特兰多地区全宝箱位置一览。不少玩家可能还不太清楚游戏中该区域的宝箱都在什么地方,下面带...
2023-03-16“金砖经济研究中心”在厦门理工学院揭牌成立
2023-03-16截至2023年3月16日收盘,四方股份(601126)报收于13 78元,下跌2 41%,换手率0 9%,成交量7 11万手,成交额9892 51万元。
2023-03-16App3月16日消息,据快科技报道,2023年的iPhone15系列可能会是最近几代升级最多的,除了常规的A17处理器...
2023-03-16高新区公租房为定向配租公租房,保障对象为园区定向低收入申请人、人才房申请人和企业申请人,其中定向...
2023-03-163月15日,中国西电(601179)融资买入5610 7万元,融资偿还5894 57万元,融资净卖出283 87万元,融资余额5 42亿元。
2023-03-16相关专家在接受《环球时报》记者采访时表示,所谓“中国人权状况”边会是在联合国人权理事会框架下举办...
2023-03-161、ProudOfYouLoveinyoureyes你眼中充满爱意Sittingsilentb
2023-03-161、温婉没有到十八岁。2、就去酒吧或网吧!还抽烟喝酒。本文就为大家分享到这里,希望小伙伴们会喜欢。
2023-03-151、鲍鱼冷冻的注意事项2、鲍鱼壳的海水成分可以使鲍鱼存活一段时间,所以新鲜买来的鲍鱼可以直接放入冰...
2023-03-15四川黄金交易异常波动公告,公司股票近期涨幅较大,且目前公司市盈率高于同行业市盈率水平,请广大投资...
2023-03-15截至2023年3月15日收盘,益方生物(688382)报收于17 66元,上涨2 5%,换手率2 58%,成交量2 71万手,成交额4844 18万元。
2023-03-152023年新航季四川航空最新航线安排2021年6月成都天府机场开启运行,2023年新航季川航天府航线多达72条赶...
2023-03-15你想了解最新最前沿的汽车资讯吗?你想了解国产神车的最新相关报道吗?对于买车的朋友们来说了解到一手...
2023-03-153月13日,记者从安徽省政府新闻办举行的新闻发布会上获悉,安徽省近期就制造业数字化转型出台重要政策举...
2023-03-15Copyright © 2015-2022 南方水产网版权所有 备案号:粤ICP备18023326号-21 联系邮箱:855 729 8@qq.com