有个每分钟只能访问10次接口的需求,想到2个实现方法分享给大家,希望可以一起进步,一开始的思路是记录下用户访问的时间和次数,然后在写一些方法实现。最先想到是记录在数据库里,刚好数据库有记录访问日志的表,还带有时间.用户每次访问都会记录在这张表里,所以只要查询该用户在当前时间(精确到分钟)有多少条数据就能查出访问了几次接口。
mybatis+MySQL实现的语句如下:
这里的create_time是取当前系统时间(到分)的字符串
这样就通过唯一的秘钥,和到分的系统时间,模糊的查出在当前分钟内一共有多少条日志,即用户访问了几次接口了。
这种方式会访问一次数据库,在服务端还有存储数据的地方,session和servletContext,还有spring自带的缓存这有时间在研究有待学习,session和 servletContext是一样的用法已经实现,就已servletContext说明下思路吧。
servletContext也是服务端存储数据的地方,服务器启动时被创建,关闭时销毁,有key和value属性,key用于查找,value存数据。key放用户的loginId因为唯一,value里放一个map,key放时间(到分)value放次数。
代码如下:
思路是用户访问接口后先去servletContext查该用户(以loginId)如果没有,就加入该用户,并把当前系统时间(到分)存在map的key,次数1存在map的value,如果servletContext有该用户就去取map,取到map后用当前时间(到分)作为key来取次数,如果次数是null说明当前时间(到分)访问次数是0,清空map给次数赋值1在把map绑定到servletContext,如果map的key取到了次数,说明在当前时间(到分)有访问次数,就给访问次数+1,在存到map绑定到servletContext上,这样就完成了记录当前系统时间(到分)的访问次数,用时取出当前时间(到分)的访问次数就可一判断是否超过10次。