たとえば、私の最初のアクセスリクエストは次の 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)
ファイルの読み取りにはネットワークを経由する必要がなく、メモリ常駐、ロック、自動インクリメント、および一意の制約を自分で実装する必要もありません。
リーリー