記事ディレクトリ
Linux 運用保守エンジニアの面接での質問 (4)
希望の仕事が見つかるよう、皆さんの幸運を祈っています。
継続的な学習がなくなることはありません。
地球は爆発しないし、私たちは休暇も取らない。
チャンスは常に準備ができている人に与えられます。
さあ、労働者を殴ってください!
1 Redis で一般的に使用されるデータ型
- String: String、最も基本的なデータ型
- リスト: リスト
- ハッシュ: ハッシュオブジェクト
- セット:セット
- ソートされたセット: 順序付けされたコレクション。セットにスコアが追加されます。
2 Redis データ永続化にはいくつかの種類があります。その違いと選択方法は何ですか?
rdb と aof の両方
Aof は mysql のバイナリ ログに似ており、すべての操作をログに記録します。そして、rdbは実際に保存されたデータであり、メモリ内のredisのすべてのデータをディスクにスナップショットすることと同等です。
主にキャッシュ機能として使用される場合、または数分間のデータ損失に耐えられる場合、データを永続的に保存する必要があり、データを永続的に保存できない場合、本番環境では通常、デフォルト値でもある RDB を有効にするだけで済みます。まったく失われる可能性がある場合は、RDB と AOF を同時に有効にすることを選択できますが、AOF のみを有効にすることは通常お勧めできません。
3 Redis のアーキテクチャ モードとは何ですか
- マスター/スレーブ レプリケーション
- センチネル
- Redis クラスター
4 キャッシュアバランシェとは何ですか? の解き方?
定義: キャッシュされたデータ設定の有効期限が同じ場合、一定期間内に同時にキャッシュが無効になり、すべてのリクエストがデータベースに送信されるため、データベースがダウンします。
解決:
キャッシュするときに有効期限にランダムな値を追加します。これにより、同時にキャッシュの有効期限が大幅に短縮されます。
5 キャッシュペネトレーションとは何ですか? の解き方?
定義: キャッシュの侵入とは、存在してはいけないデータをクエリすることを指します。キャッシュ ミスやフォールト トレランスの考慮により、データがデータベースから見つからない場合、そのデータはキャッシュに書き込まれません。これにより、存在しないデータが要求されるたびにデータベース内でクエリが実行されます。これではキャッシュの意味が失われ、キャッシュ内で大量のデータが失われ、リクエストがデータベースに送られることになります。
解決:
要求されたパラメータが不正(存在しないパラメータが毎回要求される)なので、ブルームフィルタ(BloomFilter)や圧縮フィルタを使って事前に傍受することができ、不正な場合はリクエストはデータベースに送信されません層!
データベースから見つからない場合は、この空のオブジェクトもキャッシュに設定します。次回リクエストするときに、キャッシュから取得できます。
この場合、通常、空のオブジェクトには有効期限が短く設定されます。
6 キャッシュブレークダウンとは何ですか? の解き方?
定義: 特定のホットスポット キーは常に高い同時実行性を維持しており、ホットスポット キーが無効になると、継続的な高い同時アクセスによりキャッシュが破壊され、データベースに直接アクセスされ、データベースがダウンします。
解決:
ホットスポット データを「無期限」に設定し、さらにミューテックスを設定します。上記の現象は、複数のスレッドがデータベースのデータを同時にクエリし、最初のクエリ データ要求でミューテックスを使用してそれをロックすることができ、ロックを取得できない場合は他のスレッドがこのステップに進むというものです。 、最初のスレッドがデータをクエリするのを待ってから、データを Redis キャッシュに置きます。後続のスレッドが入ってきて、すでにキャッシュがあることがわかるため、キャッシュに直接アクセスします。
概要:
雪崩とは、広範囲にわたるキー キャッシュの障害です。ペネトレーションとは、キャッシュ キーが Redis に存在しないことです。ブレークダウンとは、Redis のホットスポット キーが突然失敗し、最終的な被害者はデータベースです。
7 Redis はなぜ速いのか
- 完全にメモリに基づいているため、ほとんどのリクエストは純粋なメモリ操作であり、非常に高速です。データは HashMap と同様にメモリ内に存在します。HashMap の利点は、検索と操作の時間計算量が O(1) であることです。
- データ構造がシンプルでデータ操作もシンプル Redis のデータ構造は特別に設計されており、データの操作も簡単です。
- シングルスレッドを使用することで、不要なコンテキストの切り替えや競合状態が回避され、マルチプロセスやマルチスレッドによる切り替えによるCPUの消費がなく、各種ロックを考慮する必要がなく、ロックの解放操作も不要で、考えられる理由はありません。デッドロックによるパフォーマンスの消費。
- 複数の I/O 多重化モデル、ノンブロッキング IO を使用します。
- 基盤となるモデルが異なり、それらの間の基盤となる実装メソッドとクライアントと通信するためのアプリケーション プロトコルが異なります。一般的なシステムがシステム関数を呼び出すと、一定量の無駄が発生するため、Redis は VM メカニズムを自身で直接構築します。移動とリクエストの時間
8 Redis の共通コマンド
- INFO: 現在のノード Redis の実行ステータス情報を表示します。
- SELECT: データベースを切り替えます。MySQL の USE DBNAME コマンドに相当します。
- KEYS: 現在のライブラリの下にあるすべてのキーを表示します。このコマンドは注意して使用してください。
- BGSAVE: バックグラウンドで RDB 永続化操作を手動で実行します。
- DBSIZE: 現在のライブラリ内のすべてのキーの数を返します。
- FLUSHDB: 現在のデータベース内のすべてのキーを強制的にクリアします。このコマンドは注意して使用してください。
- FLUSHALL: 現在の Redis サーバーのすべてのデータベースのすべてのキーを強制的にクリアします。つまり、すべてのデータを削除します。このコマンドの使用には注意が必要です。
9 SQL ステートメントの分類
- DDL: データ定義言語 データ定義言語
CREATE、DROP、ALTER - DML: データ操作言語 データ操作言語
INSERT、DELETE、UPDATE - DQL: データ クエリ言語 データ クエリ言語
SELECT - DCL: Data Control Language データ制御言語
GRANT、REVOKE、COMMIT、ROLLBACK
ソフトウェア開発者名:CRUD、追加・変更・削除に対応
10 マルチテーブルクエリ
- サブクエリ: SQL 文の中にクエリ文がネストされており、パフォーマンスが悪く、特定の文のクエリ結果に基づいてクエリが再度実行されます。
- 共同クエリ: UNION
- クロス接続: デカルト積、クロス結合
- 内部接続:
等価接続:テーブル間のフィールドを「等しい値」の接続関係にする
非等価接続
自然接続:繰り返し列の等価接続を解除する - 外部結合:
左外部結合: FROM tb1 LEFT JOIN tb2 ON tb1.col=tb2.col
右外部結合: FROM tb1 RIGHT JOIN tb2 ON tb1.col=tb2.col
自己結合: このテーブルとこのテーブルの間の結合クエリ
例:
# 子查询,常用在WHERE子句中的子查询
SELECT Name,Age FROM students WHERE Age>(SELECT avg(Age)FROM teachers);
# 联合查询
SELECT Name,Age FROM students UNION SELECT Name,Age FROM teachers;
# 交叉连接,即笛卡尔乘积,利用cross join实现
select stuid,s.name st_name,s.age st_age,tid,t.name te_name,t.age te_age from teachers t cross join students s;
# 内连接inner join
select * from students s inner join teachers t on s.teacherid=t.tid;
# 左外连接,outer可以省略
select s.stuid,s.name,s.age,s.teacherid,t.tid,t.name,t.age from students s left outer join teachers t on s.teacherid=t.tid;
# 右外连接
select * from students s right outer join teachers t on s.teacherid=t.tid;
# 自连接
# 构建表
create table emp (id int auto_increment primary key,name varchar(20),leader_id int);
# 实现自连接
select e.name,l.name from emp e inner join emp l on e.leader_id=l.id;
上記の面接の質問は個人的な要約です。順序に関係なく、思いついたことを自由に書いてください。文章に何か問題がある場合は、コメントしてメッセージを残してください。すぐに修正します。
元のリンク: Linux 運用保守エンジニアの面接の質問 (4)