Redis实现分布式锁及接口幂等实现

Redis实现分布式锁及接口幂等实现


每一次进行幂等校验之前先获取token,此略过。。。。

创建拦截器


@SpringBootConfiguration
public class TokenInterceptorConfig extends WebMvcConfigurerAdapter {
@Autowired
private TokenInterceptor tokenInterceptor;

@Override
public void addInterceptors(Interceptor registry) {
   //可添加拦截路径
    registry.addInterceptor(tokenInterceptor).addPathPatterns("/order/**");
}

拦截器具体实现

@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private RedisService redisService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
 String tokenName = request.getRequestURI() + request.getParameter("tokenValue");
    String tokenValue = request.getParameter("tokenValue);
    if (tokenValue != null && !tokenValue.equals("")) {
         return handleToken(request,response,handler);
    }
    return false;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {

}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
String tokenName = request.getRequestURI() + request.getParameter("tokenValue");
RedisUtil.releaseDistributedLock(redisService,tokenName,tokenName}

/**
 * 分布式锁
 * @param request
 * @param response
 * @param handler
 * @return
 * @throws Exception
 */
private boolean handleToken(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //尝试获取分布式锁,获取到锁定时间5分钟
    if (RedisUtil.tryGetDistributedLock(redisService,request.getParameter("tokenValue"),request.getParameter("tokenValue"),300))  
            {               return true;
            }
        
    return false;
}

服务层具体实现

@Conment
public class RedisServiceImpl extends CacheService {
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    @Autowired
        private JedisPool jedisPool;
    public Jedis getJedis(){
        Jedis jedis = null;
                try {
            jedis = jedisPool.getResource();
        }catch (Exception e) {
            log.error(e.getMessage());
            return null;
        }finally {
            if (jedis != null) {
                jedis.close();
            }
        }
        return jedis;
    }
public String set(String lockKey, String requestId, int expireTime) {
        return getJedis().set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
    }
    
    
public Object eval(String lockKey, String requestId) {
 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
 return getJedis().eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

public boolean exists(String key){
        return getJedis().exists(key);
        }

public class RedisUtil{

//查实获取分布式锁
public static boolean tryGetDistributedLock(RedisService service,String key,String reauestId,int expireTime){
service.setkey(key,reauestId,expireTime);
}
//释放分布式锁
public static boolean releaseDistributedLock(RedisService service, String lockKey, String requestId) {
Object result = redisService.eval(lockKey,requestId);
}

}   


}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值