Redisソース解析--ソース構造解析

6688 ワード

私のブログに引き続き注目してください.https://zcheng.ren
仕事を探していたとき、黄建宏先生の「Redis設計と実現」を見て、redisの部分の実現について簡明な認識を持った.面接の过程の中で、redisは确かに面接官の审査の私の1つのスポットライトになって、ちょうど后の仕事はまたredisと千丝万缕の连络を持っていて、そこで卒业する前のこの时间にredisのソースコードを研究して、后の仕事のために良い基础を筑きたいと思っています.
Redisの概要
redisフルネームREmote DIctionary Serverは、Salvatore Sanfilippoによって書かれた高性能key-valueストレージシステムで、BSDプロトコルを完全にオープンソースで無料で遵守しています.Redisと他のkey-valueキャッシュ製品(memcacheなど)には、以下のいくつかの特徴があります.+Redisはデータの永続化をサポートし、メモリのデータをディスクに保存し、再起動時に再ロードして使用することができます.+Redisは、単純なkey-valueタイプのデータだけでなく、list、set、zset、hashなどのデータ構造の格納もサポートします.+Redisは、データのバックアップ、すなわちmaster-slaveモードのデータバックアップをサポートします.
Redisの性能は極めて高く、豊富なデータ型を持っていると同時に、Redisのすべての操作は原子性であり、いくつかの操作を統合した後の原子性の実行もサポートされている.また、Redisにはpublish/subscribe、通知、keyの期限切れなどの機能をサポートする拡張機能が豊富です.
Redisのもっと優秀なところは、コードのスタイルが極めて簡素で、ソースコード全体が23000行しかなく、読書と鑑賞に有利であることです.まだ何を待ってるの?Start!
Redisソースの取得方法
redisは完全にオープンソースであり、そのソースコードは直接公式サイトで入手できる(現在の最新バージョンは3.2.5).次のコマンドを実行します.
cd ... //        redis    
wget http://download.redis.io/releases/redis-3.2.5.tar.gz
tar zxvf redis-3.2.5.tar.gz

このとき,解凍後のredisディレクトリの下にあるsrcフォルダに入り,redisのすべてのソースコードがここに格納される.
[root@VM_123_20_centos redis-3.2.5]# cd src/
[root@VM_123_20_centos src]# ls
Makefile      crc64.h        mkreleasehdr.sh    redis-cli.o     sort.o
Makefile.dep  crc64.o        multi.c            redis-sentinel  sparkline.c
adlist.c      db.c           multi.o            redis-server    sparkline.h
adlist.h      db.o           networking.c       redis-trib.rb   sparkline.o
adlist.o      debug.c        networking.o       redisassert.h   syncio.c
ae.c          debug.o        notify.c           release.c       syncio.o
ae.h          debugmacro.h   notify.o           release.h       t_hash.c
ae.o          dict.c         object.c           release.o       t_hash.o
ae_epoll.c    dict.h         object.o           replication.c   t_list.c
ae_evport.c   dict.o         pqsort.c           replication.o   t_list.o
ae_kqueue.c   endianconv.c   pqsort.h           rio.c           t_set.c
ae_select.c   endianconv.h   pqsort.o           rio.h           t_set.o
anet.c        endianconv.o   pubsub.c           rio.o           t_string.c
anet.h        fmacros.h      pubsub.o           scripting.c     t_string.o
anet.o        geo.c          quicklist.c        scripting.o     t_zset.c
aof.c         geo.h          quicklist.h        sds.c           t_zset.o
aof.o         geo.o          quicklist.o        sds.h           testhelp.h
asciilogo.h   help.h         rand.c             sds.o           util.c
bio.c         hyperloglog.c  rand.h             sdsalloc.h      util.h
bio.h         hyperloglog.o  rand.o             sentinel.c      util.o
bio.o         intset.c       rdb.c              sentinel.o      valgrind.sup
bitops.c      intset.h       rdb.h              server.c        version.h
bitops.o      intset.o       rdb.o              server.h        ziplist.c
blocked.c     latency.c      redis-benchmark    server.o        ziplist.h
blocked.o     latency.h      redis-benchmark.c  setproctitle.c  ziplist.o
cluster.c     latency.o      redis-benchmark.o  setproctitle.o  zipmap.c
cluster.h     lzf.h          redis-check-aof    sha1.c          zipmap.h
cluster.o     lzfP.h         redis-check-aof.c  sha1.h          zipmap.o
config.c      lzf_c.c        redis-check-aof.o  sha1.o          zmalloc.c
config.h      lzf_c.o        redis-check-rdb    slowlog.c       zmalloc.h
config.o      lzf_d.c        redis-check-rdb.c  slowlog.h       zmalloc.o
crc16.c       lzf_d.o        redis-check-rdb.o  slowlog.o
crc16.o       memtest.c      redis-cli          solarisfixes.h
crc64.c       memtest.o      redis-cli.c        sort.c

ソース構造解析
上のsrcディレクトリの下のファイルを見ると、目がくらくらします.ここでは以下のredisの作者を批判せざるを得ないでしょう.ソースコードを整理していないので、すべて1つのフォルダの下に置いています.
準備のない戦いをしないということは、ソースコードを手に入れた後、まずこれらのファイルを分類して、私たちの読書順序を計画します.ここでは、インターネットで見たソースの読み方(redisソース解析より抜粋)を紹介します.
  • は、結合関係が最も小さいモジュールから読み始め、その後、密接なモジュールに徐々に過剰になる.プログラムのテストを書くように、ユニットテストから始めてから機能テストに着きます.
  • 機能から着手する:ファイル名(モジュール名)と関数名を通じて、迅速に1つの機能の具体的な実現に位置して、それから全体の実現の運営の流れを追跡して、それによってこの機能の実現方式を理解します.
  • トップダウン:プログラムのmain()関数、または特定の大きな呼び出し者関数をエントリとして、深さ優先または広さ優先でソースコードを読みます.

  • また、黄健宏先生の「Redisソースはどうやって読みますか?」本文で紹介したredisの読み方は、基本的に上記の書類を合理的に分割して、一つ一つ攻略することができる.
    上図のRedisソースのモジュール区分に従って、ソースの学習ルートを初歩的に確定します.
    第一段階
    Redisのデータ構造部分を読むと、+メモリ割り当てzmalloc.cとzmalloc.h+動的文字列sds.hとsds.c+両端チェーンテーブルadlist.cとadlist.h+辞書dict.hとdict.c+ジャンプテーブルserver.hファイルにはzskiplist構造とzskiplistNode構造、およびt_についてzset.cのすべてのzslの先頭にある関数(zslCreate、zslInsert、zslDeleteNodeなど).+ログの種類cのhllhdr構造とhllで始まるすべての関数
    第2段階
    Redisのメモリ符号化構造+整数集合データ構造intsetを熟知している.hとintset.c+圧縮リストデータ構造ziplist.hとziplist.c
    第3段階
    Redisデータ型の実現+オブジェクトシステムobjectを熟知している.c+文字列キーt_string.c+リスト構築t_list.c+ハッシュキーt_hash.c+コレクションキーt_set.c+秩序化集合キーt_zset.cにおけるzslの先頭の関数を除くすべての関数+HyperLogキーhyperloglog.cにおけるpfで始まるすべての関数
    フェーズ4
    Redisデータベースの実現+データベースの実現redisを熟知している.hファイル中のredisDb構造、およびdb.cファイル+通知機能notify.c+RDB持続化rdb.c+AOF持続化aof.c
    いくつかの独立した機能モジュールの実装+リリースとredisの購読.hファイルのpubsubPattern構造とpubsub.cファイル+トランザクションredis.hファイルのmultiState構造及びmultiCmd構造、multi.cファイル
    第5段階
    クライアントとサーバ側のコード実装+イベント処理モジュールaeを熟知している.c/ae_epoll.c/ae_evport.c/ae_kqueue.c/ae_select.c+ネットワークリンクライブラリanet.cとnetworking.c+サーバ側redis.c+クライアントredis-cli.c
    このとき,以下の独立機能モジュールのコード実装+luaスクリプトscriptingを読むことができる.c+スロークエリslowlog.c+モニタc
    フェーズ6
    この段階は主にRedisマルチマシン部分のコード実装を熟知している.
  • コピー機能replication.c
  • Redis Sentinel sentinel.c
  • クラスタcluster.c

  • その他のコードファイルの紹介
    テストに関するファイルは:+memtest.cメモリ検出+redis_benchmark.c redisパフォーマンステストの実装に使用します.+redis_check_aof.cログチェックを更新するための実装.+redis_check_dump.cローカルデータベースチェックの実装に使用します.+testhelp.c Cスタイルの小型テストフレームワークです.
    いくつかのツールクラスのファイルは以下の通りです:+bitops.c GETBIT、SETBIT等のバイナリビット操作コマンドの実現+debug.cデバッグ時に+endianconvを使用する.c高低位変換、異なるシステム、高低位順序が異なる+help.hコマンドに補助するヒント情報+lzf_c.c圧縮アルゴリズムシリーズ+lzf_d.c圧縮アルゴリズムシリーズ+rand.c乱数+releaseを生成するために用いる.cパブリッシュ時に+sha 1を使用する.c sha暗号化アルゴリズムの実現+util.c汎用ツール方法+crc 64.cサイクル冗長検査+sort.c SORTコマンドの実装
    いくつかのパッケージクラスのコード実装:+bio.c background I/Oの意味で、バックグラウンドスレッド用の+latencyをオンにします.c遅延クラス+migrate.cコマンドの復元遷移など+pqsortを含むコマンド遷移クラス.cソートアルゴリズムクラス+rio.c redis定義のI/Oクラス+syncio.c SocketとファイルI/Oの同期
    Redis全体のソースコードの分類はほぼ上記のようになっていますが、次は既定のいくつかの段階に従ってRedisという優れたソースコードを分析しましょう.
    Ps:また自分に困難な計画を立てて、自分が前のように堅持することができることを望んで、少しずつ分析して、最後に多くの収穫があると信じています!