某 Top 大厂面试的一个问题,欢迎大家讨论 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hehe12980
V2EX    程序员

某 Top 大厂面试的一个问题,欢迎大家讨论

  •  
  •   hehe12980 2021-04-21 21:40:49 +08:00 1336 次点击
    这是一个创建于 1702 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景:之前去某 Top 级别大厂面试,面的 Java 30-50K 这个岗位,2 面,然后给我出了两题,时间 1 个小时左右,第一题多线程的题,还行基本上写出来了。主要第二题没有特别好的思路。题目如下

    设计一个黑名单系统,实现对访问 IP 的管理,要求如下:
    一分钟内,该 IP 访问超过 1000 次,加入黑名单
    一小时内,该 IP 访问超过 30000 次,加入黑名单
    黑名单库中的 IP,如果连续一个小时不违反 1 、2 两条,则解除黑名单

    单纯实现这个功能的话,我觉得不用 mysql 存下每个 ip 的访问记录感觉根本就弄不出来,因为时间是浮动的,但是问题来了,如果用 mysql 去存访问记录,这个表的设计其实不难,但是数据量是个问题,每个 ip 访问都得记,感觉不应该这么玩,不知道大家有没有好的方法

    如果用 mysql 的话 还得开个定时器扫 ,不断增删改去维护动态的 ip 数据,每次 ip 请求,就得查库判断。
    布隆过滤器也想过,但是这个地方有时效性,感觉布隆过滤器没法用

    该大厂最终是挂了,但是这个问题不失为一个好的问题,因为自己当初没想出来,然后静下心想,除了用 mysql 和定时器+拦截器,坦白说自己没有特别好的方案,所以在这里想请教一下大家的思路。
    hehe12980
        1
    hehe12980  
    OP
       2021-04-21 22:00:10 +08:00
    貌似被降权了 还是咋回事 发的帖子自己跑第二页去了
    Chinsung
        2
    Chinsung  
       2021-04-22 09:40:57 +08:00
    这个需求很奇怪,首先就是理论上黑名单库中的 ip,理论上都直接拒绝访问了,还要连续一个小时不违反就解除,也就是说黑名单的 ip 也能打到这个程序上么?
    做法的话拍脑袋一想,可以搞个桶,比如某 IP 访问,就创建一个以分钟为单位的桶,存内存或者 redis,该 IP 如果再次访问就 hash 到对应的桶,在 hash 到对应那个分钟单位里++,如果对应分钟的桶超过 1000 就黑名单。分钟的桶也就 60 个 int,小时的桶一天最多也就 24 个 int 。
    whileFalse
        3
    whileFalse  
       2021-04-22 13:48:45 +08:00
    令牌桶就行吧,弄俩桶。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2583 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:58 PVG 20:58 LAX 04:58 JFK 07:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86