ホームページ  >  記事  >  バックエンド開発  >  同時実行性が高い場合、http リクエストは現在のリクエストの絶対数を返すにはどうすればよいでしょうか?

同時実行性が高い場合、http リクエストは現在のリクエストの絶対数を返すにはどうすればよいでしょうか?

WBOY
WBOYオリジナル
2016-08-18 09:16:211053ブラウズ

たとえば、私の最初のアクセスリクエストは次の json を返しました:
{"n": 1}

100 回目のアクセスリクエストで json が返されました:
{"n": 100}

データベースに書き込んでからデータベースをチェックして結果を返すという従来の方法は、同時実行性が大きい場合は保証されないようです。どうすればよいですか?これが最も単純な質問になるはずです

返信内容:

たとえば、私の最初のアクセスリクエストは次の json を返しました:
{"n": 1}

100 回目のアクセスリクエストで json が返されました:
{"n": 100}

データベースに書き込んでからデータベースをチェックして結果を返すという従来の方法は、同時実行性が大きい場合には保証されないようです。どうすればよいですか?これが最も単純な質問になるはずです

最も簡単な方法は、自動インクリメントされる ID の主キーを使用して mysql テーブルを構築し、リクエストごとにレコードを挿入し、読み取られた ID が必要な値を読み取ることです。

その後、ID 値に基づいて同時実行性の高いシナリオを簡単に処理できます。たとえば、[インスタント キル] では、ID が 300 未満で 6 で割り切れるというルールを使用して、インスタント キルが成功したと見なすことができます。 ID が 300 未満で 6 で割り切れるルール、[宝くじ] は ID が 100 (100 分の 1) で割り切れるルールを当選として使用できます。

自分で実装した場合、ソケットリクエストを処理し、グローバル変数を維持するシングルスレッドの無限ループにすぎません。既製の mysql を使用するほど便利ではなく、信頼性も高くありません。

修正であれば、他の言語であっても、ほぼ同じですjava的话,一个全局的AtomicLong可以满足你的需求吧,getAndIncrement原子操作,再加上volatile

redis で setnx(id) を使用すると、単一スレッドで毎回 1 ずつ増加することが保証され、またインメモリ データベースであるため、超高速です。

  • 読み取り操作: キャッシュを使用します

  • 書き込み操作: キューを使用した非同期書き込み

純粋な Java では、カウンター オブジェクトをシングルトンにして、

を介してデータベースから取得できますか? filter拦截所有请求计算器加1(需要同步)。不知道你说的数据库是什么意思,{n : 100},n

実際、あなたがやりたいのは、リクエストに従ってキューに入れられ、処理される永続的なメモリキューです。

単一のマシン上で、Linux メモリファイルシステム上の /dev/shm で SQLite の読み取りと書き込みを試すことができます。 tmpfs)
ファイルの読み取りにはネットワークを経由する必要がなく、メモリ常駐、ロック、自動インクリメント、および一意の制約を自分で実装する必要もありません。 リーリー

最も簡単な方法は、自動インクリメントに Redis の zset を使用することです。これは効率的で簡単です。単一のマシンを使用している場合は、atomiclong の使用を検討することもできます (シャットダウンして再起動すると無効になります)。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。