麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 數據庫 > Redis > 正文

redis鎖機制介紹與實例

2020-10-28 21:31:16
字體:
來源:轉載
供稿:網友

1 悲觀鎖

執行操作前假設當前的操作肯定(或有很大幾率)會被打斷(悲觀)。基于這個假設,我們在做操作前就會把相關資源鎖定,不允許自己執行期間有其他操作干擾。

Redis不支持悲觀鎖。Redis作為緩存服務器使用時,以讀操作為主,很少寫操作,相應的操作被打斷的幾率較少。不采用悲觀鎖是為了防止降低性能。

2 樂觀鎖

執行操作前假設當前操作不會被打斷(樂觀)。基于這個假設,我們在做操作前不會鎖定資源,萬一發生了其他操作的干擾,那么本次操作將被放棄。

3. Redis中的鎖策略

Redis采用了樂觀鎖策略(通過watch操作)。樂觀鎖支持讀操作,適用于多讀少寫的情況!
在事務中,可以通過watch命令來加鎖;使用 UNWATCH可以取消加鎖;
如果在事務之前,執行了WATCH(加鎖),那么執行EXEC 命令或 DISCARD 命令后,鎖對自動釋放,即不需要再執行 UNWATCH 了

例子

redis鎖工具類

package com.fly.lock;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;import redis.clients.jedis.JedisPoolConfig;public class RedisLock {  //初始化redis池  private static JedisPoolConfig config;  private static JedisPool pool;  static {    config = new JedisPoolConfig();    config.setMaxTotal(30);    config.setMaxIdle(10);    pool = new JedisPool(config, "192.168.233.200", 6379);  }  /**   * 給target上鎖   * @param target   **/  public static void lock(Object target) {    //獲取jedis    Jedis jedis = pool.getResource();    //result接收setnx的返回值,初始值為0    Long result= 0L;    while (result < 1) {      //如果target在redis中已經存在,則返回0;否則,在redis中設置target鍵值對,并返回1      result = jedis.setnx(target.getClass().getName() + target.hashCode(), Thread.currentThread().getName());    }    jedis.close();  }  /**   * 給target解鎖   * @param target   **/  public static void unLock(Object target) {    Jedis jedis = pool.getResource();    //刪除redis中target對象的鍵值對    Long del = jedis.del(target.getClass().getName() + target.hashCode());    jedis.close();  }  /**   * 嘗試給target上鎖,如果鎖成功返回true,如果鎖失敗返回false   * @param target   * @return   **/  public static boolean tryLock(Object target) {    Jedis jedis = pool.getResource();    Long row = jedis.setnx(target.getClass().getName() + target.hashCode(), "true");    jedis.close();    if (row > 0) {      return true;    }    return false;  }}

測試類

package com.fly.test;import com.fly.lock.RedisLock;class Task {  public void doTask() {    //上鎖    RedisLock.lock(this);    System.out.println("當前線程: " + Thread.currentThread().getName());    System.out.println("開始執行: " + this.hashCode());    try {      System.out.println("doing...");      Thread.sleep(2000);    } catch (InterruptedException e) {      e.printStackTrace();    }    System.out.println("完成: " + this.hashCode());    //解鎖    RedisLock.unLock(this);  }}public class Demo {  public static void main(String[] args) {    Task task = new Task();    Thread[] threads = new Thread[5];    for (Thread thread : threads) {      thread = new Thread(()->{        task.doTask();      });      thread.start();    }  }}

輸出結果:

----------------------------------------------
當前線程: Thread-0
開始執行: 2081499965
doing...
完成: 2081499965
----------------------------------------------
當前線程: Thread-2
開始執行: 2081499965
doing...
完成: 2081499965
----------------------------------------------
當前線程: Thread-1
開始執行: 2081499965
doing...
完成: 2081499965
----------------------------------------------
當前線程: Thread-4
開始執行: 2081499965
doing...
完成: 2081499965
----------------------------------------------
當前線程: Thread-3
開始執行: 2081499965
doing...
完成: 2081499965

去掉redis鎖后,執行結果:

----------------------------------------------
----------------------------------------------
當前線程: Thread-2
開始執行: 1926683415
----------------------------------------------
當前線程: Thread-1
doing...
當前線程: Thread-0
----------------------------------------------
當前線程: Thread-3
開始執行: 1926683415
doing...
開始執行: 1926683415
doing...
----------------------------------------------
開始執行: 1926683415
doing...
當前線程: Thread-4
開始執行: 1926683415
doing...
完成: 1926683415
完成: 1926683415
完成: 1926683415
完成: 1926683415
完成: 1926683415

Process finished with exit code 0

利用redis這個性質,可以實現分布式鎖,當然設計一定復雜一些!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對武林網的支持。如果你想了解更多相關內容請查看下面相關鏈接

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲午夜视频在线 | 黄色羞羞视频在线观看 | 欧美一级高潮片免费的 | 国产亚洲精品综合一区91 | 久久精品国产亚洲7777 | 亚洲四播房 | 国产剧情在线观看一区二区 | 精品国产一区二区在线观看 | 久草在线视频看看 | 久久国产精品久久久久久久久久 | 青草久久久久 | 成人短视频在线播放 | 久久综合精品视频 | 性欧美在线视频 | 护士hd欧美free性xxxx | 国产一级毛片视频在线! | 视频一区 日韩 | 日本黄色免费观看视频 | 国产精品av久久久久久网址 | 中文字幕 亚洲一区 | 日韩av成人 | 一区二区三区日韩在线观看 | 国产亚洲精彩视频 | 精品一区二区久久久久 | 日本成人午夜 | 国产亲子伦在线观看 | 羞羞答答www网站进入 | 精品一区二区电影 | 一级毛片免费版 | 亚洲国产精品久久久久 | 爽成人777777婷婷 | 成人羞羞国产免费游戏 | 欧洲伊人网 | 国产 日韩 亚洲 欧美 | free国产hd老熟bbw | 国产午夜精品一区二区三区四区 | 久久久国产精品网站 | 久久成人免费网站 | 亚洲综合视频网 | 免费色片 | 欧美成人鲁丝片在线观看 |