除了缓存外,Redis还可以做很多事情:分布式锁,当前限制,处理请求接口power.essenceSencetoo太多?
今天,我想与我的朋友谈论使用Redis处理接口限制。这也是最近涉及该知识点的Tienchin项目。我将与您谈论这个主题,视频稍后还将讨论。
首先,我们创建一个Spring Boot项目,以引入Web和Redis依赖关系。同时,考虑到接口限制通常以注释为标记,并通过AOP分析注释。
然后提前准备一个REDIS实例。配置我们的项目后,只需配置Redis的基本信息,如下所示:
好吧,即使准备就绪。
接下来,我们创建一个限制注入,将当前限制分为两种情况:
为了应对这两种情况,我们创建了一个枚举类别:
接下来,让我们创建一个有限的流注入解决方案:
第一个参数流量限制,这只是一个前缀。将来,完整的键是此前缀加上接口方法的完整路径。一起,它形成了当前的限制密钥。此键将存储在Redis中。
我了解其他三个参数,所以我不会说太多。
好吧,将来需要限制哪个接口,并添加可以添加接口的注释,然后可以配置相关参数。
小朋友知道,在Spring Boot中,我们实际上更习惯使用弹簧数据重新运行重新进行REDIS,但是默认的重新标语具有一个小坑,即JDKSerialization redisserialializer.使用此序列化工具来保留对Redis的键和价值,未来,这将是莫名其妙的,这将导致您在阅读命令时读取错误。
例如,在存储时,键是名称,值为javaboy,但是当您操作命令行时,您无法获得所需的数据。
当我们将Redis用作电流时,我们将使用LUA脚本。当使用LUA脚本时,将出现以上情况,因此我们需要修改重新键盘的序列化方案。
可能有朋友说为什么不使用StringRedistemplate?StringRedistemplate没有上述问题,但是它可以存储的数据类型不够富有,因此在这里不考虑。
修改重新键盘序列化方案,代码如下:
这无话可说。我们都在Spring Boot中使用默认的Jackson序列化方法来解决。
实际上,我以前在VHR的视频中说过。REDIS中的某些原子操作可以通过LUA脚本实施。如果我们想调用LUA脚本,我们有两个不同的想法:
Spring Data Redis还提供了一个接口来操作LUA脚本,这更方便,因此我们在此处使用第二个解决方案。
我们在资源目录中创建一个新的LUA文件夹,用于存储LUA脚本。脚本内容如下:
这个脚本实际上并不困难,我可能知道它在一眼就使用了。Tonumber将字符串转换为数字。REDIS.CALL将执行特定的REDIS指令。具体过程是:
实际上,该LUA脚本已被充分理解。
接下来,我们将将此LUA脚本加载到bean中,如下所示:
是的,我们的LUA脚本已经准备好了。
接下来,我们需要自定义切割表面以分析此注释。让我们看一下切割表面的定义:
该切割表面是拦截所有添加注释和处理注释前的注释的方法。
好吧,我取得了巨大的成就。
接下来,我们将对界面进行简单测试,如下所示:
每个IP地址只能在5秒内访问3次。
可以手动测试此浏览器。
因为超载时是异常的,所以我们还需要一个全局异常处理器,如下:
这是一个小型演示,我不会定义物理类,并使用地图直接返回JSON。
好吧,你可以做到。
最后,让我们看一下加载时的测试效果:
好吧,这就是我们将Redis用作限制电流的一种方式。
兄弟歌曲最近录制了Tienchin项目视频。本文的内容也是Tienchin项目视频的一部分。Tienchin项目使用Spring Boot+VUE3 Technology Stack.Projects,速率超过90%。
原始:https://juejin.cn/post/7098684459159355405