シナリオの説明最近、Redis を使用しているときに、分散ロックに似たシナリオに遭遇しました。 Redis の分散ロックの実装と同様に、ロックの解放に失敗しました。つまり、キャッシュを削除できなかったことになります。私はまた別のRedisの穴に足を踏み入れました... これはどのような状況ですか? また、どのようにトラブルシューティングすればよいですか? この記事では主にこれについてレビューします。 トラブルシューティングロックの解除に問題があるので、まずはロックを解除するコードを見てみましょう。 ロックを解除ロックを解除するには Lua スクリプトを使用します。コードロジックと Lua スクリプトは次のとおりです。 ロック解除サンプルコード
ロックを解除するために使用されるLuaスクリプト
削除スクリプトでは、まず Redis キーの古い値が取得され、入力パラメータ値と比較されます。両者が等しい場合にのみ削除されます。 解放が成功した場合、つまり Redis キャッシュが正常に削除された場合、戻り値は 1 になります。それ以外の場合は失敗し、戻り値は 0 になります。 一見すると、コードは問題ないように見えます。テストしてみましょう。 ただし、ロックを解除する必要があるため、その前にロックする必要があります。まずロックのロジックを見てみましょう。 ロックロックのロジックに関しては、コードに実装する方法が 2 つあります。 サンプルコード1
サンプルコード2
実際、それらの違いは、前者は RedisTemplate を使用し、後者は StringRedisTemplate を使用することです。
まずこの 2 つの方法をテストしてみてはいかがでしょうか? 試してみるそれぞれロックするには 2 つの方法を使用します。lock01 は k1 と v1、lock02 は k2 と v2 です。 k1 と k2 の値をそれぞれ見てみましょう (ツール: RDM、Redis Desktop Manager を使用)。 v1 には二重引用符がありますが、v2 には二重引用符がないことがわかります。 シリアル化の問題だと思います。 Redis の設定を見てみましょう。 Redisテンプレートの設定ロックを見るとわかるように、k1 は RedisTemplate を使用し、k2 は StringRedisTemplate を使用しています。それぞれの構成の違いは何ですか? RedisTemplate の構成は次のようにカスタマイズされます。
StringRedisTemplate の構成は SpringBoot のデフォルトの構成です。
PS: SpringBootのバージョンは2.1.13.RELEASEです StringRedisTemplate をクリックして確認してみましょう。
シリアル化設定に注意し、方法が何であるかを確認するためにフォローアップを続けます。
ご覧のとおり、StringRedisTemplate のキーと値は、デフォルトで StringRedisSerializer(StandardCharsets.UTF_8) によってシリアル化されます。 RedisTemplate のキーは StringRedisSerializer を使用し、値は Jackson2JsonRedisSerializer を使用してシリアル化されています (なぜこれを使用するかについては、ここでは書きません)。 この時点で、基本的に問題を特定できます。RedisTemplate の値のシリアル化が StringRedisTemplate と一致していません。 一貫性を保つために変更しても大丈夫でしょうか?確認してみてください。 推論を検証するRedisTemplate の値のシリアル化メソッドを StringRedisSerializer に変更します。
さらに 2 つのロック ロジックを呼び出して、k1 と k2 の値を確認します。 ご覧の通り、v1 の二重引用符はなくなり、ロックを解除するサービスは正常に削除できます。 まあ、それがここでの問題です。 2 つのシリアル化のソース コードについては、興味のある友人が引き続き学習できるので、ここでは詳しく説明しません。 まとめこの記事で発生した問題は、主に、ロックのロックと解除に異なる Redis テンプレートが使用され、これら 2 つのテンプレートが異なるシリアル化方法を使用しているために発生し、最終的にはシリアル化によって問題が発生します。 当時は本当に不注意だったので、しばらくは理解できませんでした... 実稼働環境に関しては、まるで奈落の底に立っているか、薄氷の上を歩いているかのように、依然として細心の注意を払う必要があります。 |
>>: ハイパーコンバージェンス「ハードからソフトへ」: ハイブリッド クラウド向けに設計された Azure Stack HCI が中国に進出
デスクトップクラウドの進化と、世代から世代へと受け継がれてきたさまざまなデスクトップ管理技術は、「デ...
私の友人の中には、ロングテール理論を聞いたことがある人がかなりいると思います。この理論はアメリカ人が...
Hosthatchは、主に欧米のデータセンター(米国ロサンゼルスとニューヨーク、スウェーデンのストッ...
【2017年10月31日、中国北京】10月26日、華為技術有限公司、艾軟石信息技術(集団)有限公司、...
ウェブサイトのランキングが不安定です。どのウェブマスターもいくつかの理由を教えてくれますが、多くのウ...
海外のIDCが中国市場に参入して以来、大多数のユーザーから熱烈な歓迎を受けています。国内IDC製品の...
MemCacheとはMemCache は、動的な Web アプリケーションがデータベースの負荷を軽減...
2008 年に設立されたベトナムのホスティング会社である vinahost は、ベトナム、タイ (機...
ご存知のとおり、ソフトテキストマーケティングは、SEO最適化プロセスにおいて非常に優れたマーケティン...
ipxcore がついに KVM を正式にリリースしました。最初のデータセンターはニューヨーク州バッ...
ほとんどの IT リーダーは、より優れた、より高速な、またはより安価なコンピューティング サービスと...
サークルを抜け出した後、ビリビリでもう一つの大きな出来事が起こりました。ビリビリが香港株式市場に上場...
中国の旧正月が近づいており、losangelesvps もこの楽しみに参加し、中国の旧正月向けの特別...
Baidu による医療 SEO の継続的な取り締まりにより、多くの医療 SEO 担当者は最近ますます...
raksmart は現在、香港、日本、サンノゼ、ロサンゼルスのデータセンターのクラウド サーバー (...