Heim  >  Artikel  >  Datenbank  >  So implementieren Sie Pipelines durch die Integration von Redis in SpringBoot

So implementieren Sie Pipelines durch die Integration von Redis in SpringBoot

WBOY
WBOYnach vorne
2023-05-30 09:19:561381Durchsuche

1. Redis-Pipeline

Um einen Redis-Befehl auszuführen, müssen der Redis-Client und der Redis-Server die folgenden Schritte ausführen:

  • Der Client sendet den Befehl an den Server.

  • Der Server akzeptiert die Befehlsanforderung Führt den Befehl aus und erzeugt entsprechende Ergebnisse.

  • Der Server gibt die Ergebnisse an den Client zurück.

  • Der Client akzeptiert die Ausführungsergebnisse des Befehls und zeigt sie dem Benutzer an.

Die meiste Zeit, die der Redis-Befehl verbraucht, wird für das Senden von Befehlsanforderungen und den Empfang von Befehlsergebnissen, das Zusammenpacken einer beliebigen Anzahl von Redis-Befehlsanforderungen und das anschließende Senden aller auf einmal an den Server und schließlich an den Server ausgegeben Wenn Anfragen verarbeitet werden, werden alle ihre Ausführungsergebnisse auf einmal an den Client zurückgegeben.

Hinweis:

Der Redis-Server begrenzt nicht die Anzahl der vom Client in die Pipeline aufgenommenen Befehle, legt jedoch ein Standardvolumenlimit von 1 GB für den Eingabepuffer des Clients fest: wenn die vom Client gesendete Datenmenge diesen Wert überschreitet Wenn das Limit erreicht ist, wird der Redis-Server den Client zwangsweise schließen. Daher ist es am besten, nicht eine große Anzahl von Befehlen oder einige sehr große Befehle gleichzeitig in derselben Pipeline auszuführen.

Darüber hinaus haben viele Clients auch implizite Puffergrößenbeschränkungen. Wenn Sie feststellen, dass einige Pipeline-Befehle bei Verwendung der Pipeline-Funktion nicht ausgeführt werden oder die von der Pipeline zurückgegebenen Ergebnisse unvollständig sind, liegt möglicherweise ein Fehler in Ihrem Programm vor Die integrierte Puffergrößenbeschränkung des Clients.

2. SpringBoot-integrierte Redis-Pipeline-Instanz

SpringBoot-integrierte Redis-Instanz

Verwenden Sie einen einzelnen Inkrementierungsbefehl, um 2 Millionen Schlüssel zu verarbeiten:

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 <p>Der Zeitverbrauch ist wie folgt: 12 Bit, Einheit ns<br></p><p><img src="https://img.php.cn/upload/article/000/887/227/168540959894676.png" alt="So implementieren Sie Pipelines durch die Integration von Redis in SpringBoot"></p><p> Verwendung Die Pipe incrBy verarbeitet 2 Millionen Schlüssel, packt jedes Mal 300 Befehle und sendet sie an den Server, wie unten gezeigt: </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>

Zeitverbrauch: 11 Bit, Einheit: ns, was 1/6 der von a benötigten Zeit entspricht einzelner Befehl.

So implementieren Sie Pipelines durch die Integration von Redis in SpringBoot

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Pipelines durch die Integration von Redis in SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen