標籤:http io os ar sp 檔案 資料 on log
九月份慘不忍睹,因為代碼品質不夠高,直接被Boss噴成了篩子。被反覆教育說要高品質的代碼,要可維護、高效能……
幸而,最後一周終於在緊張的加班中,灰階上線redis-land-go了,項目也改名為redis-persist,github在此。
之前實現的,是redis到leveldb,以及skynet從leveldb中讀取資料的介面。最後一周添加的,是SA同事可能會用到的功能。主要是:
- dump
- restore_one
- restore_all
- sync
- sync_all
- count
- diff
- keys
- check_all
- fast_check
這些指令可以分成三類,一類是從redis拷貝到leveldb的,比如sync開頭的指令;一類是從leveldb拷貝到redis中的,典型如restore開頭的指令;剩下的是用來檢驗兩側資料的,比如檢查一個玩家資料的diff,檢查數量的count,還有列出leveldb部分玩家uid的keys
這裡的fast_check是針對當前玩家儲存做的一個特殊最佳化,在leveldb中用首碼分出了一個特殊的key表,裡面是玩家uid-玩家資料version的key-value對。這個表足夠小,可以整個放進記憶體裡,所以對於只需比對資料版本號碼的情況,能夠在極短時間完成。redis和leveldb通過網路連接,不在一台機器上時,12w資料不超過1分鐘。
同時,折騰這套工具的時候,還順便看了一下leveldb的結構。leveldb有個sstable的概念,sstable就是記憶體裡一塊按key有序排列好的表,可以改動的時候叫memtable,準備寫入磁碟的是另一個表,叫sstable。當資料比較少的時候,層級也比較少,具體哪個ldb檔案對應哪一段key範圍,是記錄在MANIFEST裡面的。寫入的記錄,首先記入log裡,這是順序寫,所以極快。然後是定期後台整理,將sstable和磁碟上已有的ldb檔案合并,使得磁碟的資料越來越有序。
redis-persist上線