redis 分布式锁

mac2022-06-30  23


redis 分布式锁

 

注意事项:

给锁设置超时时间,防止没有设置超时时间进程故障,锁无法释放

开后台线程延长超时时间,防止未执行完成,锁超时释放

防止其它线程将持有锁的线程的锁释放

 

 

******************

示例

 

RedisLock

@Component public class RedisLock { @Autowired private StringRedisTemplate redisTemplate; ConcurrentHashMap<String,Long> map=new ConcurrentHashMap<>(); public int lock(){ long currentTime=System.currentTimeMillis(); while(System.currentTimeMillis()-currentTime<2000){ if(redisTemplate.opsForValue().setIfAbsent("key", String.valueOf(currentTime), Duration.ofMinutes(1L))){ map.put("key",currentTime); Thread t=new Thread(()->{ if(Objects.equals(redisTemplate.boundValueOps("key").get(), String.valueOf(map.get("key")))){ Long l=redisTemplate.boundValueOps("key").getExpire(); assert l != null; if(l.compareTo(5L)<0){ redisTemplate.boundValueOps("key").expire(1L, TimeUnit.MINUTES); } } }); t.setDaemon(true); t.start(); return 1; } } return 0; } public void unLock(){ if(redisTemplate.boundValueOps("key").get()!=null&&Objects.equals(redisTemplate.boundValueOps("key").get(), String.valueOf(map.get("key")))){ redisTemplate.delete("key"); } }

 

 

******************

controller 层

 

HelloController

@RestController public class HelloController { @Autowired private RedisLock lock; @RequestMapping("/hello") public String hello(){ Thread t=new Thread(()->{ if(lock.lock()!=0){ try{ System.out.println(Thread.currentThread().getId()+" "+System.currentTimeMillis()); try{ Thread.sleep(2000); }catch (Exception e){ e.printStackTrace(); } }catch (Exception e){ e.printStackTrace(); }finally { lock.unLock(); } } }); ExecutorService executorService=Executors.newFixedThreadPool(10); for(int i=0;i<100;i++){ executorService.submit(t); } return "success"; } }

 

 

******************

控制台输出

 

44 1570015396485 45 1570015398492 43 1570015400494 40 1570015402496 44 1570015404504 41 1570015406507 43 1570015408509 46 1570015410518 41 1570015412524 42 1570015414527

 

 

最新回复(0)