TIL0721


😆 ケイシーって何?


キャッシュ(Cache)を使用して、メモリをより迅速に処理します.

n/a原理


よく使用されるデータをキャッシュに格納し、メインメモリではなくデータが必要なときにプロセッサにキャッシュにアクセスさせることで、処理速度が向上します.キャッシュに格納されているデータが大きすぎると、情報の検索時間が長くなるため、キャッシュ内のデータサイズを制限し、更新されたキャッシュ内のデータだけがキャッシュを有効に使用できるようにする必要があります.
前述したように、キャッシュは、サイズ別、時間別に格納され、それぞれ空間領域性、時間領域性と呼ぶことができる.

時間と地域性


最近アクセスしたデータに再アクセスします.例えば、ループ内でインデックスとして機能する変数iは、短時間で複数回アクセスすることができる.

宇宙の地域性


最近アクセスしたデータの周囲の空間に再アクセスする傾向を指す.上のループの場合、アレイarrの各要素は隣接するメモリ領域に連続的にアクセスします.

😁 キャッシュ置換アルゴリズム

  • キャッシュに空き容量がない場合、新しいコンテンツがメインメモリからキャッシュにコピーされると、キャッシュから既存のコンテンツを削除する必要があり、キャッシュ置換アルゴリズムは、どのブロックのコンテンツを削除するかを決定します.
  • 典型的なキャッシュ置換アルゴリズム


    1)最近使用したデータブロック(LRU):キャッシュ内で最も長い時間参照されていないデータブロックを置換する
    2)第一入力第一出力(FIFO):キャッシュ内最長時間のデータブロック置換方法
    3)最近接周波数使用(LFU):最も参照の少ないブロックを置換するアルゴリズム

    書き込みポリシー

  • キャッシュは、プログラムの速度を速めるための装置にすぎず、実際のプログラムはメインメモリで実行される.そのため、キャッシュ内のデータをメインメモリに書き込む必要があります.
  • 1) Write Through
  • の最も簡単な技術;
  • はキャッシュの即時変化を反映している
    問題:プライマリ・ストレージにボトルネックが発生する可能性がある
    2) Write back
  • 書き込み操作で問題が発生した問題を解決する方法は、キャッシュ内のデータのみを更新し、プライマリ・メモリは後で更新する方法です.
  • 問題:回路が複雑で、デバイス制御がキャッシュされたコンテンツをデバイスに転送できない場合があります.

    😃 MAP vs Object


    Javascript mapデータ型はObjectとよく似ています.どちらのデータ型も、鍵を値に設定したり、値を検索したり、鍵を削除したり、鍵に何が格納されているかを知ることができます.ただし、この2つのデータ型の間には、次の違いがあります.


    👍 MAP vs LRU cache


    LRU cacheはデータのサイズに時間と空間の制限があり、mapにはこれらの制限はないと思います.

    😷 JavaScriptコンソールI/O


    1)readlineでの入出力
    const readline = require('readline');
    
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    
    rl.question('What do you think of Node.js? ', (answer) => {
      // TODO: Log the answer in a database
      console.log(`Thank you for your valuable feedback: ${answer}`);
    
      rl.close();
    });
    2)プロンプトによる入出力
    result = prompt(title, [default]);
    resultは可視部分、defaultは初期入力値
    3) confirm
    result = confirm(question);
    受信した問題の入力値を確認します.入力値はtrueとfalseをクリックしてエクスポートします.
    例)
    let isBoss = confirm("Are you the boss?");
    alert( isBoss ); // true if OK is pressed

    同期メソッドと非同期メソッド


    同期は、バックグラウンド・タスクが完了したかどうかを確認し続け、バックグラウンド・タスクが完了した後も呼び出された関数はすぐに返されません.
    簡単に言えば、1つのコード文は、実行が完了した後に次のコードを実行できます.
    非同期の場合、呼び出された関数はすぐに戻って次のタスクに移動し、バックグラウンドが通知を発行するまで処理するかどうかを考慮する必要はありません.
    メインスレッド?ですべてのコードを実行し、バックグラウンドでコードを実行します.

    Promise


    Javaスクリプトとノードは主に非同期に接触します.特にイベントリスナーを使用する場合、コールバック関数がよく使用されます.このJavaScriptコールバック関数の地獄から抜け出すためにPromiseに基づいて再構築することができます.
  • 既存のコールバック関数で記述されたコード
  • function findAndSaveUser(Users){
    	Users.findOne({}, (err,user) =>{
        	if (err){
            	return console.error(err);
            }
            user.name = 'zero';
            user.save((err) => {
            	if (err) {
                	return console.error(err);
                }
                Users.findOne({gender:'m'},(err,user) => {
                
                });
            })
        });
    }
  • パスワード
  • function findAndSaveUser(Users){
    	Users.findOne({})
      		.then((user) => {
        		user.name = 'zero';
          		return user.save();
        	})
      		.then((user)=>{
        		return Users.findOne({gender: 'm'});
        	})
      		.catch(err => {
        		console.error(err);
        	});
    このように(user,err)、userを受け取ったら.err因子を順番に処理して受け入れる場合.catchに従ってエラーを一度に処理できます.

    async/await


    このようにPromiseでcallback地獄を脱し、async/awaitを通過します.then .catch構文を短縮できます.
    例)
    anync function findAndSaveUser(Users){
    	let user = await Users.findOne{()};
      	user.name = 'zero';
      	user = await user.save();
      	user = await Users.findOne({gender: 'm'});
      
    }
    実際、上記のコードはerrに対する操作がないだけなので、次のコードを作成する必要があります.
    anync function findAndSaveUser(Users){
      try{
    	let user = await Users.findOne{()};
      	user.name = 'zero';
      	user = await user.save();
      	user = await Users.findOne({gender: 'm'});
      } catch(error){
      	console.error(error);
      }  
    };