redisTemplet如何批量插入資料

2021-08-19 10:08:12 字數 1770 閱讀 1996

之前已經寫過一篇關於springboot如何配置redis的文章:springboot如何配置redis。但是在應用中遇到乙個問題,批量插入資料時,當資料量過大時(大概6w+條資料),如果迴圈對每條資料使用set或者mset操作,需要時間非常長,檢視原始碼發現使用redistemlate進行基本操作時,每次操作都需要拿到connection然後再進行操作,由於redis是單執行緒的,下一次請求必須等待上一次請求執行完成後才能繼續執行,所以批量操作時就會很慢。

defaulthashoperations中put實現:

public void put(k key, hk hashkey, hv value) 

}, true);

}

defaulthashoperations中set實現

public void set(k key, v value) 

}, true);

}

所以就在網上找有沒有相關的解決方案,網上找到了使用jedis使用pipeline的方案,使用pipeline可以通過客戶端一次傳送多個請求,無需等待服務端返回,這樣就能大大減少互動的時間,提高系統效能,這種方案確實可以解決問題,插入6w+條資料大概1s左右就可以插入,但是**看著很彆扭,因為使用了需要使用兩套redis配置,為了讓**看著更統一,在想redistemplate是否提供了pipeline的方式,果然redistemplate是提供pipeline了相關介面:

public listexecutepipelined(rediscallback<?> action)

public listexecutepipelined(final rediscallback<?> action, final redisserializer<?> resultserializer) 

listclosepipeline = connection.closepipeline();

pipelinedclosed = true;

var5 = redistemplate.this.deserializemixedresults(closepipeline, resultserializer, redistemplate.this.hashkeyserializer, redistemplate.this.hashvalueserializer);

} finally

}return var5;

}});

}

可以看到在executepipelined方法中,使用了pipeline方式,其中的操作邏輯在action.doinredis(connection),所以需要我們自定義乙個rediscallback的介面實現類,並且實現doinredis方法,在該方法中實現我們自己的邏輯,主要是對redis的操作,例如:

private void batchcachemarketinfo(listdatalist, long expire) 

return null;

}});

}

這樣就能使用redistemplate實現pipeline的操作了。其實使用redistemplate和jedis的思路類似,都是開啟了pipeline,然後在進行資料的操作。

並不是所有場景都適合使用pipeline方式,有些系統可能對可靠性要求很高,每次操作都需要立馬知道這次操作是否成功,是否資料已經寫進redis了,這種場景就不適合了。像我這種需求就是對實時性沒有那麼強,對每條資料不需要馬上知道結果,所以比較適用。

InstallShield中如何呼叫批處理檔案

在installshield中呼叫批處理檔案其實是安裝打包中很常用的一種手段,通過批處理啟動服務,進行資料庫初始配置等等。在實際操作中,針對不同工程型別,對批處理的呼叫還是有很多疑惑困擾著大家,撰寫此文希望能幫助到那些被困擾的打包開發人員。這裡假設我們的需求是要啟動安裝路徑下的批處理檔案sample...

InstallShield中如何呼叫批處理檔案

在installshield中呼叫批處理檔案其實是安裝打包中很常用的一種手段,通過批處理啟動服務,進行資料庫初始配置等等。在實際操作中,針對不同工程型別,對批處理的呼叫還是有很多疑惑困擾著大家,撰寫此文希望能幫助到那些被困擾的打包開發人員。這裡假設我們的需求是要啟動安裝路徑下的批處理檔案sample...

mysql儲存過程跑批 mysql如何建立儲存過程

儲存過程 stored procedure 一組可程式設計的函式,是為了完成特定功能的sql語句集,經編譯建立並儲存在資料庫中,使用者可通過指定儲存過程的名字並給定引數 需要時 來呼叫執行。優點 為什麼要用儲存過程?將重複性很高的一些操作,封裝到乙個儲存過程中,簡化了對這些sql的呼叫 批量處理 s...