Redisソース解析--ソース構造解析
私のブログに引き続き注目してください.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).次のコマンドを実行します.
このとき,解凍後のredisディレクトリの下にあるsrcフォルダに入り,redisのすべてのソースコードがここに格納される.
ソース構造解析
上の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:また自分に困難な計画を立てて、自分が前のように堅持することができることを望んで、少しずつ分析して、最後に多くの収穫があると信じています!
仕事を探していたとき、黄建宏先生の「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ソース解析より抜粋)を紹介します.
また、黄健宏先生の「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マルチマシン部分のコード実装を熟知している.
その他のコードファイルの紹介
テストに関するファイルは:+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:また自分に困難な計画を立てて、自分が前のように堅持することができることを望んで、少しずつ分析して、最後に多くの収穫があると信じています!