1. 程式人生 > >Redis實踐 -使用Redis分散式鎖

Redis實踐 -使用Redis分散式鎖

使用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
*/