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);
}

}   


}






版权声明:本文为qq_36734960原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。