シナリオの説明最近、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 が中国に進出
[[429810]]詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したH...
著者: Han Weisen は、China Mobile Cloud Capability Cen...
最近、百度検索エンジンは頻繁にアルゴリズムを調整しています。数日前、私のウェブサイトの1つが毎日2つ...
企業の発展と成長は、ユーザーの評判の浸透から切り離すことはできません。特に、成長段階にある新興企業は...
パンケーキにも独自のインターネットの夢があります。 20平方メートル未満の面積のパンケーキショップが...
最近、アリババがテンセントWeChat上でタオバオ特別版ミニプログラムを立ち上げ、特定のシナリオでタ...
Sentrisからの最新ニュース:公式の超低価格VPSがまもなく値上げされます。 3月4日までに購入...
今日は主に301リダイレクトの問題についてお話しします。少し前に、Jianzhanzhichuang...
多くの新規参入者の心の中では、SEO はオンライン プロモーションであり、オンライン プロモーション...
モバイルインターネットアプリプロモーションの最高峰私はかつてプロモーションの仕事に就いていましたが、...
トレーニングの目的: 今日のインターネットの急速な発展により、大量の高品質のトラフィックをウェブサイ...
delimiter.com の特別価格サーバーは、数年間にわたって運用されています。これらのサーバー...
今は最高の時であり、最悪の時でもあります。数え切れないほどの人々が Google ペンギン アップデ...
プログラマーとして、私たちは万華鏡のように常に変化するテクノロジーの世界にいます。私たちは、テクノロ...
HAYTEK TECHNOLOGIES が所有するブランドである vds4you は、21% 割引の...