接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其实都会遇到。今天我们来看看两种比较简单的实现思路。
1. 接口幂等性实现方案梳理
其实接口幂等性的实现方案还是蛮多的,我这里和小伙伴们分享两种比较常见的方案。
1.1 基于 Token
基于 Token 这种方案的实现思路很简单,整个流程分两步:
- 客户端发送请求,从服务端获取一个 Token 令牌,每次请求获取到的都是一个全新的令牌。
- 客户端发送请求的时候,携带上第一步的令牌,处理请求之前,先校验令牌是否存在,当请求处理成功,就把令牌删除掉。
大致的思路就是上面这样,当然具体的实现则会复杂很多,有很多细节需要注意,松哥之前也专门录过这种方案的视频,小伙伴们可以参考下,录了两个视频,一个是基于拦截器处理的,还有一个是基于 AOP 切面处理的:
基于拦截器处理(视频一):
基于 AOP 切面处理(视频二):
1.2 基于请求参数校验
最近在 TienChin 项目中使用的是另外一种方案,这种方案是基于请求参数来判断的,如果在短时间内,同一个接口接收到的请求参数相同,那么就认为这是重复的请求,拒绝处理,大致上就是这么个思路。
相比于第一种方案,第二种方案相对来说省事一些,因为只有一次请求,不需要专门去服务端拿令牌。在高并发环境下这种方案优势比较明显。
所以今天我就来和大家聊聊第二种方案的实现,后面在 TienChin 项目视频中也会和大家细讲。
2. 基于请求参数的校验
首先我们新建一个 Spring Boot 项目,引入 Web 和 Redis 依赖,新建完成后,先来配置一下 Redis 的基本信息,如下:
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=123
复制代码
为了后续 Redis 操作方便,我们再来对 Redis 进行一个简单封装,如下:
@Component
public class RedisCache {
@Autowired
public RedisTemplate redisTemplate;
public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
}
public <T> T getCacheObject(final String key) {
ValueOperations<String, T> operation = redisTemplate.opsForValue();
return operation.get(key);
}
}
复制代码
这个比较简单,一个存数据,一个读数据。<

最低0.47元/天 解锁文章
387

被折叠的 条评论
为什么被折叠?



