recherche

Maison  >  Questions et réponses  >  le corps du texte

java - mysql如何限制每天insert的次数?

需求是这样的:
用户每天最多领取礼包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);
大家讲道理大家讲道理2892 Il y a quelques jours515

répondre à tous(6)je répondrai

  • PHPz

    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.

    répondre
    0
  • PHPz

    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

    répondre
    0
  • 高洛峰

    高洛峰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.

    répondre
    0
  • 迷茫

    迷茫2017-04-18 09:09:46

    Il est recommandé de le faire au niveau de la couche logique

    répondre
    0
  • 巴扎黑

    巴扎黑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

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 09:09:46

    Si vous devez utiliser MySQL pour le faire, utilisez des transactions pour vous en assurer.

    répondre
    0
  • Annulerrépondre