Redis實踐 -使用Redis分散式鎖
阿新 • • 發佈:2018-11-09
使用Redis來實現分散式鎖
public class LockTest { private final Jedis jedis; public LockTest() { jedis=new Jedis("localhost",6379); jedis.auth("iostream"); } public void solve() throws InterruptedException { //jedis.set()是原子操作 if(jedis.set("list","test","nx","ex",7)!=null){ //這個操作是快取list並設定7秒後過期 System.out.println(Thread.currentThread().getName()+" holds lock"); Thread.sleep(3000); //模擬長時間工作 throw new RuntimeException(); //模擬執行過程出現異常 }else{ System.out.println("鎖正在被佔領"); } } public static void main(String[] args) throws InterruptedException { LockTest lockTest=new LockTest(); new Thread( () -> { try { lockTest.solve(); } catch (InterruptedException e) { e.printStackTrace(); } } ).start(); new Thread( () -> { try { Thread.sleep(1000); lockTest.solve(); } catch (InterruptedException e) { e.printStackTrace(); } } ).start(); Thread.sleep(6000); System.out.println(lockTest.jedis.get("list")); //此時鎖還沒有過期 Thread.sleep(1000); System.out.println(lockTest.jedis.get("list")); //null 過期 Thread0執行緒執行過程出現異常鎖仍然能夠被安全釋放 } } /* Thread-0 holds lock 鎖正在被佔領 Exception in thread "Thread-0" java.lang.RuntimeException at com.viscu.Redis.LockTest.solve(LockTest.java:24) at com.viscu.Redis.LockTest.lambda$main$0(LockTest.java:34) at java.lang.Thread.run(Thread.java:748) test null */