Redis除了缓存还可以做很多事情:分布式锁、限流、处理请求接口幂等。..太多了~今天想和小伙伴们聊聊用Redis处理接口限流的问题。这也是最近TienChin项目中与这个知识点相关的一个知识点,所以拿出来和大家聊聊这个话题。1、准备工作首先,我们创建一个SpringBoot项目,引入Web和Redis依赖。同时考虑到接口限流一般都是通过注解来标记,而注解是通过AOP来解析的,所以我们还需要添加AOP依赖。最终的依赖如下:弹簧框架。启动spring-boot-starter-weborg.springframework.bootspring-boot-starter-aop然后提前准备一个Redis实例。这里我们的项目配置好后,就可以直接配置Redis的基本信息了,如下:spring.redis.host=localhostspring.redis.port=6379spring.redis.password=123好了,准备工作就绪。2.限流注解接下来,我们创建一个限流注解。我们把限流分为两种情况:一种是对当前接口进行全局限流,比如1分钟内可以访问该接口100次。对某个IP地址进行限流,比如某个IP地址在1分钟内可以被访问100次。针对这两种情况,我们创建一个枚举类:publicenumLimitType{/***Defaultpolicyglobalcurrentlimit*/DEFAULT,/***currentlimitbasedonrequesterIP*/IP}接下来我们创建RateLimiter注解:@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic@interfaceRateLimiter{/***限流键*/Stringkey()default"rate_limit:";/***限流时间,单位秒*/inttime()default60;/***限流次数*/intcount()default100;/***限流类型*/LimitTypelimitType()defaultLimitType.DEFAULT;}first参数限流键只是一个前缀。以后完整的key将由前缀加上接口方法的全路径组成限流key。此密钥将存储在Redis中。其他三个参数很容易理解,就不多说了。好吧,以后需要在哪个接口限流,就在那个接口上添加注解,然后配置相关参数就可以了。@RateLimiter3。自定义RedisTemplate小伙伴都知道,在SpringBoot中,我们其实更习惯使用SpringDataRedis来操作Redis,但是默认的RedisTemplate有个小坑,就是使用了JdkSerializationRedisSerializer来进行序列化。没有注意到直接使用这个序列化工具存储在Redis上的key和value会莫名其妙的有一些前缀,使用命令读取的时候可能会出错。比如存储的时候,key是name,value是javaboy,但是在命令行操作的时候,却获取不到想要的数据。原因是保存到redis后名字前面有一些字符。继续使用RedisTemplate读取出来。获取名称我们使用Lua脚本对Redis进行限流。在使用Lua脚本的时候,会出现上面提到的情况,所以我们需要修改RedisTemplate的序列化方案。可能有些朋友会说为什么不用StringRedisTemplate呢?StringRedisTemplate不存在上述问题,但是其可以存储的数据类型不够丰富,这里暂不考虑。修改RedisTemplate的序列化方案,代码如下:redisTemplate.setConnectionFactory(connectionFactory);//使用Jackson2JsonRedisSerialize替换默认序列化(默认使用JDK序列化)Jackson2JsonRedisSerializer