1週間のテクノロジのまとめ1

4753 ワード

title:週技術小結1 date:2017-9-4 21:22:21
tcp接続auth情報の保存
私のサーバー開発シリーズ1で問題が発生しました:tcp clientは接続後、まずauth msgを送信して認証する必要があります.認証が通過しないと直接切断されるので、現在の接続の状態を保存する必要があります.
当時、2つの方法が提供されました.
  • はredisで
  • を記憶する.
  • swooleを使用した共有メモリソリューション:swoole table
  • しかし、本当に自分が知っている「少なすぎる」ということで、swoole wikiには解決策があります:swoole_serverにおけるメモリ管理メカニズム
    $serv = new swoole_server("0.0.0.0", 9999);
    $serv->authFlag = []; //        
    
    $serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) {
        // auth   
        if (!isset($serv->authFlag[$fd])) {
            //    auth   
        }
    }
    

    サブテーブル
    2枚のテーブルのデータは急速に増加して、データ量はすでに百万級になって、mysqlテーブルの容量は千万級で、サーバーの性能に対する要求を満たすことができないかもしれません.
    $table = 'game_'. ($uid % 100); //      id   ,      100  
    

    表を分けると同時に、すべてのデータを格納し、「バックグラウンド管理」などのシステムでデータを取得するのに便利な表もありますが、この表は定期的に整理されます.
    CREATE TABLE game_tmp LIKE game;
    RENAME TABLE game game_201709;
    RENAME TABLE game_tmp game;
    

    同時「オンラインゲーム」の簡単な実現
    同時発生による資源争奪問題を解決するには、読み書きロック/排他ロック/スピンロックなど、様々なロックが考えられる.しかし、実は「原子性」の操作を保証すれば、自分でロックをかけずに実現することができ、以下にredisベースの2つの案を提供する.
    public static function incr($key)
    {
        $res = static::getEngine()->incr($key); // redis incr command
        if ($res == 1) { //    1             
            return true;
        }
        return false; //      1        
    }
    

    同じようにredis setnx commandもあります
    pr: pull request
    githubを遊ぶとこの言葉に詳しいので、今週は2つのことに遭遇しました.
  • 作業開発でprを使用する:まずforkの元のプロジェクトで、forkが出てきたプロジェクトで「勝手に」することができます;コードを提出すればprを提出できます.prでcode reviewを指定できる方は
  • 貢献オープンソース:最近swoole用が多く、eaglewu/swoole-ide-helperプロジェクトに使用され、改善された場所に遭遇したら、prを使って自分の力
  • に貢献します.
    mysql問題の簡単な調査
    mysqlに問題が発生した場合は、簡単に次の方法で調べてみてください.
    -- mysql         
    SHOW PROCESSLIST 
     -- information_schema     
    SELECT * FROM information_schema.`PROCESSLIST`
    
    --           id     
    kill id 
    

    この方法でアウトソーシングで書いた問題コードを見つけた.
    mysql jsonデータの処理
    mysql 5はとっくに知っていた.7 jsonをサポートしていますが、ずっと使う机会がありません.今回はちょうど出会った:元のサーバーはnodejsで书いて、mysqlの中で多くのjsonフィールドを使って、これは使用时にjson encode / json decodeを必要として、サーバーとしてどのように我慢することができて、だから「データの移行」を行う必要があります.
    mysql jsonのサポートがない前に:
  • 元のテーブルに新しいフィールドを追加してjson decode後のデータ
  • を保存する.
  • json decode後のデータ
  • を保存するためのテンポラリ・テーブルの新規作成
  • スクリプトを実行し、データを読み出し、json decode、テンポラリテーブル
  • に書き込む.
  • テンポラリ・テーブルおよび元のテーブルjoinは、新しいフィールド
  • を更新するために使用される.
    --    ,       
    DROP TABLE IF EXISTS db_tmp;
    CREATE TABLE `db_tmp` (
    `id`  BIGINT(20) UNSIGNED NOT NULL DEFAULT 0,
    intv1 BIGINT NOT NULL DEFAULT 0,
    intv2 BIGINT NOT NULL DEFAULT 0,
    intv3 BIGINT NOT NULL DEFAULT 0,
    string1 VARCHAR(255) NOT NULL DEFAULT '',
    string2 VARCHAR(255) NOT NULL DEFAULT '',
    string3 VARCHAR(255) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    public function gameSession()
    {
        $begin = microtime();
    
        $dbTmp = 'db_tmp';
        DbClient::execute("TRUNCATE $dbTmp");
        $table = 'game';
        $count = DbClient::findColumn("SELECT COUNT(*) FROM $table");
        $id = 0;
        $limit = 2000; //        
        while ($count>0) {
            $rows = DbClient::findAll("SELECT id,record_text FROM $table WHERE id>$id LIMIT $limit");
    
            $data = [];
            foreach ($rows as $v) {
                $arr = json_decode($v['record_text'], true);
                $videoUrl = $arr['video_url'] ?? '';
                $data[] = [$v['id'], $videoUrl];
            }
            $id = $v['id'];
    
            $options = ['column_names' => ['id', 'string1']];
            DbClient::insertAll($dbTmp, $data, $options);
            echo "table:$table id:$id limit:$limit
    "; $count -= $limit; } echo "time take: " . (microtime() - $begin) . "
    "; }

    しかし、json関数のサポートがあれば、
    -- mysql json function
    UPDATE game SET video_url=trim(BOTH '"' FROM json_extract(record_text, '$.video_url')) WHERE record_text is NOT NULL;
    

    また,実測では2000を用いてページを分割し,スクリプトは2分かかり,json関数は5 s未満であった.
    コンピュータの基礎が悪い
  • top kアルゴリズム(大量数の中で最大k個数を求める)
  • を話します
  • mysqlのインデックスは何のデータ構造ですか?B+Treeexplain各フィールドはどういう意味ですか.explain後の文は直接オンラインで使えますか.where a=xxx and b>xxx order by cインデックスの作成方法
  • epoll
  • についてお話しします
  • swooleのプロセスモデルを話しますか?ネットワークデータはどのように流れていますか?プロセス間でどのように通信しますか?Unix socket通信を使用するのはudp serverですが、何か問題がありますか?
  • httpsプロトコルを見たことがありますか?httpプロトコルとネットワークデータがどのように相互作用するかを説明する
  • 以前出会ったことをもう一度言います.
  • 速列
  • と言います
  • mysqlサーバのアーキテクチャを説明します.mysqlクエリーの最適化は何ですか.
  • select poll epoll
  • サーバ大量502どうする