[系統設計]--(1)小併發量、低延時、通用場景下的接口併發鎖

Author:趙志乾
Date:2020-04-04
Declaration:All Right Reserved!!!

實際項目中的接口大致可以分爲兩大類:查詢類與修改類。對於查詢類接口而言,其對業務數據是沒有影響的(對查詢進行統計的功能除外)。針對此類對業務數據無影響的接口,完全可以放開併發控制,以提高接口的響應速度。而對於修改類接口,其操作會影響到業務數據。爲避免數據不一致,需要進行併發控制。而併發控制最常用的操作手段就是加鎖。

Redis鎖

使用redis進行分佈式併發控制是一種常用的併發鎖方案。使用起來也非常的簡單。代碼如下:

// Jedis封裝加鎖和釋放鎖操作
public boolean getLock(String key,int expireTime){
    String key = "my:lock:" + key;
    String result = jedis.set(key, String.valueOf(System.currentTimeMillis()), "NX", "EX",expireTime);
    return (null != result && "OK".equalsIgnoreCase(result)) ? true : false;
}


public void releaseLock(String key) {
     if (StringUtils.isNotBlank(key)) {
         String key = "my:lock:" + key;
         jedis.del(key);
    }
}


// 接口併發控制模板
public Object operate(String userId,Object param){
      String lockKey = "operate:"+userId;
      boolean lockResult = jedis.getLock(lockKey,10);
      if(!lockResult){
         // 返回系統繁忙
      }

      try{
         // 業務代碼
      }
      finally{
        jedis.releaseLock(lockKey);
      }
}

使用上述的併發鎖能夠滿足小併發量的通用場景,而在一些大併發或者特殊業務場景下,該併發鎖樣板將會失去作用。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章