blog

i

有効期限の実装:1ランダムにそれが有効期限が切れているかどうかを判断するためにデータを取る、2ユーザーのクエリは、それが有効期限が切れているかどうかを判断するために メモリ戦略:LRUアルゴリズム6種...

Feb 14, 2020 · 6 min. read
シェア
  1. JUC スレッドセーフなアプリケーション
  2. JVMoom トラブルシューティング方法のチューニング
  3. kafka
  4. プロジェクトの紹介

redis

  1. stringダーティリードがないことを保証する必要があります。
  2. メッセージ通知の処理にはパブリッシュ・サブスクライブ・モデルが使用され、スタンドアロン・マシンは enventBus
  3. 期限切れの実装:1.期限切れかどうかを判断するためにランダムにデータを取得します。
  4. メモリ戦略:LRUアルゴリズム6種類1.期限切れに設定されたデータセットのために、すべてのデータセットは、最も長い未使用を取るために、ランダムにこれらの2つを選択し、2.期限切れについて3.削除されることはありません。
  5. クラスタ:マルチノード+マスター・スレーブ構造+読み書き分離+ハートビート機構+データ分割
  6. ハッシュスロットのパーティショニングは、ノード間で均等に分割された合計9000以上のスロットであり、拡張には再計算とデータの複製が必要です;
  7. パーティション・クエリー:任意のノードへのクエリー、指定ノードの計算、リダイレクト
  8. シングルスレッド:メモリ、コンテキストスイッチの回避、epollベースのio多重化

mysql

  1. インデックスの失敗:
フルバリューマッチングは私のお気に入りである。
先頭の兄弟は死なないし、真ん中の兄弟は壊れない。
インデックスカラムの計算を減らし、範囲後の完全な失敗を防ぐ。
like右端への書き込みの割合、スターを書かずにインデックスを上書きする。
ダーティリードがないことを保証する必要がある。
  1. インデックスタイプ
    • ストレージ:集約 非集約:b+treeのリーフノード=データ行全体 - "集約"、リーフノード=主キーID - "非集約";
    • ロジック: 主キー、単一カラム、ユニオン、ユニーク、fullText
    • データ構造: ハッシュ、b+Tree
  2. ハッシュ・インデックス: 同値 + ソート・サポートなし + 範囲クエリなし + ユニオン・インデックスの左端プレフィックス・サポートなし + ハッシュの衝突
  3. b-treeの構造は、ディスクへのIOの数を減らすためのものです。構造はおおよそm次のbTreeで、各ノードはm個のキーワードとbTree
2.4 B TREE +TREE何が違うのか 
B+Tree キーワード検索は左閉区間を使用する。左閉区間を使用する理由は、mysqlの本来の設計でもある自己インクリメントidをサポートするために最善の方法を取りたいからである。つまり、idが= 1ダーティリードがないことを確認する必要がある。
B+Tree ルート・ノードとブランチ・ノードにはデータ領域がなく、キーワードに対応するデータはリーフ・ノードにのみ格納される。つまり、リーフノードのキーワードデータ領域だけが、実際のデータ内容またはそのアドレスを保存する。B-tree種では、ルートノードがヒットすれば、データは直接返される。
 +Treeリーフノードが子ノードへの参照を保存しに行かないようなダーティリードがないようにする必要がある。
B+Treeリーフノードはシーケンシャルであり、隣接するノードはシーケンシャルな参照関係を持つ。上図のように、リーフノードはポインターで接続されている。
2.5 MySQLなぜBを選ぶのか?+Tree?
B+TreeB TREEの亜種であり、B TREEは以下の問題を解決できる。,B+TREEダーティリードがないことを保証する必要がある。
B+Treeライブラリやテーブルをスウィープする機能が優れている。インデックスに基づくデータ・テーブル・スキャンを行う場合、B TREEのスキャンではツリー全体を1回トラバースする必要がある。+TREEダーティリードがないことを保証する必要がある。
B+TREEディスクの読み書きはより強力である。ルートノードとブランチノードはデータ領域を保存しないため、同じサイズのルートノードとブランチノードは、B TREEよりも多くのキーワードを保存する。また、リーフノードは子ノードの参照を保存しないため、より多くのキーワードとデータを保存することができる。そのため,B+TREEB TREEよりも多くのキーワードを一度に読み書きできる。
B+Treeより強力なシーケンス機能。上の図を見てわかるように,B+Tree当然、ソート機能がある。
B+Tree安定したクエリパフォーマンス。+Treeデータはリーフノードにのみ保存され、データがクエリされるたびに、クエリのIO回数は安定しなければならない。ルートノードが直接バックヒットする場合、B TREEでは、それは確かにより効率的であるため、もちろん、これは誰もが異なって理解している。

JUC

  1. 同期ロック エスカレーション バイアスロック→軽量ロック→重量ロック
  2. 同期ロックの違い:1.ロックは、唯一のコードブロックに配置することができます;
  3. ロックローディングのメソッドとコードブロックは、javapのデコンパイルクラスファイルの別の実装を見ることができる、メソッドでは、ロックを達成するためにACC_SYNCHRONIZEDロゴの取得を介してです。ロックを達成するためにmonitorEnterとmonitorExitに耳を傾ける;分析原理
オブジェクトはヒープ・メモリ・モデルに格納される:
1.  
 * markword - ランタイムデータ:hashCode、ロックステータス、ロックのスレッドID、再入力カウント、サブ世代識別子、gcカウントなど;
 * メタデータ・ポインタ - 現在のオブジェクトがどのクラスのオブジェクトであるかを示す。
2.  
3. データを埋める
  1. notify,notifyAllはモニタオブジェクトに依存しているので、実行されるには以下で同期されている必要があります。notifyを呼び出すオブジェクトで複数のスレッドが待機している場合、jvmはランダムにスレッドに通知します;
  2. スレッドプール構成:IO集中型一般CPU*2、その他CPU+1;
  3. 揮発性メモリの可視化、命令の並べ替え禁止、アトミック性の保証なし - シングルトンパターン
  4. CAS:atomInteger.getAndIncrementは、volatileによって値のメモリ可視性を保証し、Unsafeクラスによってメモリ変更の原子性を保証します;
  5. スレッドプールの状態
running ---shutdown --シャットダウン
 ->> tidying ->> terminate
running ---shutdownNow --停止
  1. スレッドステータス
    • init
    • blocking -
    • waiting - ojb.wait()
    • timeWaiting - thread.sleep obj.wait(1)
    • stop
  2. thread.interrupteスレッドを中断するだけで、スレッドの状態の変化であり、実際の割り込みは、スレッド独自の判断の終わりにする必要があります。いくつかのスレッドメソッドは、イニシアチブは、彼がスピン判断を行っている割り込みの中断可能な状態に代わってinterrupte例外をスローする場合など:参加、スリープ、待機、およびデッドロックの場合には中断することはできません。あなたが割り込みたい場合はブロックされている、InterruptibleChannelインタフェースの実装は、クローズインターフェイスの割り込みを呼び出すことができます;

classLoader

  1. findLoadClass, findClass, defineClass, loadClass の4つのメソッドがあります。
public Class loadClass(String name, boolean reslove) { //1. ダーティリードがないことを確認する必要がある。 Class clazz = findLoadedClass(name); if (clazz != null) { return clazz; } //2. 親子間委譲の省略 //3. findClas ダーティリードがないことを確認し、defineClassを実行してバイトを格納する必要がある。[]クラス・オブジェクトへの変換 return findClass(name); }
  1. loadClassのbiparental delegateを壊すことは可能です;
  2. クラスのロードは、load、link、initの3つのステップに分けられます。
  3. また、初期化の順番もあります:親スタティック - `子スタティック - `親変数の初期化 - `子変数の初期化 - `親コンストラクト - `子コンストラクト;

engine プラグインのロード

タスク操作を実行するために、異なるタイプやバージョンのデータ・ソースをサポートする必要がある場合。 データ・ソース・プラグインのさまざまなタイプやバージョンを直接導入して、バージョンの競合が発生しないようにするため。以下の方法で解決してください:

  1. テンプレートインターフェイスを定義することで、プラグインが行う必要のある様々な関数を定義し、jarをロードする際にSPIによって指定された実装を取得します;
  2. classLoaderをカスタマイズし、loadClassメソッドを実装することで、2つの親デリゲートは、現在のjarのクラスローダーが別個であることを保証するために分割されます; なぜなら、2つのインスタンスが等しいと判断するための最初の条件は、クラスローダーが同じであることだからです;
  3. JDBCドライバのロードを通じたスレッドコンテキストクラスローダメカニズムの深い理解

jdbc

Class.forName("com.mysql.jdbc.Driver");
DriverManager.getConnection(jdbc, u, p);
  1. class.forName は、クラスのロード時にスタティック・コード・ブロックで登録操作を実行するために、ドライバ・クラスを手動でロードし、現在のドライバを DriverManager のドライバ・リストに登録します;
  2. javaの新しいバージョンは、ドライバクラスを手動でロードする必要がないように最適化されています。代わりに、現在のjarパッケージのドライバクラスの操作をスキャンするために追加された静的なコードブロックのDriverManagerの初期化で。 別のjarでドライバクラスをロードするか、手動でクラスをロードする場合は、実装はspiです。

分散トランザクション

TCC

  1. try - confirm - cancel
  2. また、2段階のコミット・プロトコルで動作し、トライ・ファーストで実行に十分なリソースがあることを確認し、リソースをロックします。後に実行の成功または失敗があれば、引き続き確認とキャンセルの操作を実行します。
  3. 注意
    • 複数のアクセスは一度だけ実行されることが保証されるべきです。
    • 空のロールバックを許可。try がパケットを失って cancel が idle になる可能性あり;
    • 中断防止制御、ネットワークの問題によるtry、キャンセル順序の逆転。これらの問題は、トランザクションの実行順序の問題を確実にするために、トランザクションIDとトランザクションの状態を保持する必要があります;
  4. 最適化
    • try-confirmを非同期で実行し、最初にリソースをロックし、非同期でコミットまたはロールバックすることができます。

FMT

フレームワークはSQLを解析し、変更前と変更後のビジネスSQLのスナップショットを保存し、コミットとロールバックはフレームワークによって実行されます。

Read next

FlutterのウェブリクエストライブラリDioをラッピングする

デモアドレス -.itは、ネットワークリクエストのいくつかの利点をカプセル化します: er、公開パラメータ、デバッグを容易にする暗号化ルールなどのリクエストパラメータの統一された設定を容易にするために、詳細な日

Feb 14, 2020 · 8 min read