シナリオの説明最近、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 が中国に進出
SEO最適化には、受注-最適化-完了の3つのステップがあります。熟練した操作に少し戸惑いを感じました...
archhosting は 2017 年に設立された新しいホスティング プロバイダーです。主な事業は...
1. トラフィックこそが王様、ユーザーが至高モバイル インターネットの時代では、トラフィックは力であ...
新しいテクノロジーが登場すると、必ず何らかの誇大宣伝が行われ、さまざまな用語、誤解、神話が生まれます...
budgetnode VPS の驚きは、同じ価格でハードディスクが 2 台になり、各ユーザーが購入で...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますEcsho...
短縮 URL については、Weibo の始まりの頃から存在していたため、私にとっては馴染みのないもの...
資本市場はビリビリの前四半期の財務報告に失望した。ユーザー規模(MAUとDAU)は前月比で増加しなか...
編集者は昨年 11 月 25 日に「ウェブサイトがワイルドカード ドメイン名で悪意を持って解決された...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています404 ペ...
内部リンクとは、同じ Web サイトのドメイン名の下にあるコンテンツ ページ間のリンクを指します。た...
[[359008]] COVID-19パンデミックにより、製造業者が現地生産と流通へとシフトするにつ...
クラウド コンピューティングは、現代のビジネスに柔軟性、効率性、拡張性、セキュリティ、コラボレーショ...
仮想化とは、オペレーティング システム、コンピュータ システム、ストレージ デバイス、ネットワーク ...
この記事では、自動車マーケティングに関する私の見解を述べます。私は広告会社で働いており、当初は日用消...