Maison > Questions et réponses > le corps du texte
需求是这样的:
用户每天最多领取礼包3次,每次insert一条记录,但是在并发的情况下会超出3次,如果解决?
有个已知的方法如下,但是并发下会产生死锁
INSERT INTO t_test (gift_id, user_id, `date`) SELECT v_gift_id, v_user_id, v_date FROM dual WHERE not exists (select * from t_test where `user_id` = v_user_id and `date` = v_date GROUP BY `user_id`, `date` HAVING count(*) > 2);
PHPz2017-04-18 09:09:46
Comme l'a dit @junze, cela se fait généralement avec redis
.
Par exemple, stockez le nombre de fois pour chaque utilisateur redis
dans insert
. Si le format key
est user:count
Vérifiez d'abord la valeur de count
à chaque fois, si elle est inférieure à 3, effectuez l'insertion et jugez le résultat de insert
Si l'insertion est réussie, exécutez key
pour user:count
incr
. , incr user:count
, et l'écriture échoue incr
n'est pas exécutée.
Cela peut éviter une concurrence élevée dépassant 3.
En même temps, vous pouvez régler le délai d'expiration key
pour cela expire user:count 60*60*24
à 1 jour. Après un jour, la clé sera supprimée et réinitialisée le lendemain.
PHPz2017-04-18 09:09:46
Utilisez le type de chaîne de Redis pour compter. Redis prend mieux en charge la concurrence élevée
高洛峰2017-04-18 09:09:46
MySQL ne peut pas faire cela à votre place. Vous pouvez mettre le nombre de paquets cadeaux de l'utilisateur dans le cache, ajouter des constantes comme clé de cache en fonction de l'ID de l'utilisateur, y stocker le numéro et le récupérer du cache à chaque fois. il est inséré. Retirez le nombre de fois et jugez s'il est inférieur à votre numéro, continuez. Si ce n'est pas inférieur à votre numéro, continuez. Si vous continuez, le nombre sera augmenté de un après insertion et placé dans le cache.
巴扎黑2017-04-18 09:09:46
Mysql ne semble pas avoir ce mécanisme, et j'ai l'impression que ce contrôle est aussi un contrôle logique
PHP中文网2017-04-18 09:09:46
Si vous devez utiliser MySQL pour le faire, utilisez des transactions pour vous en assurer.