Maison  >  Article  >  base de données  >  Introduction à la méthode Redis de mise en œuvre des ventes flash (avec code)

Introduction à la méthode Redis de mise en œuvre des ventes flash (avec code)

不言
不言avant
2019-04-12 09:44:245872parcourir

Le contenu de cet article est une introduction à la méthode de réalisation de ventes flash dans Redis (avec code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Introduction : Comme tout le monde le sait à propos de la vente Flash, les demandes d'accès vont augmenter dans un court laps de temps. Dans le même temps, il est nécessaire de s'assurer que les données ne sont pas survendues et que les données sont exactes, ce qui est vrai. est encore un test technique. Malheureusement, il n'y a jamais eu la possibilité de le mettre en œuvre dans le projet. Après avoir lu quelques informations supplémentaires, j'ai l'intention d'expérimenter. Le code suivant est uniquement destiné aux tests et l'environnement est relativement simple. Veuillez le modifier en fonction de la situation réelle.

Créer une file d'attente de vente flash

Avant de démarrer la vente flash, mettez d'abord le produit dans la file d'attente, comme suit

/**
     * 创建秒杀列表
     */
    public function createList()
    {
        $count = 30;
        $redisKey = 'goods_list';

        for ($i = 1; $i = $count) {
                break;
            }

            Redis::rpush($redisKey, $i);
        }
    }

Après l'exécution , dans Redis Si vous regardez

Introduction à la méthode Redis de mise en œuvre des ventes flash (avec code), il y a 30 ID de produit et les données sont normales.

Vente Flash

L'étape suivante consiste à utiliser la commande Redis lpop pour obtenir l'ID du produit, en profitant de l'atomicité de Redis.

/**
     * 秒杀
     */
    public function buy()
    {
        // 随机用户名,无意义,仅做标记
        $username = Hash::make(now());

        if ($goodsId = Redis::lpop('goods_list')) {
            // 购买成功
            Redis::hset('buy_success', $goodsId, $username);
        } else {
            // 购买失败
            Redis::incr('buy_fail');
        }
    }

Comme ci-dessus, le code est simplifié. Après l'achat, le succès ou l'échec est uniquement enregistré. Dans les applications réelles, cela sera bien sûr plus compliqué, mais attention à ne pas faire fonctionner Mysql de manière synchrone. Encore une chose, Hash:make(now()) Même si les valeurs sont les mêmes, les mêmes données ne seront pas générées, référez-vous ici.

Test

La dernière étape consiste à tester, utiliser ab test, exécuterab -c 300 -n 3000 http://localhost/buy/, la commande ci-dessus signifie 300 simultanéités, un total de 3000 requêtes

Introduction à la méthode Redis de mise en œuvre des ventes flash (avec code)

Exécution terminée, pas très rapide, et il y a eu 794 échecs d'accès. Voyons si les données sont correctes. Imprimez la buy_successvaleur

Introduction à la méthode Redis de mise en œuvre des ventes flash (avec code)

30 gagnants dans la page. Regardons le nombre de ventes flash échouées.

Introduction à la méthode Redis de mise en œuvre des ventes flash (avec code) n'est pas un nombre précis, 2165+30 est le nombre de demandes réussies, en ajoutant les 794 demandes échouées, le total est de 2989, ce qui est toujours. moins de 3000.

Conclusion

Les tests ci-dessus présentent des défauts, tels qu'une vitesse de réponse lente, des requêtes échouées et un nombre d'échecs inexact. Il semble qu'il existe de nombreux endroits à optimiser, pas seulement la couche de code. Lors du test, j'ai oublié de désactiver l'enregistrement d'accès à la base de données, ce qui peut avoir un impact.
Ce qui est bien, c'est que le nombre de ventes flash réussies est précis et non survendu. [Recommandations associées : Tutoriel Redis]

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