Maison > Article > base de données > Comment rendre le projet plus simultané ? Utilisez l'incrémentation automatique de l'ID pour garantir l'ordre de la file d'attente
Analyse du scénario
Ici, nous prenons comme exemple le scénario de saisie de l'enveloppe rouge. Les exigences sont les suivantes :
1.红包有个数限制,假设红包的个数限制为X。 2.红包金额上线限制,假设金额上线为Y。 3.要求用户抢红包的时候,不超过红包的个数限制X。 4.要求用户抢红包的时候,不超过红包的金额Y。 5.每个用户一次红包活动只能抢一个。
Voici les idées les plus courantes :
1.在用户抢红包时,检查当前发出去红包数量和金额,并加锁。 2.检查红包数量和金额正常的后,随机用户红包金额。 3.然后修改红包发出去的数量和金额,并给用户赠送红包,然后解锁。
1.思路简单 2.编不下去了。。。
1.锁数据回造成大量进程等待,造成浪费资源。 2.锁造成的等待,用户体验奇差。 3.对于锁机制不太了解的同学会产生一定的危险性。
Analysez d'abord, pourquoi les idées conventionnelles sont-elles lentes ?
1.在抢红包的时候,每次都需要检查红包的上限 X 和 Y。 2.锁会造成大量进程卡顿。 3.生成红包的金额时还需要检查与上限 X 跟 Y 是否有冲突。
Par exemple, la limite supérieure du nombre d'enveloppes rouges est X et la limite supérieure du montant est Y.
Puis, avant l'événement, j'insère ces X enveloppes rouges dans la base de données
et génère des numéros de série : HB1, HB2, HB3. . . . HBX
En fait, les utilisateurs n'auront besoin que de recevoir cette file d'attente d'enveloppes rouges ordonnée dans l'ordre.
Cette opération réduit beaucoup de calculs qui seront effectués en ligne à ce moment-là. Le plus important est qu’il puisse garantir la contrôlabilité de l’ensemble de l’activité de manière simple et efficace.
Une table de génération d'ID est utilisée ici et un index unique de user_id est établi pour garantir que chaque personne ne peut obtenir qu'un seul numéro de série.
1.活动创建之前,创建一张ID生成表,ID从 1 开始自增,且 user_id 唯一。 2.活动开始,用户开始抢红包操作。 3.抢红包之前,先插入ID表,获取插入ID,如果ID > X,通知用户已被抢完。 4.如果 ID <= X,那么恭喜了,去红包表领取序号为 ID 的红包,并走异步发红包过程。 5.活动结束之后,把相关用户领取信息存储在红包表,删除ID生成表。
1.不需要代码实现锁机制。 2.逻辑简单。 3.mysql保证每个用户只能拿到一个,且有序。
Certains amis ont mentionné que vous peut utiliser la file d'attente Redis pour stocker les informations des enveloppes rouges, mais en fait, Redis prend plus de mémoire. Si vous avez besoin de stocker des données pendant une longue période, il est préférable de les mettre dans MySQL. En fait, vous pouvez utiliser la commande incr de redis ici pour obtenir une fonction similaire à la table de génération d'ID mentionnée ci-dessus, qui est plus rapide et strictement incrémentielle, et peut rendre l'ensemble du projet plus simultané.
[Recommandations associées]
1. Tutoriel vidéo en ligne MySQL gratuit
2.Dernier tutoriel manuel MySQL
3. Choses sur la conception de bases de données
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!