Redis Chat (1): ナレッジグラフの構築

Redis Chat (1): ナレッジグラフの構築

シナリオ: Redis インタビュー

[[264477]]

(インターネットからの写真)

  1. 面接官: あなたの履歴書を見ると、Redis を使いこなしていると書かれています。Redis がどのような用途で使用されているか教えていただけますか?
  2.  
  3. Xiao Wang : (内心喜んでいました。Redis はキャッシュではないのですか?) Redis は主にキャッシュとして使用され、メモリを通じて非永続的なデータを効率的に保存します。
  4.  
  5. インタビュアー: Redis は永続ストレージとして使用できますか?
  6. シャオ・ワン:うーん…大丈夫だと思うよ…
  7.  
  8. インタビュアー: Redis は永続化操作をどのように実行しますか?
  9.  
  10. シャオ・ワン:うーん...あまり明確ではないですね。
  11.  
  12. インタビュアー: Redis のメモリ削除メカニズムとは何ですか?
  13.  
  14. シャオ・ワン:えーと…まだ理解できていないんです。
  15.  
  16. インタビュアー: Redis で他に何ができるのでしょうか? どの Redis コマンドを使用すればよいのでしょうか?
  17.  
  18. Xiao Wang: Redis は分散ロックやメッセージ キューにも使用できるということしか知りません...
  19.  
  20. インタビュアー:それでは、次の話題に移りましょう。

考察:インタビュー中のRedisに関するXiao Wangのパフォーマンスと回答は明らかに失敗だった。 Redis は私たちが仕事で毎日使用しているものなのに、なぜ面接で減点対象になってしまうのでしょうか?

開発者として、私たちはビジネス開発に集中できるように、偉大な神々によってパッケージ化されたものを使用することに慣れていますが、これらの一般的なツールの基本的な実装が何であるかを知りません。そのため、日常生活ではそれらをうまく使用できても、面接になると面接官に好印象を与えることができません。

この記事では、Redis の原理や応用など、いくつかの知識ポイントをまとめており、皆様のお役に立てれば幸いです。

Redisとは

  • REmote DIctionary Server (Redis) は、Salvatore Sanfilippo によって作成されたキー値ストレージ システムです。
  • Redis は、ANSI および C 言語で記述されたオープンソースのログ型キー値データベースで、BSD プロトコルに準拠し、ネットワークをサポートし、メモリベースまたは永続的に使用できます。また、複数の言語で API も提供しています。

ここでは、Redis チュートリアルの Redis の説明を引用しました。これは非常に公式ですが、非常に標準的なものです。 メモリベースと永続性の両方を備えたログベースのキー値データベース。 この説明は非常に適切かつ包括的だと思います。

1. Redisの業界における地位

Redis は、インターネット技術分野で最も広く使用されているストレージミドルウェアです。超高性能、多面的なアプリケーション機能、豊富で完全なクライアントサポートで広く評価されており、特にそのパフォーマンスと読み取り速度により、この分野で最も人気のあるミドルウェアとなっています。基本的に、JD.com、Alibaba、Tencent、GitHub などの多くの大手インターネット企業を含むすべてのソフトウェア企業が Redis を使用しています。そのため、Redis はバックエンド開発者にとって欠かせないスキルにもなっています。

2. ナレッジグラフ

私の意見では、各テクノロジーを学ぶには明確なコンテキストと構造が必要です。そうでないと、何を学んだのか、どれだけ学んでいないのかがわかりません。本と同じように、目次がなければ魂を失ってしまいます。

そこで、Redis のナレッジグラフ、通称マインドマップを下図のようにまとめてみました。ナレッジポイントは完全ではない可能性があり、今後も継続的に更新・補足していきます。

このシリーズの記事の知識ポイントは、基本的にこのマインドマップと一致します。この記事ではまずRedisの基礎知識を紹介し、以降の記事ではRedisのデータ構造、アプリケーション、永続性などについて詳しく紹介します。

Redisの利点

1. 速い

キャッシュツールとして、Redis の最もよく知られている特徴はその速度です。どのくらい速いのでしょうか? Redis の単一マシン qps (1 秒あたりの同時実行数) は 110,000 回/秒に達し、書き込み速度は 81,000 回/秒です。では、Redis はなぜこんなに速いのでしょうか?

  • ほとんどのリクエストは純粋なメモリ操作であり、非常に高速です。
  • 特に高速な検索操作を備えた多くのデータ構造がデータ ストレージに使用されます。Redis のデータ構造は特別に設計されています。たとえば、HashMap では、検索と挿入の時間計算量は O(1) です。
  • 不要なコンテキスト切り替えや競合状態を回避するために、単一スレッドが使用されます。複数のプロセスまたはスレッド間の切り替えによる CPU 消費はありません。さまざまなロックの問題を考慮する必要がありません。ロックまたは解放操作はなく、デッドロックの可能性によるパフォーマンスの消費もありません。
  • 非ブロッキング I/O 多重化メカニズムが使用されます。

2. 豊富なデータ型

Redis には、文字列、リスト、ハッシュ、セット、zset という 5 つのよく使用されるデータ型があります。各データ型には独自の用途があります。

3. アトミック性、トランザクションのサポート

Redis はトランザクションをサポートしており、すべての操作はアトミックです。Redis は、複数の操作を組み合わせたアトミック実行もサポートしています。

4. 豊富な機能

Redis には、分散ロックとして使用したり、データを永続化したり、メッセージ キュー、ランキング リスト、カウンターとして使用したり、パブリッシュ/サブスクライブ、通知、キーの有効期限などをサポートしたりするなど、豊富な機能があります。ミドルウェアを使用して実際の問題を解決したい場合、Redis は常にその役割を果たすことができます。

Redis と Memcache の比較

Memcache と Redis はどちらも優れた高性能のインメモリ データベースです。通常、Redis について話すときは、Memcache と Redis を比較します。 (なぜ比較する必要があるのでしょうか? もちろん、Redis の素晴らしさを強調するためです。比較しなければ害はありませんよ~) 比較のポイントは次のとおりです。

(1)保管方法

  • Memcache はすべてのデータをメモリに保存するため、停電後にクラッシュします。データの永続性は実現できず、データはメモリ サイズを超えることはできません。
  • Redis のデータの一部はハードディスクに保存されるため、データの永続性が保証されます。

(2)データサポートタイプ

  • Memcache のデータ型のサポートは比較的単純で、文字列型のデータ構造のみをサポートします。
  • Redis には、文字列、リスト、ハッシュ、セット、Zset など、豊富なデータ型があります。

(3)使用された基礎モデル

  • クライアントとの通信の基礎となる実装方法とアプリケーション プロトコルは異なります。
  • Redis は VM メカニズム自体を直接構築します。これは、一般的なシステムがシステム関数を呼び出すため、移動と要求に一定の時間が浪費されるためです。

(4)ストレージ値のサイズ

  • Redis は 1GB を保存できますが、memcache は 1MB しか保存できません。

これを読んで、Redis はとても優れていて、利点がたくさんあると思いますか? 実際、Redis にはまだ多くの欠点があります。日常生活でこれらの欠点を克服するにはどうすればよいでしょうか?

Redisの問題と解決策

1. キャッシュデータベースの二重書き込み一貫性の問題

問題: 分散システムでは一貫性の問題が非常によく発生します。一般的に、一貫性には、強い一貫性と結果的一貫性の 2 種類があります。強い一貫性を満たす必要がある場合、Redis は完璧ではありません。データベースとキャッシュが二重に書き込まれるため、不整合が確実に発生し、Redis は結果的一貫性しか保証できません。

解決策: 最終的な一貫性をどのように確保するか?

  • キャッシュに一定の有効期限を設定できます。キャッシュの有効期限が切れると、データベースとキャッシュの一貫性を確保するために、自動的にデータベースにクエリが実行されます。
  • 有効期限を設定しない場合は、まずデータベースを更新してからキャッシュを削除するという正しい更新戦略を選択する必要があります。ただし、キャッシュを削除すると何らかの問題が発生する可能性があるため、削除するキャッシュのキーをメッセージ キューに入れて、削除が成功するまで再試行を続ける必要があります。

2. キャッシュアバランシェ問題

質問: 私たちは皆、映画で雪崩を見たことがあります。雪崩は最初は穏やかに始まりますが、突然崩壊し、大きな破壊力を引き起こします。ここでも同じです。コードを実行すると、多くのキャッシュの有効期間が同じになるように設定します。すると、これらのキャッシュは同時に有効になり、データベースに再アクセスしてデータを更新します。これにより、接続が多すぎて負荷がかかりすぎるため、データベースがクラッシュすることになります。

解決する:

  • キャッシュの有効期限を設定するときにランダムな値を追加します。
  • 二重キャッシュを設定し、キャッシュ 1 にキャッシュ時間を設定し、キャッシュ 2 には設定しません。キャッシュ 1 の有効期限が切れると、キャッシュ 2 に直接戻り、キャッシュ 1 と 2 を更新するプロセスを開始します。

3. キャッシュ侵入問題

問題: キャッシュ侵入とは、一部の異常なユーザー (ハッカー) がキャッシュに存在しないデータを故意に要求し、すべての要求がデータベースに集中して、データベース接続に異常が発生することを指します。

解決する:

  • ミューテックスロックを活用します。キャッシュが無効な場合、データベースに直接アクセスすることはできません。代わりに、データベースを要求する前にまずロックを取得する必要があります。ロックが取得できない場合は、しばらくスリープしてから再試行します。
  • 非同期更新戦略を採用します。キーに値があるかどうかに関係なく、値が直接返されます。キャッシュの有効期限は値に保持されます。キャッシュの有効期限が切れると、スレッドが非同期的に開始され、データベースを読み取ってキャッシュを更新します。キャッシュの事前加熱(プロジェクトを開始する前にキャッシュをロードすること)が必要です。
  • リクエストが有効かどうかを迅速に判断できるインターセプト メカニズムを提供します。たとえば、ブルーム フィルターを使用すると、一連の有効なキーが内部的に維持され、リクエストに含まれるキーが有効かどうかをすばやく判断できます。違法な場合は、直接返品してください。

4. キャッシュの同時実行競合問題

質問:

キャッシュ同時実行競合の問題は、主に複数のスレッドがキーを設定する場合に発生し、データの不整合を引き起こす可能性があります。

たとえば、Redis に amount キーを持つ値を保存し、その値が 100 であるとします。2 つのスレッドが両方とも値に 100 を追加してから更新する場合、正しい結果は 300 になります。ただし、2 つのスレッドがこの値を取得すると、両方とも 100 になり、結果は 200 になり、同時キャッシュ競合の問題が発生します。

解決する

  • マルチスレッド操作に順序要件がない場合、分散ロックを設定すると、複数のスレッドがロックを競い合うようになります。最初にロックを獲得したスレッドが最初に実行できます。この分散ロックは、Zookeeper または Redis 自体を使用して実装できます。
  • Redis の incr コマンドを使用できます。
  • マルチスレッド操作に順序が必要な場合は、メッセージ キューを設定し、必要な操作をメッセージ キューに追加して、キューの順序に従ってコマンドを厳密に実行できます。

Redis 有効期限戦略

Redis のデータ量が増えると、メモリ使用率は増加し続けます。設定された削除時間に達すると一部のキーが削除されると思っていましたが、時間になるとメモリ使用率がまだ非常に高いです。これはなぜでしょうか?

Redis は、定期削除と遅延削除のメモリ削除メカニズムを使用します。

1. 定期的な削除

定期削除とスケジュール削除には違いがあります。

  • スケジュールされた削除とは、設定された時間に従ってキャッシュを厳密に削除する必要があることを意味します。これには、すべてのキーを継続的にポーリングして削除が必要かどうかを判断するタイマーを設定する必要があります。ただし、この場合、CPU リソースが大量に占有され、リソースの使用率が低くなります。したがって、通常の削除を使用することを選択します。
  • 定期的な削除の時間は、弊社によって決定されます。100 ミリ秒ごとにチェックできますが、それでもすべてのキャッシュをチェックすることはできません。Redis は依然として停止し、キャッシュの一部をランダムにチェックすることしかできませんが、一部のキャッシュは指定された時間内に削除できません。ここで遅延削除が役に立ちます。

2. 怠惰な削除

簡単な例を挙げましょう。私が中学生の時、宿題が多すぎて、全然終わらせることができませんでした。先生は、次の授業でこのテスト用紙について話すと言って、「みんな終わらせましたか?」と尋ねました。実際、終わらせていない人がたくさんいるので、次の授業までに埋め合わせる必要があります。

同じ原則が遅延削除にも適用されます。値は消えているはずですが、まだそこにあります。このキーを取得したいときに、期限切れになっているはずであることがわかったので、すぐに削除し、「そのような値はありません。期限切れです!」を返します。

定期的削除 + 遅延削除の有効期限戦略ができたので、安心してリラックスできるでしょうか? 実際にはそうではありません。キーがアクセスされなければ、キーはそこに残りますが、これは不合理です。これにはメモリ削除メカニズムが必要です。

次の図に示すように、Redis には一般に 6 種類のメモリ削除メカニズムがあります。

では、Redis のメモリ削除メカニズムをどのように設定すればよいのでしょうか?

Redis.confで設定できる

  1. # 最大メモリポリシー allkeys-lru

まとめ

この記事では、Redis を概観し、Redis のナレッジ グラフを大まかに整理します。比較すると、Redis には学習する必要があるナレッジ ポイントが非常に多いことがわかります。次に、Redis の長所と短所を分析し、効率的なメモリベースの読み取りと書き込みの速度と豊富なデータ タイプについて学習します。また、Redis がデータの一貫性、キャッシュの侵入、キャッシュの雪崩などの問題を処理する方法も分析します。Redis の有効期限戦略とキャッシュの削除メカニズムを理解します。

皆さんは Redis についてある程度理解していると思います。次の記事では、Redis のデータ構造、各データ型の実装方法、対応するコマンドについて分析します。

[この記事は51CTOコラムYixin Technology Institute、WeChatパブリックアカウント「Yixin Technology Institute(id:CE_TECH)」からのオリジナル記事です]

この著者の他の記事を読むにはここをクリックしてください

<<:  人工知能を正しく実装するにはどうすればいいでしょうか?

>>:  企業における人工知能: 8 つの誤解を解明

推薦する

機械にプライバシーを学習させることはできるでしょうか?

機械学習では、モデルをトレーニングするために大量のデータが必要であり、通常、このトレーニング データ...

電流制限アルゴリズムを理解すれば十分です。

TL;DR (長すぎるので読まないでください)現在の制限アルゴリズム: カウンター、スライディング...

さまざまな機械学習アルゴリズムの選択の考え方を説明する記事

序文これは Zhihu に関する質問です: k 近傍法、ベイズ法、決定木、SVM、ロジスティック回帰...

...

人工知能の出現は教育にどのような影響を与えるのでしょうか?

近年、科学技術における人工知能の急速な発展により、人工知能は私たちの日常生活にいくつかの新たなハイラ...

...

メタは触覚手袋を開発し、メタバースで猫を撫でたい人もいれば、大胆なアイデアを持つ人もいる

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

汎用人工知能までどれくらい遠いのでしょうか?

汎用人工知能はどのくらい遠いのでしょうか? どのくらいの速さで進歩しているのでしょうか? 現在、人間...

...

AppleがAI研究成果を公開、マルチモーダルLLMモデルFerretをリリース

IT Homeは12月25日、Appleがコロンビア大学の研究者らと協力して2023年10月にオープ...

GPTストアはまだオープンしていないが、模倣者がすでにこの脂身の多い肉に狙いを定めている。

著者: トーマス・クラバーン編纂者:ヤン・ジェン制作:51CTO テクノロジースタック(WeChat...

72歳の男性がコーラを飲みながら脳で麻雀をする:これはすべて脳コンピューターインターフェース技術のおかげです

浙江省メディアの報道によると、現在浙江大学医学部第二付属病院で治療を受けている72歳の張さんは、意識...

Ant Marketingの推奨シナリオにおける因果修正法

1. 因果修正の背景1. 逸脱の発生推奨システムは、収集されたデータに基づいて推奨モデルをトレーニン...

ディープラーニングにおける正規化技術の包括的な概要

ディープニューラルネットワークのトレーニングは困難な作業です。 長年にわたり、研究者たちは学習プロセ...

大規模モデルで長いテキストを評価する方法: 4 つの主要な評価データセットのタスク設計とデータセット構築ソリューション

大規模言語モデル (LLM) は、さまざまな言語タスクで優れたパフォーマンスを発揮するにもかかわらず...