Redis: A persistent key-value database with built-in net interface written in ANSI-C for Posix systems. Redis是現在很火的高性能KV內存數據庫,支持豐富的數據類型,支持持久化、數據同步等DB特性。Redis是開源的,代碼量不大2W+,代碼風格和實現都很值得學習。在開源的時代,模仿好代碼估計是最快的學習方式。
使用
推薦如下資料:
實現
推薦如下資料:
Redis RDB文件格式全解析,英文:https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format
可復用代碼(版本2.6.3)
malloc封裝():tcmalloc|jemalloc|libc 使用最佳的malloc封裝,libc的malloc不提供獲取分配內存大小的接口。
zmalloc.h, zmalloc.c
異步網絡庫:封裝各種事件組件,提供統一的接口。
ae.c ae_epoll.c ae_evport.c ae.h ae_kqueue.c ae_select.c
TCP|UNIX網絡封裝: 很簡單的封裝。
anet.h, anet.c, syncio.c(阻塞式讀寫)
數據結構
adlist.h, adlist.c (通用雙向鏈表), ziplist.h, ziplist.c, zipmap.h, zipmap.c, intset.h, intset.c(基於連續內存的小數據存儲結構), sds.h, sds.c(Binary Safe字符串)
lzf壓縮算法
lzf -- an extremely fast/free compression/decompression-method: http://liblzf.plan9.de/
lzf_c.c lzf_d.c lzf.h lzfP.h
文件讀寫: 封裝基於文件和內存的數據讀寫。
rio.h, rio.c
工具
crc64.c, endianconv.h, endianconv.c(將大端數據轉成小端,性能考慮), memtest.c(內存測試工具), pqsort.h, pqsort.c(部分快排), rand.h, rand.c, sha1.c, sha1.h(開源的sha), util.c, util.h(字符串匹配,字符串和整形數轉換)
設計
靈活協議
Redis采用可讀可組合的文本協議。Redis采用統一的命令格式,基於統一的規范命令Redis天生具備解析和執行多條命令的能力,因此Redis非常容易支持:批量命令、事務、原子操作(腳本原子操作)等。
權衡
Redis的設計需要做各種權衡,每一種權衡都意味着不同的實現方案、資源、性能的折中。Redis不可能適合所有的使用場景,作為KV的內存數據庫,Redis做了很多針對性設計:高性能優先、高內存使用效率、多樣的數據結構(內存易實現)、單線程讀寫(CPU非瓶頸)、數據快照(RDB文件)、可過期的數據,同時提供其他可配置的功能:AOF(日志)、可配置的小數據格式、主從Replication、嚴格內存限制或swap、LRU緩存、磁盤存儲等。
小技巧
其他資料