)
一、业务场景秒杀、库存扣减、重复提交、定时任务防重、分布式业务互斥必须使用分布式锁解决多节点并发竞争问题。二、原生Redis分布式锁实现防误删、原子解锁基于SET NX EX Lua脚本解锁解决超时、误删、原子性问题。1. 分布式锁工具类Component public class RedisLockUtil { Autowired private StringRedisTemplate redisTemplate; // 锁前缀 private static final String LOCK_PREFIX lock:; // 锁过期时间 private static final long LOCK_EXPIRE 30; /** * 加锁 */ public boolean tryLock(String key, String uuid) { String lockKey LOCK_PREFIX key; return redisTemplate.opsForValue().setIfAbsent(lockKey, uuid, LOCK_EXPIRE, TimeUnit.SECONDS); } /** * 原子解锁Lua脚本 */ public boolean unLock(String key, String uuid) { String lockKey LOCK_PREFIX key; String script if redis.call(get,KEYS[1]) ARGV[1] then return redis.call(del,KEYS[1]) else return 0 end; DefaultRedisScriptLong redisScript new DefaultRedisScript(script, Long.class); Long result redisTemplate.execute(redisScript, Collections.singletonList(lockKey), uuid); return result ! null result 1; } }2. 业务使用防重RestController public class LockController { Autowired private RedisLockUtil redisLockUtil; GetMapping(/seckill) public String seckill() { String uuid UUID.randomUUID().toString(); String lockKey seckill:goods:1001; boolean lock redisLockUtil.tryLock(lockKey, uuid); if (!lock) { return 抢购繁忙请稍后重试; } try { // 秒杀业务逻辑 return 抢购成功; } finally { // 释放锁 redisLockUtil.unLock(lockKey, uuid); } } }三、原生锁缺陷与生产建议原生锁无法自动续约、不可重入、主从切换丢锁简单业务可用高并发核心业务必须使用Redisson。