在项目开发中我们时常会遇到一些前端重复频繁操作带来的问题,有的时候是误点或者页面卡顿了导致用户以为没有点击重复操作导致出现多次无效请求的现象,这里分享一个Java中利用redis来限制这种现象的方法:

场景:

以 支付场景为例,现有一订单需要去支付,点击支付按钮后因习惯再次点击或者短时间未响应又重复点击会造成多次请求支付接口,造成多次无效请求,也会增加消耗

思路:

redis可以设置过期时间,可以通过存储该订单的唯一标识作为key,设置一定的过期时间,就可以避免在这段时间内重复发起请求,失效的key会通过redis的淘汰策略或定期清除的形式被干掉

上代码:

//防止多次重复提交
private static final String PAY_CENTER_PAY = "pay-center:pay:";

public Boolean whetherSumbit(String userId){
    //设置redis key前缀,一般为微服务模块名+操作+用户id 例如:pay-center:pay:123456789
    String redisKey = ORDER_CENTER_PAY + userId;

    //根据key前缀和key获取存入的value
    String str = (String)redisRepository.get(redisKey, intentionId);

    //不为null则是多余的无效请求
    if (null!=str) {
        return Result.failed("请勿频繁操作,请稍后重试!");
    } else {
        //为null则是第一次请求,将key前缀和key、value、失效时间(s)放入缓存中
        redisRepository.setExpire(redisKey, userId, userId,10);
    }
}

这样就简单的解决了这个问题,而且redis响应速度快,占用资源少,是很多场景优先考虑的解决方案,希望能帮到大家,用心码字,觉得有用的兄弟麻烦支持下哈!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐