1.原理
可以在客户端每次请求服务端的时候,客户端请求中携带一个短时间内唯一不重复的序列号来确保其唯一性,这个序列号常见的几种形式有:基于时间戳、用户ID和随机数的组合;基于请求的来源与客户端生成的唯一序列号组合
2.方案
客户端生成唯一序列号后请求服务端,服务端拿到唯一序列号后组装一个Redis的key,利用setnx命令添加数据,然后根据Redis返回的结果做不同的处理
1)Redis返回的结果是1,表示当前的唯一序列号添加到Redis中成功,那么业务系统可以处理当前的业务逻辑。
2)Redis返回的结果是0,表示当前的唯一序列号已经在Redis中,此时业务系统认为这个请求已经处理过,就不再处理这个请求,直接给予客户端异常的提示。
3)唯一序列号添加到Redis中的时候要设置过期时间,这样做的目的是保证在这个时间范围内,如果携带相同唯一序列号的请求调用接口时可以做拦截处理;如果不设置过期时间,可能会致使Redis的内存被打满进而导致Redis宕机。通过这种方式,即使客户端多次发送相同的请求,服务器也只会处理一次,从而保证了接口的幂等性。
3,结论
方案一: 客户端生成唯一序列号后,服务端根据这个唯一序列号添加到Redis中,如果添加成功则可以执行业务逻辑,如果添加失败则向客户端响应请求执行异常。
方案二: 客户端传递唯一序列号,并且需要使用Redis添加过期时间存储唯一序列号