2021/3/24 iQiyi(電話インタビューのための予想外にクールな経典)Redisキャッシュデータがいっぱいになったときにどう対処するか?Java例外アーキテクチャSpringInterceptorSQLインジェクション

1睡眠についてのあなたの理解について話し、待ってください?

1異なるクラス:waitはオブジェクトを継承し、sleepはスレッドを継承します
2はロックを異なる方法で処理します:sleepはロックを解放せず、waitはロックを解放します
3つの異なる使用範囲:sleepはどこでもスリープでき、waitmust同期コードブロック内

2スレッドのライフサイクル?

新規、実行可能、ブロック済み、待機中、時間指定待機中、終了

スレッド作成の3つの4つの方法?

1スレッドを継承する2Runnableを実装する3Callableを実装する4スレッドプールを使用して、ThreadPoolExecutorの方法を作成する

4スレッドプールの7つのパラメータ


```java
public ThreadPoolExecutor(int corePoolSize,  //核心线程池大小,线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁。
                          int maximumPoolSize, //一个任务被提交到线程池以后,首先会找有没有空闲存活线程,如果有则直接将任务交给这个空闲线程来执行,
                          //如果没有则会缓存到工作队列( BlockingQueue<Runnable> workQueue)中
                          //如果工作队列满了,才会创建一个新线程,然后从工作队列的头部取出一个任务交由新线程来处理,而将刚提交的任务放入工作队列尾部。线程池不会无限制的去创建新线程,
                          //它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。

                          long keepAliveTime,  //一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁
                          TimeUnit unit, //超时单位
                          BlockingQueue<Runnable> workQueue, //新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务
                          ThreadFactory threadFactory, //为线程池提供创建新线程的线程工厂
                          RejectedExecutionHandler handler //当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来
                         ) 
}

5Redisの基本的なデータ型

データのような構造、複数種類の文字列(文字列)、ハッシュのハッシュ)、リスト(リスト)、セット(集合)、順序付けられたセット(ソートされたセット)と範囲クエリ、ビットマップにhyperloglogs及びgeospatial(Geospatial)インデックス半径クエリ

6Redisの永続性

1RDB(Redis DataBase)
は、指定された時間間隔内にメモリ内のデータの集合スナップショットをディスクに書き込みます。これは、専門用語ではスナップショットとも呼ばれます。復元されると、スナップショットファイルがメモリに直接読み込まれます。

Redisは、永続化のための子プロセスを作成(フォーク)します。最初にデータを一時ファイルに書き込みます。永続化プロセスが終了すると、最後に永続化されたファイルがこの一時ファイルに置き換えられます。プロセス全体を通して、メインプロセスはIO操作を実行しません。これにより、非常に高いパフォーマンスが保証されます。大規模なデータ回復が必要であり、データ回復の整合性がそれほど敏感でない場合、RDB法はAOF法よりも効率的です。RDBの欠点は、最後の永続化後のデータが失われる可能性があることです。デフォルトはRDBです。通常の状況では、この構成を変更する必要はありません。
このファイルを本番環境でバックアップする場合があります。
rdbによって保存されたファイルはdump.rdbで、構成ファイルのスナップショットで構成されています。

トリガーメカニズム:1保存のルールが満たされると、rdbルールが自動的にトリガーされます。2fluxhallコマンドを実行すると、rdbルールもトリガーされます。3 redisを終了すると、rdbファイルも生成されます!
rdbファイルをredis起動ディレクトリに置くだけです。redisが起動すると、dump.rdbが自動的にチェックされ、データが復元されます。

利点:
1大規模なデータ復旧に適しています!2データの整合性は高くありません!3ファイルdump.rdbは1つだけで、永続化に便利です。4パフォーマンスを最大化するには、子プロセスをフォークして書き込み操作を完了し、メインプロセスがコマンドの処理を続行できるようにして、IOが最大化されるようにします。永続性のために別のサブプロセスを使用します。メインプロセスはIO操作を実行しないため、redisの高いパフォーマンスが保証されます。5大規模なデータセットと比較して、起動時にAOFよりも効率的です。
短所:
1動作する一定の時間間隔!redisが予期せずクラッシュした場合、最後に変更されたデータは失われます!2フォークプロセスの場合、一定量のメモリスペースを消費します。

2AOF(ファイルの追加のみ)
AOFの永続性(ファイルの永続性の追加のみ)は、Redisによって実行された各書き込みコマンドを個別のログファイルに記録します。Redisを再起動すると、永続ログ内のファイルが復元されます。2つの方法を同時に有効にすると、データリカバリRedisはAOFリカバリを優先します。AOFはappendonly.aofファイルを保存します

1すべての変更が同期され、ファイルの整合性がさらに向上します。
2 1秒に1回
同期すると、1秒のデータが失われる可能性があります。3同期しないでください。最も効率的です。
短所:
1データファイルのサイズに比べて、AOFはRDBよりもはるかに大きく、修復速度もRDBよりも遅くなります。
2Aofの運用効率もRDBよりも遅いため、redisのデフォルト構成はRDB永続性です。

7Redisキャッシュデータがいっぱいになった場合の対処方法は?

1.メモリの追加:これは最も単純で失礼な方法ですが、コストは比較的高くなります

2.メモリ除去戦略の
ノエビクションメモリが新しく書き込まれたデータを収容するのに不十分な場合、新しい書き込み操作はエラーを報告します
allkeys- lruメモリが新しく書き込まれたデータを収容するのに不十分な場合、キースペースで最も最近削除しますused key
allkeys- randomメモリが新しく書き込まれたデータを収容するのに十分でない場合、キースペースでキーがランダムに削除されます
volatile- ttlメモリが新しく書き込まれたデータを収容するのに十分でない場合、キースペースで有効期限が設定されている場合、有効期限が早いキーが優先的に削除され
ます。3。クラスターを構築してクラスターを構築します。

8データベースのトランザクションメカニズム?

トランザクションのACID原理
原子性(原子性)原子性
とは、トランザクションが分割できない作業単位であり、トランザクション内の操作がすべて発生するか、発生しないことを意味します。
一貫性(一貫性)
トランザクションの前後のデータの整合性は一貫している必要があります。
耐久性耐久性
とは、トランザクションがコミットされると、データベース内のデータへの変更が永続的であり、データベースに障害が発生しても、データベースに影響を与えないことを意味します
。分離
トランザクションの分離データベースに同時にアクセスする場合、ユーザーのトランザクションは他のトランザクションによって干渉されず、データベースは同時トランザクション間で独立しています。

9トランザクションの分離レベルはどれくらいですか?

MysqlのデフォルトのREPEATABLE_READ分離レベルOracleのデフォルトのREAD_COMMITTED分離レベル
ここに画像の説明を挿入

10基本的なクエリステートメントの操作

11finalキーワードの理解

クラス、属性、および方法を変更するために使用し、
最終的修飾クラスは継承できません、
最終修正方法をオーバーライドすることができない、
最終修正変数を変更することはできない、と最終修正不変の変数参照され、コンテンツはによって指しません参照、参照が指すコンテンツは変更できます

12Java例外アーキテクチャ

ここに画像の説明を挿入

  1. Throwable
    Throwableは、Java言語のすべてのエラーと例外のスーパークラスです。
    Throwableには、ErrorとExceptionの2つのサブクラスが含まれています。これらは通常、異常な状況が発生したことを示すために使用されます。

  2. エラー
    定義:エラークラスとそのサブクラス。プログラムで処理できないエラーは、実行中のアプリケーションで重大なエラーが発生したことを意味します
    機能:このタイプのエラーは、通常、コードの実行中にJVMに問題があることを示します通常、Virtual MachineError(仮想マシンの実行エラー)、NoClassDefFoundError(クラス定義エラー)などがあります。たとえば、OutOfMemoryError:メモリ不足エラー; StackOverflowError:スタックオーバーフローエラーこのようなエラーが発生すると、JVMはスレッドを終了します。
    これらのエラーは、
    チェックされていない例外、非コードエラー
    です。

  3. 例外(例外)
    プログラム自体が例外をキャッチして処理できます例外このタイプの例外は、実行時例外とコンパイル時例外の2つのカテゴリに分類されます

ランタイム例外の
定義:RuntimeExceptionクラスとそのサブクラスは、JVMのランタイム中に発生する可能性のある例外を表します

機能:Javaコンパイラはそれをチェックしません。つまり、このような例外がプログラムで発生する可能性がある場合、「throwsステートメントを介してスロー」または「try-catchステートメントによってキャッチされない」のどちらでもない場合でも、コンパイルされます。NullPointerExceptionがヌル・ポインタ例外境界例外のうちArrayIndexOutBoundException配列添字ClassCastExceptionが型変換例外ArithmeticExecption算術演算例外

RuntimeExceptionは自動的にスローされ、Java仮想マシンによって自動的にキャッチされます(例外キャッチステートメントを記述しなくても、実行時にエラーがスローされます!!)。このような例外の最も一般的な発生は、コード自体に問題があり、論理的に解決する必要がありますコードを解決して改善します

コンパイル時の例外:定義:RuntimeExceptionとそのサブクラスを除く例外。

機能:Javaコンパイラはそれをチェックします。ClassNotFoundException(指定されたクラス例外が見つからない)、IOException(IOストリーム例外)などの例外がプログラムで発生した場合は、throwsで宣言してスローするか、try-catchでキャッチします。それ以外の場合はできません。編集済み。

  1. 未チェックの例外未チェックの例外と
    Javaのすべての例外は、サブジェクト異常(チェックされた例外)と未チェックの例外(チェックされていない例外)に分けることができます。

チェックされた例外
コンパイラには、処理する必要のある例外が必要です。正しいプログラムの操作中に、多くの場合、異常な状況が発生しやすく、期待に応えます。このような例外が発生した場合は、何らかの方法で処理する必要があります。** RuntimeExceptionとそのサブクラスを除いて、他の例外例外はすべてチェックされた例外です。**コンパイラはそのような例外をチェックします。つまり、コンパイラがアプリケーションのどこかにそのような例外がある可能性があることをチェックすると、この例外を処理するように求められます。try-catchを使用してキャッチするか、メソッドシグネチャを使用します。スローするキーワードをスローします。そうしないと、コンパイルはパスしません。


未チェックの例外コンパイラはチェックせず、処理する必要のある例外を必要としません。つまり、プログラムでこのような例外が発生した場合、try-catchでキャッチしなくても、スローは使用しません。例外をスローし、コンパイラはスローしません。正常に通過します。このような例外には、ランタイム例外(RuntimeExceptionとそのサブクラス)およびエラー(エラー)が含まれます。

13スプリングオブジェクトの射出操作

1 @ Autowired ; 1はタイプごとに自動的にアセンブルされます; 2は属性で直接使用され、自動インジェクションの前提条件はBeanオブジェクトがIOCコンテナに存在することです
2 @ Qualifier ; @Autowiredはタイプに従って自動的にアセンブルされますプラス* * @QualifierはbyName **自動アセンブリの方法に従うことができます; @Qualifierは単独で使用することはできません

14スプリングインターセプター

最近のプロジェクトでは、権限制御にSpring Securityを使用する予定ですが、以前のプロジェクトのほとんどはSpringインターセプターを使用して実装されていましたSpring MVCプロジェクトでは、Springインターセプターがパーミッション制御に使用されます。一般に、インターセプターには2つのタイプがあります。1つのログインインターセプター複数のパーミッション検証インターセプターです。
ログインインターセプターすべてのリクエスト、ユーザーがログインしているかどうか、ユーザー名とパスワードが正しいかどうかを確認します許可検証インターセプター。
複数のパーミッション検証インターセプター:異なるリンクルールは、異なるインターセプターを使用してパーミッション検証をインターセプトして実行します

Springのインターセプターを実装する方法は2つあります。1つ
はカスタムInterceptorクラスがSpringのHandlerInterceptorインターフェース
を実装する方法もう1つはSpringのWebRequestInterceptorインターフェースを実装する方法です

Spring InterceptorとFilterの違い:

1.インターセプターはjavaのリフレクションメカニズムに基づいており、フィルターは関数コールバックに基づいています

2.インターセプターはスプリングコンテナー内のサーブレットコンテナーに依存せず、フィルターはサーブレットコンテナーに依存します

3.フィルタは、サーブレットの前後でのみ機能します例外がスローされる前と後のインターセプタは、深い前に行くとメソッドの後にすることができますので、インターセプタの使用は、より高い柔軟性を持っています。したがって、プログラムのSpringフレームワークでは、インターセプターを最初に使用する必要があります。

4.アクションのライフサイクルでは、インターセプターは複数回呼び出すことができますが、フィルターはコンテナーが初期化されたときに1回だけ呼び出すことができます

5.インターセプターはIOCコンテナー内の各Beanを取得できますが、フィルターは取得できません。つまり、インターセプターにサービスを注入すると、ビジネスロジックをより柔軟に呼び出すことができます。

15SQLインジェクション

SQLインジェクションの問題を解決するための鍵は、ユーザー入力から取得される可能性のあるすべてのデータ厳密にチェック、データベース構成に最小特権の原則を使用することです。
1.すべてのクエリステートメントは、データベースによって提供されるパラメーター化されたクエリインターフェイスを使用し、パラメーター化されたステートメントは、ユーザー入力変数をSQLステートメントに埋め込む代わりにパラメーターを使用します現在のほとんどすべてのデータベースシステムは、パラメータ化されたSQLステートメント実行インターフェイスを提供します。このインターフェイスを使用すると、SQLインジェクション攻撃を効果的に防ぐことができます
2.データベースに入る特殊文字( '"\山括弧&*;など)はエスケープまたは変換されます。3
変数タイプは厳密に制限されています。たとえば、整数変数はintval()関数によってフィルタリングされます。ストレージフィールドint型に対応している必要があります
4.データの長さが厳しく規制されなければならない。正しく実行されてから長いSQLインジェクション文を防ぐために
5.統一されたウェブサイトの各データ層のコーディング、およびそれが使用することをお勧めしますUTF- 8。コーディング、上の矛盾を、いくつかのフィルタリングモデルがバイパスされる可能性がありコーディング下げる。
6.厳密にウェブサイトのユーザーのデータベースの操作権限を制限し、それによって被害を最小限に抑え、彼の仕事を満たすことができる唯一の権限を持つこのユーザに提供データベースへのインジェクション攻撃の例
。7、サイトにエラーの種類などのSQLエラーメッセージが表示されないようにするため、フィールドが一致しないなど、攻撃者がこれらのエラーメッセージを使用して判断を下すのを防ぐため
。8Webサイトがリリースされる前に、いくつかの専門的なSQLインジェクション検出ツールを使用して、これらのSQLインジェクションの脆弱性を時間内に検出してパッチを適用することをお勧めします

16HashMapの基本的な理解

実装原理:HashMapはチェーンアドレス方式を採用しています。つまり、最下層は配列の実装であり、配列の各項目(つまり、エントリ)はリンクリストです。

HashMapストレージメカニズム:最初にキーに従って配列内のキーに対応するエントリの位置を計算し、次にそのエントリがその位置に対応するリンクリストにあるかどうか判断しますない場合は、リンクリストの先頭を挿入します。そうである場合は、リンクリスト内の対応するエントリの値を更新します。

HashMapは、キーが属する配列の位置を計算します。最初にキーのハッシュ値を計算し、次にハッシュ関数hashcode&(length-1)に従って配列の位置を計算します( HashMapの配列の長さのためは2の整数乗であり、ビット単位の演算を使用します。結果はハッシュの%長と同じですが、ビット演算の効率は残りの演算の効率よりもはるかに高くなります)

HashMapの拡張:HashMapが初期化されるときは常に、デフォルトの配列サイズ(table.size)は16です(初期化段階では16はありませんが、要素を追加するときはresize = 16)、デフォルトの成長係数(loadFactor)は0.75です。 ;要素の数が配列サイズのloadFactorを超えると、配列が展開されます。HashMapで採用されている展開方法は、毎回配列のサイズを2倍にしてから、配列内のHashMap内の各要素の位置を再計算することです拡張容量のサイズをカスタマイズすることもできます(HashMap(int initialCapacity))。

17 ArrayList && LinkedListの違いは何ですか?

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/zs18753479279/article/details/115215403