分布式幂等性
幂等性:一个接口运行多次,与运行一次的效果是一样的
update t_reps set count=count-1,version=version+1
where version=1
1.购买手机的时候,先查询库存,剩1件,假如当前如version为1
2.更新的时候version+1,count-1
3.同是有新数据语句的时候,version已经等于2的时候,不为1,则不操作
消费端幂等性保证
唯一id+指纹码,利用数据库主键去重
select count(1) from t_order where id=唯一id+指纹码
(好实现,高并发有数据库写入性能瓶颈,解决:跟进id进行分库分表进行算法路由)
利用redis原子性
使用redis进行幂等,
1.是否进行数据库落库,如果落库的话,关键解决问题是,数据库和缓存如何做到原子性?
2.如果不落库,那么都存储在缓存中,如何设置定时同步策略。
接口幂等性
1.select操作:不会对业务数据有影响,天然幂等
2.delete操作:第一次已经删除,第二次不会影响
3.update操作:更新操作传入版本号,课题通过乐观锁实现幂等性
4.insert操作:此时没有业务单号,使用token保证幂等
混合操作:找到操作的唯一的业务单号,有则可使用分布式锁,没有可以使用token保证幂等性。
delete:根据唯一的业务号删除
第一次删除时,已经将数据删除
第二次再次执行时,由于找不到记录,所有返回结果是0,对业务数据没有影响,可在删除之前进行数据查询。
删除操作没有业务号,则要看具体的业务需求
列如:删除所有审核未通过的商品
第一次执行,将所有未通过审核的商品删除
在第二次执行之前,又有新的商品未审核通过
执行第二次删除操作,是否需要删除新未审核的商品删除操作
update:根据唯一业务号去更新数据情况
用户查询修改的数据,系统将数据返回页面,将数据版本号放入隐藏域
用户修改数据,点击提交,将版本号一同提交给后台
后台使用版本号作为更新条件
update set version=version+1,xxx=${xxxx} where id=xxxx
and version=${version}
更新操作没有业务唯一业务号,可以使用token机制
insert: 有唯一的业务号(手机号码:注册的时候)的insert操作 列如:秒杀,商品id+用户id。
可以通过分布式锁,保证接口的幂等。
业务执行完成后,不进行锁释放,让其过期自动释放。
----(手机号码:注册的时候) 可以通过Redisson zookeepter 实现-------
没有唯一业务号的insert操作,比如:用户注册,点击多次
使用token机制,保证幂等性
进入到注册页面时,后台统一生成token,返回前台隐藏域中
用户点击提交的时,将token一同传入后台,
使用token获取分布式锁,完成insert操作。
执行完成之后,不释放锁,等待过期释放
----(1.请求页面之前,生成token,前端隐藏token,提交携带token)
2.insert之前判断token是否存在,
3.可以通过Redisson,zookeepter 实现)------
混合操作的幂等性 :混合操作,一个接口包含多个操作。
同样使用token机制,
//下单之前 生成token 存入redis
token=UUID.randomUUID.toString();
redisUtils.Set("ORDER_TOKEN_"+session.getId(),token,30); //key="ORDER_TOKEN_"+session.getId() value=token 30s有效期
//生成订单+分布式锁Redisson(防止并发情况下)
获取token
redis获取是否存在一致
验证完成之后清除token
以上是 分布式幂等性 的全部内容, 来源链接: utcz.com/z/517078.html