redis分布式锁
加锁
expire synchronized Boolean lock(String key, String requestId, long expire) { Boolean flag = false; try { flag = (Boolean) redisTemplate.execute((RedisCallback) connection -> { Boolean result = connection.set(key.getBytes(), requestId.getBytes(), Expiration.from(expire, TimeUnit.SECONDS), RedisStringCommands.SetOption.SET_IF_ABSENT); return result; }); } catch (Exception e) { log.error("redis加锁异常{}", e); } return flag; }
参数
key:key值
requestId:Redis锁标识
expire:Redis过期时间(单位:秒)
案例:
redisUtils.lock("ORDER_NUM_" + orderId, orderId, 100)
解锁
public synchronized Boolean releaseLock(String key, String requestId) { Boolean flag = false; try { flag = (Boolean) redisTemplate.execute((RedisCallback) connection -> { String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; Boolean result = connection.eval(script.getBytes(), ReturnType.BOOLEAN, 1, key.getBytes(), requestId.getBytes()); return result; }); } catch (Exception e) { log.error("redis释放锁异常{}", e); } return flag; }
案例:
redisUtils.releaseLock("ORDER_NUM_" + orderId, orderId)
流程
try :加锁,设置key加缓存,业务逻辑
catch:捕获异常
finally:释放锁

浙公网安备 33010602011771号