背景:之前去某 Top 级别大厂面试,面的 Java 30-50K 这个岗位,2 面,然后给我出了两题,时间 1 个小时左右,第一题多线程的题,还行基本上写出来了。主要第二题没有特别好的思路。题目如下
设计一个黑名单系统,实现对访问 IP 的管理,要求如下:
• 一分钟内,该 IP 访问超过 1000 次,加入黑名单
• 一小时内,该 IP 访问超过 30000 次,加入黑名单
• 黑名单库中的 IP,如果连续一个小时不违反 1 、2 两条,则解除黑名单
单纯实现这个功能的话,我觉得不用 mysql 存下每个 ip 的访问记录感觉根本就弄不出来,因为时间是浮动的,但是问题来了,如果用 mysql 去存访问记录,这个表的设计其实不难,但是数据量是个问题,每个 ip 访问都得记,感觉不应该这么玩,不知道大家有没有好的方法
如果用 mysql 的话 还得开个定时器扫 ,不断增删改去维护动态的 ip 数据,每次 ip 请求,就得查库判断。
布隆过滤器也想过,但是这个地方有时效性,感觉布隆过滤器没法用
该大厂最终是挂了,但是这个问题不失为一个好的问题,因为自己当初没想出来,然后静下心想,除了用 mysql 和定时器+拦截器,坦白说自己没有特别好的方案,所以在这里想请教一下大家的思路。
设计一个黑名单系统,实现对访问 IP 的管理,要求如下:
• 一分钟内,该 IP 访问超过 1000 次,加入黑名单
• 一小时内,该 IP 访问超过 30000 次,加入黑名单
• 黑名单库中的 IP,如果连续一个小时不违反 1 、2 两条,则解除黑名单
单纯实现这个功能的话,我觉得不用 mysql 存下每个 ip 的访问记录感觉根本就弄不出来,因为时间是浮动的,但是问题来了,如果用 mysql 去存访问记录,这个表的设计其实不难,但是数据量是个问题,每个 ip 访问都得记,感觉不应该这么玩,不知道大家有没有好的方法
如果用 mysql 的话 还得开个定时器扫 ,不断增删改去维护动态的 ip 数据,每次 ip 请求,就得查库判断。
布隆过滤器也想过,但是这个地方有时效性,感觉布隆过滤器没法用
该大厂最终是挂了,但是这个问题不失为一个好的问题,因为自己当初没想出来,然后静下心想,除了用 mysql 和定时器+拦截器,坦白说自己没有特别好的方案,所以在这里想请教一下大家的思路。