Maison  >  Article  >  base de données  >  Comment implémenter des pipelines en intégrant Redis dans SpringBoot

Comment implémenter des pipelines en intégrant Redis dans SpringBoot

WBOY
WBOYavant
2023-05-30 09:19:561380parcourir

1. Pipeline Redis

Pour exécuter une commande Redis, le client Redis et le serveur Redis doivent effectuer les étapes suivantes :

  • Le client envoie la commande au serveur

  • Le serveur accepte la demande de commande et exécute la commande, produit les résultats correspondants ;

  • Le serveur renvoie les résultats au client

  • Le client accepte les résultats de l'exécution de la commande et les affiche à l'utilisateur ;

La plupart du temps consommé par la commande Redis est consacré à l'envoi de requêtes de commande et à la réception des résultats de commande, à regrouper un nombre quelconque de requêtes de commande Redis, puis à les envoyer toutes au serveur en même temps, et au serveur Après toute commande les demandes sont traitées, tous les résultats de leur exécution seront renvoyés au client en une seule fois.

Remarque :

Le serveur Redis ne limite pas le nombre de commandes incluses dans le pipeline par le client, mais il définit une limite de volume par défaut de 1 Go pour le tampon d'entrée du client : lorsque la quantité de données envoyées par le client dépasse cette limite. Lorsque la limite est atteinte, le serveur Redis fermera de force le client. Par conséquent, il est préférable de ne pas exécuter simultanément un grand nombre de commandes ou des commandes très volumineuses dans le même pipeline.

De plus, de nombreux clients ont également des limites implicites de taille de tampon. Si vous constatez que certaines commandes de pipeline ne sont pas exécutées lors de l'utilisation de la fonctionnalité de pipeline, ou si les résultats renvoyés par le pipeline sont incomplets, il est possible que votre programme ait atteint le niveau requis. limite de taille de tampon intégrée du client.

2. Instance de pipeline Redis intégrée SpringBoot

Instance Redis intégrée SpringBoot

Utilisez une seule commande d'incrémentation pour traiter 2 millions de clés :

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>La consommation de temps est la suivante : 12 bits, unité ns<br></p><p><img src="https://img.php.cn/upload/article/000/887/227/168540959894676.png" alt="Comment implémenter des pipelines en intégrant Redis dans SpringBoot"></p><p> Utilisation le tube incrBy pour traiter 2 millions de clés, et empaqueter 300 commandes à chaque fois et les envoyer au serveur, comme indiqué ci-dessous : </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>

Temps consommé : 11 bits, unité : ns, soit 1/6 du temps pris par un commande unique.

Comment implémenter des pipelines en intégrant Redis dans SpringBoot

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer