Redis分布式锁适用于多实例的微服务架构,比如同一个服务部署到4不同IP地址的台机器上,为了防止同一个请求多次处理,需要使用分布式锁,同一时刻只处理一个请求。Redis分布式锁一般是封装set方法。
/** * 默认redis锁存活时间,10秒 */ private static final int DEFAULT_LOCK_EXPIRE_TIME = 10;
/** * 获取锁,默认锁超时时间10秒 * * @param lockName 锁名 * @return 是否成功 */ public boolean acquireLock(final String lockName) { return acquireLock(lockName, DEFAULT_LOCK_EXPIRE_TIME); } /** * 获取锁 * * @param lockName 锁名 * @param lockExpireTime 超时时间,单位秒 * @return 是否成功 */ public boolean acquireLock(final String lockName, final int lockExpireTime) { return set(lockName, "lock", "NX", "EX", lockExpireTime); }
/** * nxxx nxxx NX|XX, NX -- Only set the key if it does not already exist. XX -- Only set the key if it already exist * -- Only set the key if it already exist *-- Only set the key if it already exist * @see Jedis#set(String, String, String, String, int) */ public boolean set(final String key, final String value, final String nxxx, final String expx, final int time) { return execute(new JedisAction<Boolean>() { @Override public Boolean action(Jedis jedis) { String result = jedis.set(key, value, nxxx, expx, time); return JedisUtils.isStatusOk(result); } }); }
使用:
try{ if(!jedisTemplate.acquireLock(RedisConstants.ticketsLock + params.getMemberId())){ //业务逻辑 } }catch (Exception e){ //业务逻辑 }finally { /**释放用户锁**/ jedisTemplate.releaseLock(RedisConstants.ticketsLock + params.getMemberId()); }