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