java - mysql如何限制每天insert的次数?
大家讲道理
大家讲道理 2017-04-18 09:07:46
0
6
506

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

光阴似箭催人老,日月如移越少年。

全員に返信(6)
PHPzhong

@junze が言ったように、通常は redis で行われます。

例えば、redisにはユーザーごとの回数insertを格納します。 key 形式が user:count

の場合

まず、毎回 count の値を確認し、3 未満の場合は挿入を実行し、insert の結果を判定します。挿入が成功した場合は、key、user:count を実行します。 > incr となり、書き込みは失敗します。incr user:count は実行されません。 incr

これにより、3 を超える高い同時実行を回避できます。

同時に、この

の有効期限 key を 1 日に設定でき、1 日後にキーは削除され、翌日に再初期化されます。 expire user:count 60*60*24

いいねを押す +0
PHPzhong

カウントには Redis の文字列タイプを使用します。Redis は高い同時実行性をより適切にサポートします。

いいねを押す +0
小葫芦

MySQL では、ユーザーのギフト パッケージの数をキャッシュに保存し、ユーザーの ID に基づいてキャッシュ キーとして定数を追加し、その数を保存し、毎回キャッシュから取得することはできません。挿入された回数を取り出し、自分の回数より少ないかどうかを判断し、少なくない場合は続行します。続行すると、挿入後に数値が 1 つ増加し、キャッシュに配置されます。

いいねを押す +0
迷茫

ロジック層で行うことをお勧めします

いいねを押す +0
巴扎黑

Mysqlにはこの仕組みは無いようで、この制御も論理制御な気がします

いいねを押す +0
洪涛

これを行うために mysql を使用する必要がある場合は、トランザクションを使用して確実に実行してください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート