Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Redis をマスターする:CLI の基本、主要なコマンド、実践的なプロジェクト

Redis をマスターする:CLI の基本、主要なコマンド、実践的なプロジェクト

メフル・モハン

Redis は、キャッシュやレート制限などのさまざまなプロジェクトに使用される人気のあるメモリ内データベースです。

このブログ投稿では、Redis をインメモリ データベースとして使用する方法と、Redis を使用する理由を説明し、最後にデータベースのいくつかの重要な機能について説明します。始めましょう。

インメモリ データベースとは何ですか?

従来のデータベースは、アクセスを高速化するためにデータベースの一部 (通常は「ホット」インデックス、または頻繁にアクセスされるインデックス) をメモリ内に保持し、データベースの残りの部分をディスク上に保持します。

一方、Redis は、レイテンシーと、データの高速な取得と保存に重点を置いています。したがって、ストレージデバイス(SSD/HDD)ではなくメモリ(RAM)上で完全に動作します。スピードは重要です!

Redis はキーと値のデータベースです。しかし、これが単純なデータベースであると騙されないでください。これらのキーと値を保存したり取得したりする方法はたくさんあります。

Redis が必要な理由

Redis はさまざまな方法で使用できます。しかし、考えられる主な理由は 2 つあります。

<オル>
  • あなたは、コード層をステートレスにするアプリケーションを作成しています。なぜ? - コードがステートレスであれば、水平方向にスケーラブルであるためです。したがって、Redis を中央ストレージ システムとして使用し、コードでロジックのみを処理させることができます。
  • あなたは、複数のアプリがデータを共有する必要があるアプリケーションを作成しています。たとえば、誰かが payments.codedamn.com であなたのサイトにブルートフォース攻撃を試みた場合はどうなるでしょうか。 また、それを検出したら、login.codedamn.com でブロックすることもできます。 ? Redis を使用すると、複数の切断された/緩く接続されたサービスが共通のメモリ空間を共有できます。
  • Redis は、知っておく必要があるコマンドが少数しかないため、比較的簡単に学ぶことができます。次のいくつかのセクションでは、Redis の主要な概念といくつかの便利な一般的なコマンドについて説明します。

    Redis CLI

    Redis をマスターする:CLI の基本、主要なコマンド、実践的なプロジェクト

    Redis には、コマンド ラインの REPL バージョンである CLI があります。何を書いても評価されます。

    上の画像は、単純な PING を実行する方法を示しています。 または、私のコードダムな Redis コースの演習の 1 つで、Hello world in Redis を実行することもできます (コースは最後にリンクされていますので、チェックしてみてください)。

    この Redis REPL は、アプリケーションでデータベースを操作していて、いくつかのキーや Redis の状態をすぐに確認する必要がある場合に非常に役立ちます。

    一般的な Redis コマンド

    Redis をマスターする:CLI の基本、主要なコマンド、実践的なプロジェクト コードダム コースで Redis CLI の一般的なコマンドを試す

    ここでは、Redis の仕組みを詳しく学ぶために、Redis でよく使用されるコマンドをいくつか紹介します。

    セット

    SET を使用すると、キーを Redis の値に設定できます。

    これがどのように機能するかの例を次に示します。

    SET mehul "developer from india"
    

    これにより、キー mehul が設定されます。 値 developer from india に .

    入手

    GET を使用すると、設定したキーを取得できます。

    構文は次のとおりです。

    GET mehul
    

    これにより、上で設定したように「インドの開発者」という文字列が返されます。

    SETNX

    このキーは、キーが存在しない場合にのみ値を設定します。このコマンドには、すでに存在する可能性のあるキーの値を誤って上書きしないなど、多くの使用例があります。

    仕組みは次のとおりです。

    SET key1 value1
    SETNX key1 value2
    SETNX key2 value2
    

    この例を実行すると、key1 値は value1 になります。 と key2 value2 として 。これは、2 番目のコマンドは key1 として効果がないためです。 はすでに存在していました。

    MSET

    MSET は SET に似ていますが、1 つのコマンドで複数のキーをまとめて設定できます。仕組みは次のとおりです。

    MSET key1 "value1" key2 "value2" key3 "value3"
    

    現在、key を使用しています。 と value キーと値の接頭辞として使用します。しかし、実際には、このようなコードを作成すると、そのような長いコマンドの中で何がキーで何が値であるかを簡単に見失ってしまいます。

    したがって、できることの 1 つは、常に二重引用符を使用して値を引用し、キーを引用符なしで残すことです (引用符なしで有効なキー名の場合)。

    MGET

    MGET は GET に似ていますが、次のように複数の値を一度に返すことができます。

    MGET key1 key2 key3 key4
    

    これにより、4 つの値が配列として返されます:value1value2value3nullkey4 を取得しました 設定したことがないため、null となります。

    デル

    このコマンドはキーを削除します。とても簡単ですよね?

    以下に例を示します。

    SET key value
    GET key # gives you "value"
    DEL key 
    GET key # null
    

    INCR と DECR

    これら 2 つのコマンドを使用して、数値であるキーをインクリメントまたはデクリメントできます。これらは非常に便利で、頻繁に使用することになります。Redis は GET キーと SET キーからキー + 1 までの 2 つの操作を 1 つで実行できるためです。

    これにより、親アプリケーションへのラウンドトリップが回避され、トランザクションを使用せずに操作を安全に実行できるようになります (これについては後ほど説明します)

    仕組みは次のとおりです。

    SET favNum 10
    INCR favNum # 11
    INCR favNum # 12
    DECR favNum # 11
    

    期限切れ

    EXPIRE コマンドは、キーに有効期限タイマーを設定するために使用されます。技術的には、これはタイマーではなく、キーが再度設定されない限り、キーが常に null を返す強制終了タイムスタンプです。

    SET bitcoin 100
    EXPIRE bitcoin 10
    GET bitcoin # 100
    # after 10 seconds
    GET bitcoin # null
    

    EXPIRE そのキー全体を保存するために、もう少し多くのメモリを使用します (キーの有効期限が切れる時期も保存する必要があるため)。しかし、おそらくそのオーバーヘッドを気にすることはないでしょう。

    TTL

    このコマンドを使用すると、キーの存続期間を知ることができます。

    例:

    SET bitcoin 100
    TTL bitcoin # -1
    TTL somethingelse # -2
    EXPIRE bitcoin 5
    # wait 2 seconds
    TTL bitcoin # returns 3
    # after 1 second
    GET bitcoin # null
    TTL bitcoin # -2
    

    では、このコードから何が学べるでしょうか?

    <オル>
  • TTL は -1 を返します キーは存在するが有効期限がない場合
  • TTL は -2 を返します キーが存在しない場合
  • キーが存在し、有効期限が切れる場合、TTL は有効期間を秒単位で返します
  • セテックス

    セットを実行できます そして期限切れ SETEX と一緒に .

    このように:

    SETEX key 10 value
    

    ここで、キーは「key」、値は「value」、有効期間 (TTL) は 10 です。このキーは 10 秒後に設定が解除されます。

    基本的な Redis コマンドと CLI がどのように機能するかについての基本的な知識が得られたので、いくつかのプロジェクトを構築して実際にそれらのツールを使用してみましょう。

    プロジェクト 1 – Redis を使用して API キャッシュ システムを構築する

    Redis をマスターする:CLI の基本、主要なコマンド、実践的なプロジェクト codedamn での API キャッシュ システム構築ラボのプレビュー

    このプロジェクトには、Redis を使用した API キャッシュ システムのセットアップが含まれており、サードパーティ サーバーからの結果をキャッシュして、それをしばらく使用します。

    これは、サードパーティによるレート制限を受けないようにするのに役立ちます。また、キャッシュによってサイトの速度が向上するため、正しく実装すれば誰にとってもメリットが得られます。

    Node.js を使用して、ブラウザ内の codedamn でこのプロジェクトを対話的に構築できます。ご興味がございましたら、API キャッシュ ラボを無料でお試しいただけます。

    (自分で構築するのではなく) ソリューションのみに興味がある場合は、コア ロジックが Node.js でどのように動作するかを次に示します。

    app.post('/data', async (req, res) => {
     const repo = req.body.repo
     const value = await redis.get(repo)
     if (value) {
     // means we got a cache hit
     res.json({
     status: 'ok',
     stars: value
     })
     return
     }
     const response = await fetch(`https://api.github.com/repos/${repo}`).then((t) => t.json())
     if (response.stargazers_count != undefined) {
     await redis.setex(repo, 60, response.stargazers_count)
     }
     res.json({
     status: 'ok',
     stars: response.stargazers_count
     })
    })
    

    ここで何が起こっているのか見てみましょう:

    • repo を取得しようとします (渡されたリポジトリ形式 - facebook/react ) Redis キャッシュから。もし存在すれば、素晴らしいです! Redis キャッシュからスター数を返すことで、GitHub サーバーへの往復時間を節約します。
    • キャッシュ内に見つからない場合は、GitHub のサーバーにリクエストを実行し、スターの数を取得します。スターの数が未定義かどうかを確認します (リポジトリが存在しない/非公開の場合)。値がある場合は、setex とします。 タイムアウトが 60 秒の値。
    • タイムアウトを設定しているのは、時間の経過とともに古い値が提供されたくないためです。これにより、星の数を少なくとも 1 分に 1 回更新することができます。

    完全なソース コードは次のとおりです。

    プロジェクト 2 - Redis を使用したレート制限 API

    Redis をマスターする:CLI の基本、主要なコマンド、実践的なプロジェクト Redis を使用したレート制限 API のプレビュー

    このプロジェクトには、特定のエンドポイントをレート制限して悪意のある者から保護し、その特定の API へのアクセスをブロックすることが含まれます。

    これは、ログインや機密性の高い API エンドポイントで、1 人のユーザーに何千ものリクエストがエンドポイントに送信されることを望まない場合に非常に役立ちます。

    このラボでは、IP アドレスによるレート制限を実行します。このコードラボを試してみたい場合は、codedamn で無料で試すことができます。

    (自分で構築するのではなく) ソリューションのみに興味がある場合は、コア ロジックが Node.js でどのように動作するかを次に示します。

    app.post('/api/route', async (req, res) => {
     // add data here
     const ip = req.headers['x-forwarded-for'] || req.ip
     const reqs = await redis.incr(ip)
     await redis.expire(ip, 2)
     if (reqs > 15) {
     return res.json({
     status: 'rate-limited'
     })
     } else if (reqs > 10) {
     return res.json({
     status: 'about-to-rate-limit'
     })
     } else {
     res.json({
     status: 'ok'
     })
     }
    })
    

    このコード ブロックを理解しましょう:

    • x-forwarded-for から IP を抽出しようとします。 ヘッダー (または req.ip を使用できます) Express を使用しているため)
    • 私たちは INCR IP アドレスフィールド。 Redis のキーが存在しなかった場合、INCR は自動的にキーを 0 に設定して増分し、最終的に 1 に設定します。
    • キーが 2 秒で期限切れになるように設定しました。理想的には、より大きな値が必要ですが、これは上記のコードダムチャレンジで指定されているものなので、ここにあります。
    • 最後にリクエスト数を確認し、リクエスト数が特定のしきい値を超えている場合は、リクエストがメイン関数本体に到達するのをブロックします。

    完全な解決策は次のとおりです。

    Redis の詳細

    Redis は、これまでに学んだことをはるかに超えています。しかし、幸いなことに、私たちはすでにそれを使い始めるのに十分な学習を行っているということです。

    このセクションでは、Redis の基本についてさらにいくつか取り上げてみましょう。

    Redis はシングルスレッドです

    Redis は、マルチスレッドをサポートするマルチコア システム上でも、シングル スレッド プロセスとして実行されます。これはパフォーマンス上の悪夢ではなく、マルチスレッド環境における一貫性のない読み取り/書き込みに対する安全対策です。

    Redis がマルチスレッドの場合、単一のキーにアクセスするときにスレッドの安全性を確保するために、最終的には何らかのロック メカニズムを解決することになりますが、いずれにせよシングル スレッド/シーケンシャル アクセスよりもパフォーマンスが低下する可能性があります。

    Redis トランザクション

    もちろん、Redis のすべてを 1 つのコマンドで実行することはできません。ただし、コマンドのブロックを一度に実行するように要求することは確実にできます (つまり、そのブロックの実行中は他の誰も Redis と通信しません)。 MULTI を使用してこれを行うことができます。 コマンド。

    その仕組みは次のとおりです。

    MULTI
    SET hello world
    SET yo lo
    SET number 1
    INCR number
    EXPIRE hello 10
    EXPIRE yo 5
    EXEC
    

    これにより、これらすべての操作が一度に実行されます。 つまり実行されませんMULTI 以降は何も実行しません EXEC を見つけた瞬間にすべてを一度に実行します。 キーワード。

    Redis には、より高度なユースケースのためのリストとセットのサポートが含まれています。 Redis を公開するブロードキャスト サービスとして使用することもできます。 チャンネルや登録している他のユーザーに送信します。 チャンネルに通知を受け取ります。これは、マルチクライアント アーキテクチャで非常に役立ちます。

    結論

    この Redis の紹介が気に入っていただければ幸いです。このブログ投稿は、codedamn の新しい対話型コース「Redis + Node.js キャッシュ」の一部であり、これらの概念について学ぶだけでなく、外出先のブラウザー内で実践することができます。

    ぜひコースを試してみて、感想をお聞かせください。ツイッターで私を見つけてフィードバックを送信してください :)

    無料でコーディングを学びましょう。 freeCodeCamp のオープンソース カリキュラムは、40,000 人以上の人々が開発者としての職に就くのに役立ちました。始めましょう


    1. Redis 分散ロックをマスターする:実証済みのパターン、一般的な落とし穴、および実用的なアプリケーション

      はじめに 分散ロックは、運用環境で実際に依存するまでは単純に思えます。 1 つのプロセスにはリソースへの排他的アクセスが必要です。複数のサーバーが稼働しています。 Redisは真ん中に座っています。アイデアは単純明快です。Redis にロックを設定して次に進みます。 しばらくの間は、このアプローチがうまくいくようです。その後、プロセスがクラッシュしたり、ネットワーク遅延が発生したり、遅延が急増したりします。突然、2 つのプロセスが同じロックを要求したり、そのロックを所有するプロセスが存在しなかったり、ロックが解放されなかったりします。 Redis のロックの問題のほとんどは、Redis

    2. Redis を使用して超高速パフォーマンスを実現する ASP.NET Core のマスター分散キャッシュ

      はじめに ASP.NET Core アプリケーションを構築する場合、最大の課題の 1 つはパフォーマンスです。アプリケーションが成長し、より多くのユーザーがそれを使用し始めると、データベースは同じデータに対して何度もヒットします。これにより、アプリケーションの速度が低下し、サーバーの負荷が増加します。 ここで、Redis による分散キャッシュが役立ちます。 毎回データベースを呼び出すのではなく、頻繁に使用するデータを Redis のような高速なインメモリ システムに保存します。次回誰かが同じデータをリクエストすると、そのデータはデータベースではなくキャッシュから即座に返されます。 この