多執行緒,高併發的情況下操作redis當中的資料,如何加鎖?
多個執行緒同時去操作Redis當中的資料,假如不加鎖的情況下,會出現資料重複的問題。假如需要每次都只有一條執行緒去操作Redis當中的資料,需要給操作加上鎖。
但是去網上一搜,網上給Redis加鎖的機制都是利用Redis的setnx自身的方法去加鎖,但是這樣加鎖首先麻煩,得手動防止死鎖等問題,速度還不快。
下面是我自己測試通過的如何給redis加鎖的程式碼,僅供自己參考和有需要的人蔘考。
@Scheduled(initialDelay = 1000, fixedDelay = 60000)
public void redisTest(){
Jedis jedis = jedisPool.getResource();
try{
jedis.set("red_packet_num","5000");
}catch (Exception e)
{
e.printStackTrace();
if (jedis != null) {
jedis.close();
}
}
finally {
if (jedis != null) {
jedis.close();
}
}
Lock lock=new ReentrantLock();
for(int i=0;i<2000;i++){
fixedThreadPool.execute(new Runnable() {
@Override
public void run() {
Jedis jedis = jedisPool.getResource();
try {
lock.lock();
String red_packet_num = jedis.get("red_packet_num");
int a = Integer.parseInt(red_packet_num) - 1;
jedis.set("red_packet_num", String.valueOf(a));
lock.unlock();
System.out.println("資料是:" + a+"當前執行緒是:"+Thread.currentThread().getName()+"當前時間"+ CommonUtil.getCurrentTimeFormatForHMS());
}
catch (Exception e){
e.printStackTrace();
if (jedis != null) {
jedis.close();
}
}
finally {
if (jedis != null) {
jedis.close();
}
}
}
});
}
}
產生的資料如下: