記事ディレクトリ
-
- 1.Redis のデータ型は何ですか?
- 2. Redis を使用してランキング リストを設計します。どのように設計し、どのようなデータ構造を使用しますか?
- 3. ホットデータを特定するにはどうすればよいですか?
- 4.Redis の永続化戦略は何ですか?
- 5. Redis を使用して分散ロックを実装するにはどうすればよいですか?
- 6.Redis のデータ削除戦略は何ですか?
- 7. Redis はなぜそれほど速いのですか?
- 8.Redis シングルスレッドの利点は何ですか?
- 9.Redis はトランザクションをサポートしていますか?
- 10.redisとmemcacheの違い
- 11.Redis はデータの一貫性をどのように確保しますか?
1.Redis のデータ型は何ですか?
- string (string): 基本型、Memcached と同じ型、1 つのキーが 1 つの値に対応し、バイナリ セーフで、jpg 画像やシリアル化されたオブジェクトなどのあらゆるデータを含めることができます。文字列型の値は最大512MBまで保存できます。
- ハッシュ: ハッシュはキーと値 (key=>value) ペアのコレクションであり、オブジェクトの保存に特に適しています。
- list: リストは、挿入順に並べ替えられた文字列の単純なリストです。
- set: Set は文字列型の順序付けされていないコレクションです。
- zset (ソートされたセット:順序付きセット): Set に似ていますが、各要素はスコアに関連付けられており、このスコアに従ってソートされます。
2. Redis を使用してランキング リストを設計します。どのように設計し、どのようなデータ構造を使用しますか?
ランキング リストを設計するには、通常、ソート セット データ構造を使用する必要があり、Redis のソート セットはこのシナリオの処理に最適です。リーダーボードを設計する一般的な手順は次のとおりです。
-
順序付きセットの作成: Redis では、ZADD コマンドを使用して順序付きセットを作成できます。各メンバーには、メンバーのランキングを示すスコアがあります。最初、リーダーボードは空です。
-
メンバーの追加: ZADD コマンドを使用して、ユーザーとそのスコアを順序付きセットに追加します。スコアは、スコア、ポイント、スコアなど、ユーザーの特定の指標に基づいて設定できます。
-
ランキングのクエリ: ZREVRANK コマンドまたは ZRANK コマンドを使用して、リーダーボード内の指定されたメンバーのランキングをクエリします。ランキングは通常 0 から始まり、1 位を示します。
-
スコアのクエリ: ZSCORE コマンドを使用して、指定したメンバーのスコアをクエリします。このスコアは、メンバーのランキング基準を示すために使用できます。
-
リーダーボードを取得する: ZRANGE または ZREVRANGE コマンドを使用して、リーダーボードの上位 N または下位 N のメンバーを取得します。これは、リーダーボードの内容を表示するために使用できます。
-
メンバーのスコアを更新する: ZINCRBY コマンドを使用して、指定したメンバーのスコアを増減し、リーダーボードでのメンバーのランキングを更新します。
-
メンバーの削除: ZREM コマンドを使用して、指定したメンバーをリーダーボードから削除します。
-
有効期限の設定: EXPIRE コマンドを使用してランキングの有効期限を設定し、一定期間後にランキング データが自動的にクリアされるようにすることができます。
# 创建排行榜
ZADD leaderboard 1000 "UserA"
ZADD leaderboard 950 "UserB"
ZADD leaderboard 1100 "UserC"
# 查询排名
ZRANK leaderboard "UserA" # 返回0,表示UserA排在第一名
# 查询分数
ZSCORE leaderboard "UserB" # 返回950
# 获取前N名
ZREVRANGE leaderboard 0 2 WITHSCORES # 返回前3名成员及其分数
# 更新成员分数
ZINCRBY leaderboard 50 "UserA" # 将UserA的分数增加50
# 移除成员
ZREM leaderboard "UserB" # 从排行榜中移除UserB
3. ホットデータを特定するにはどうすればよいですか?
削除戦略を使用する: Redis は、LRU (最も最近使用されていない) や LFU (最も頻繁に使用されていない) など、いくつかの異なる削除戦略をサポートしています。これらのポリシーでは、最も使用頻度の低いデータを自動的に削除して、最もホットなデータが常にメモリ内に保持されるようにします。
有効期限の設定: Redis に保存されている値ごとに、有効期限を設定できます。有効期限に達すると、Redis は値を自動的に削除します。このメカニズムにより、Redis 内のデータが常に最新かつ最もホットなものになります。
クエリの最適化: 頻繁に実行されるクエリについては、Redis のクエリ キャッシュ機能を使用することで効率を向上できます。この機能はクエリ結果をキャッシュすることができるため、同じクエリを再度実行する場合、クエリを再実行せずにキャッシュから直接結果を取得できます。
4.Redis の永続化戦略は何ですか?
- RDB: RDB は、メモリ内のすべてのデータのスナップショットを特定の時点でハードディスクに保存します。データの回復中に、バックアップ時点より前のすべてのデータはリストアできますが、バックアップ時点以降のデータはリストアできません。
- 優れたパフォーマンスと高速な起動。
- これにより、一部のデータが失われます。
- AOF: AOF 永続化メソッドは、サーバーが受信したすべての書き込み操作を記録します。サービスが開始されると、記録されたこれらの操作が 1 つずつ実行され、元のデータが再構築されます。書き込み操作コマンドレコードの形式とredisプロトコル
- 基本的にデータ損失は発生しません。
- 速度が遅くなります。
一般的に本番環境では、Redis再起動後、2つの永続化方式の長所と短所を補い合うため、両者を併用しますが、緊急時にはまずRDBで大量のデータを読み込んでから、その後にRDBを使用します。 AOF はデータを完成させるために使用されます。
5. Redis を使用して分散ロックを実装するにはどうすればよいですか?
setnx を使用します。
setnx("key","value") の関数は、key の値が redis に存在しない場合にのみ、key ステートメントが存在する場合、setnx("key","value") の操作は true を返します。その場合、常に false が返されます。setnx の特性により、setnx を使用して分散ロックを実装できますが、複数のスレッドが入ってくると、そのうちの 1 つのスレッドが上記の 5 行目のコード (ロック操作) を実行すると、他のスレッドは最初のスレッドで実行されなくなります。完了後、それらはすべて回転状態になります (ロックを取得できません)。最初のスレッドが実行を完了してロックを解放した後 (コード 17) のみ、他のスレッドがロックを取得できます。setIfAbsend は、クライアントによる setnx の使用法です。
6.Redis のデータ削除戦略は何ですか?
(1) volatile-lru:LRU
最終使用時刻が最も早く、使用回数が最も少ないキーを削除するアルゴリズムを使用しkey
、有効期間が設定されたキーのみを削除します。
(2) allkeys-lru: すべてのキーのハッシュ テーブル (server.db[i].dict) から複数のキーをランダムに選択し、LRU アルゴリズムを使用して、選択したキーのうち最も最近使用されていないデータを削除します。
(3) volatile-random: データをランダムに削除し、有効期限が設定されたキーのみを削除します
(4) allkeys-random: すべてのキーのハッシュ テーブルから複数のキーをランダムに選択して削除します。
(5) volatile-ttl: ハッシュテーブル(server.db[i].expires)から有効期限が設定されたキーをランダムに複数選択し、選択したキーの中で有効期限が最も短いデータを選択して削除します。
(6) no-enviction(エビクション):データのエビクションを禁止します。
7. Redis はなぜそれほど速いのですか?
(1) Redis はメモリに基づいており、メモリの読み取りおよび書き込み速度が非常に高速です
(2) Redis はシングルスレッドであるため、コンテキスト切り替えスレッドの時間を大幅に節約できます
(3) Redis は多重化テクノロジを使用しており、同時接続を処理できます. 、ノンブロッキング IO は内部的に epoll を実装し、単一のスレッドを使用して記述子をポーリングし、データベースのオープン、クローズ、読み取り、書き込みをイベントに変換して、スレッド切り替え時のコンテキストの切り替えと競合を削減します。
8.Redis シングルスレッドの利点は何ですか?
- 利点:
(1) コードが明確になり、処理ロジックが単純になります
(2) さまざまなロックの問題を考慮する必要がなく、ロック操作やロック解除操作がなく、デッドロックの可能性によるパフォーマンスの消費がありません (3
)プロセスやマルチスレッドによる CPU の消費による複数のスイッチングが発生しない - デメリット:
(1) マルチコア CPU のパフォーマンスは使用できませんが、1 台のマシン上で複数の Redis インスタンスを開くことで改善できます。
9.Redis はトランザクションをサポートしていますか?
サポート
(1) DISCARD はトランザクションをキャンセルし、トランザクション ブロック内のすべてのコマンドの実行を放棄します
(2) EXEC はすべてのトランザクション ブロック内のコマンドを実行します
(3) MULTI はトランザクション ブロックの開始をマークします
(4) UNWATCH はすべてのトランザクション ブロックの監視をキャンセルしますWATCH コマンドによるキー
( 5) WATCH キー [key...] は 1 つ (または複数) のキーを監視します。トランザクションの実行前にこの (またはこれらの) キーが他のコマンドによって変更された場合、トランザクションは中断されます
。
10.redisとmemcacheの違い
(1) Memcache はすべてのデータをメモリ上に置くため、サービスがダウンしたり停止したりするとデータは失われ、memcache に格納されるデータはメモリ サイズを超えることはできません。redis はデータの永続性をサポートします。
(2) Memcache は単純な文字列をサポートしますが、redis はより豊富なデータ型を備えており、String、Hash、set、zeset、list の 5 つのデータ型を提供します (3) 基礎となるモデルを使用するため、それらの間の基礎となる実装メソッドは異なります
。クライアントと通信するためのアプリケーション プロトコルは異なります。一般的なシステムがシステム関数を呼び出すと、移動やリクエストに一定の時間が無駄になるため、Redis は独自の VM メカニズムを直接構築しました。
(4) 値のサイズが異なります。redis の最大テストは 512m ですが、memcache はわずか 1mb です。 (5
) redis の速度は memcache よりもはるかに高速です。
(6) Redis はマスターでのデータのバックアップをサポートしています。スレーブモード。
11.Redis はデータの一貫性をどのように確保しますか?
1.使用MySQL的binlog向Redis推送增量数据
非同期更新キャッシュ (binlog へのサブスクライブに基づく同期メカニズム) の手順は次のとおりです。
(1) MySQL がデータを変更すると、更新された増分データが binlog に存在します。
(2) これらの増分データを Redis にプッシュします。
(3) Redis は binlong レコードに従ってキャッシュを更新します。
ここでのメッセージのプッシュは、MQ を使用して実装できます。
2. 遅延二重削除の
手順は次のとおりです:
(1) まずキャッシュを削除します
(2) 次にデータベースに書き込みます
(3) 一定期間スリープします
(4) キャッシュを再度削除します
。ミリ秒が決定され、どのくらいの時間スリープする必要がありますか? プロジェクトの時間のかかるデータ読み取りビジネス ロジックを評価する必要があります。この目的は、読み取りリクエストが確実に終了し、書き込みリクエストによって読み取りリクエストによって発生したキャッシュされたダーティ データを削除できるようにすることです。もちろん、この戦略では、Redis とデータベースのマスター/スレーブ間の時間のかかる同期も考慮されています。データ書き込みの最終スリープ時間: データ ビジネス ロジックの読み取りにかかる時間に数百ミリ秒が追加されます。例: 1 秒間スリープします。
この欠点は、最悪の場合、スリープ時間中にユーザーが読み取ったデータが DB と一致しないため、リクエストの時間が長くなるということです。