首頁 > 資料庫 > Redis > SpringBoot中如何透過整合Redis來實現管道

SpringBoot中如何透過整合Redis來實現管道

WBOY
發布: 2023-05-30 09:19:56
轉載
1446 人瀏覽過

1. Redis 之管道(pipeline)

執行一個Redis命令,Redis客戶端和Redis伺服器就需要執行以下步驟:

  • 客戶端發送命令到伺服器;

  • 伺服器接受命令請求,執行命令,產生相應的結果;

  • ##伺服器返回結果給客戶端;

  • 客戶端接受命令的執行結果,並向使用者展示。

Redis指令所消耗的大部分時間都用在了發送命令請求和接收命令結果上面,把任意多條Redis命令請求打包在一起,然後一次性地將它們全部發送給伺服器,而伺服器則會把所有命令請求都處理完畢之後,一次地將它們的執行結果全部回傳給客戶端。

注意事項:

Redis伺服器並不會限制客戶端在管道中包含的命令數量,但是卻會為客戶端的輸入緩衝區設定預設值為1GB的體積上限:當當客戶端發送的資料量超過此限制時,Redis伺服器將強制關閉該客戶端。因此最好不要一下把大量指令或一些體積非常龐大的指令放到同一個管道中執行。

除此之外,許多客戶端本身也帶有隱含的緩衝區大小限制,如果你在使用管線特性的過程中,發現某些管線指令沒有被執行,或是管線回傳的結果不完整,那麼很可能就是你的程式觸碰到了客戶端內建的緩衝區大小限制。

2. SpringBoot 整合Redis 管道實例

SpringBoot 整合redis 的實例

使用單一的increment 指令,處理200w個key:

public class RedisPipelineStudy extends BaseTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final String PREFIX = "test0:";

    @Test
    public void test() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("test0");
        for (int times = 0; times #使用單一的increment 指令,處理200w個key:<p></p><pre class="brush:php;toolbar:false">public class RedisPipelineStudy extends BaseTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    private static final String PREFIX = "test1:";

    @Test
    public void test() {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start("test1");
        List<integer> recordList = new ArrayList();
        for (int times = 0; times  300) {
                        incrByPipeline(recordList);
                        recordList = new ArrayList();
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
            if (!CollectionUtils.isEmpty(recordList)) {
                incrByPipeline(recordList);
                recordList = new ArrayList();
            }
        }
        stopWatch.stop();
        System.out.println(stopWatch.prettyPrint());
    }

    private void incrByPipeline(List<integer> recordList) {
        stringRedisTemplate.executePipelined(new RedisCallback<object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                try {
                    for (Integer record : recordList) {
                        byte[] key = (PREFIX + record).getBytes();
                        connection.incrBy(key, 1);
                    }
                } catch (Exception e) {
                    System.out.println(e);
                }
                return null;
            }
        });
    }
}</object></integer></integer>
登入後複製

# 耗時如下所示:是12 位,單位ns

SpringBoot中如何透過整合Redis來實現管道

使用管道incrBy 處理200w個key,每次打包300個指令傳送給伺服器,如下所示:

rrreee
耗用時間: 11 位,單位:ns,是單一指令耗時的1/6。

SpringBoot中如何透過整合Redis來實現管道

####

以上是SpringBoot中如何透過整合Redis來實現管道的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板