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
, il y a 30 ID de produit et les données sont normales.
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.
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
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_success
valeur
30 gagnants dans la page. Regardons le nombre de ventes flash échouées.
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!