一條複雜的業務線往往需要多個系統之間相互協調才能實現預期的功能,而系統之間的資料傳輸直接讀庫,或者業務邏輯複雜點的就需要提供方為呼叫方提供資料介面,常用http請求來傳輸json格式的資料,有乙個特點:慢,高併發時資料同步會受到一定影響;另外併發量比較高的時候,介面頻繁呼叫,會增加系統壓力,甚至崩潰;
例如併發時限定使用者數(a系統設定最大值,b系統進行校驗):通過redis設定最大接收數,然後每進乙個使用者最大數減1,處理完乙個使用者最大數加1;保持最大負載使用者不變; a:
public void set(string key, string value)
this.ops().set(key, value);
}public void set(string key, string value, long timeout) catch (exception var10) finally
}public string get(string key)
public void hset(string key, string field, string value)
this.hops().put(key, field, value);
}public string hget(string key, string field)
public void del(string key)
public void hdel(string key, string field) );
}public void setmax(string key, long num, long timeout)
b:
public synchronized boolean decr(string key) :{}", key, long.valueof(e1));
boolean var5;
if(e1 < -4611686018427387904l)
logger.info("r > limitvalue......");
var5 = false;
return var5;
}logger.info("redisconnection.exists");
e = false;
} catch (exception var9) ", key, var9);
boolean var4 = false;
return var4;
} finally
return e;
}
public synchronized boolean incr(string key)
var5 = false;
return var5;
}e = false;
} catch (exception var9) finally
return e;
}
使用者限購問題:
long count = template.opsforvalue().increment(key,prizelimitparam.getcount());
if (limitnum >= count) else
樂觀鎖
string lockkey = "lockkey_"+param.getuserid();random rd = new random();
int expiretime = 60
;try
}logger
.info("鎖定設定成功 lockkey{}"+lockkey);
jediscluster.setex(lockkey, expiretime, lockkey);
// todo 邏輯處理
jediscluster.del(lockkey);
return responseutil.getokresponse(null);
} catch (jybizexception e)
快取:用key去快取中查詢,如果存在使用;不存在,去db查詢,找到放進快取並使用;
穿透:乙個key在快取和db中都不存在,這樣反覆呼叫,影響效率,如果是惡意攻擊,容易連累db;
解決方案:用個map存放所有有值的key,請求過來先取map,不存在直接返回;該key第一次查到沒值,將該key和對應的空值也放進快取,過期時間設定短一點,避免併發訪問db。
雪崩:初始化資料時,同一時刻將大量的資料放進快取,快取同時失效,造成同一時刻訪問資料庫引起雪崩;
解決方案:初始化時,失效時間新增隨機數;
擊穿:併發訪問某個key,該key剛好失效,導致同一時刻訪問db,並設定快取;
解決方案:使用setnx鎖定key,第乙個人發現失效先查db並設定,必要時新增延時或迴圈;為該key設定預的失效時間,該時間小於真實失效時間,發現該key即將失效,立刻重新設定;
機器學習實戰(1)
from numpy import import operator def createdataset object group array 1.0,1.0 1.0,1.1 0,0 0,0.1 labels a a b b return group,labels def classify0 inx,...
redis學習 1 認識redis
redis是一種基於鍵值對的nosql資料庫,與其他多鍵值對資料庫不同的是,redis的值支援資料型別,redis中的值可以是string 字串 hash 雜湊 list 列表 set 集合 zset 有序集合 等多種資料結構。redis的特點 1.高效能 redis將資料儲存在記憶體中的,所以它的...
Redis 學習記錄(1)
shardedjedis是基於一致性雜湊演算法實現的分布式redis集群客戶端 redis操作都是原子的,不用考慮併發問題 開啟客戶端命令 redis cli redis cli.exe h 127.0.0.1 p 6379 redis支援五種資料型別 string 字串 hash 雜湊 list ...