基於協程和非同步IO的NoSQL資料庫AsyncDB正式發布

GitHub鏈接:GitHub - JimChengLin/AsyncDB: 協程 + 非同步 + B-Tree = AsyncDB 內有清晰使用文檔。

程序經過我大量的隨機測試,可以放心使用。據我所知,還沒有人做到跟我類似的事情。

老生常談,Node.js為什麼快?核心思想是事件驅動的非同步IO。那麼有沒有人想過,用這樣的思路去實現資料庫呢?硬碟理論上也是非常緩慢的一個組件。

問題來了,如何保證數據的一致性與請求的時序性?假設,有3個請求,對於鍵值「foo」,進行三次修改。在這三次操作之間對「foo」進行非同步讀取,會得到什麼樣的值?

當然,可以放寬要求,採用最終結果一致性模型,只保證能得到「foo」的最終值。但有優秀得多的方案:在內存中,建立一個狀態機映射。在協程間不斷跳轉,就是不斷地從映射中,恢復預期的狀態。

這樣可能有些抽象。總之,我的資料庫保證,一切的結果都符合正常人類的第一直覺。

協程+非同步IO還有一個意想不到的優勢就是請求優化。傳統資料庫,10個請求合併為1個大請求,顯然是可以優化性能的。但在協程環境下,先發請求是有能力偵測到後發請求的,請求的優化變得沒有任何意義。

在我的筆記本上跑,可以做到寫4千,讀1萬。這個成績簡單看上去很一般,甚至有點差。但Profile後,發現瓶頸在於Python自身的緩慢,整個程序只有5%的時間花在IO上,其餘都是Python自己和自己較勁了。而且,這是純讀寫測試。真實生產環境下,讀寫的間隙,肯定會有別的事情做,非同步IO的優勢才發揮出來。

目前,這是最快的純Python資料庫實現。


推薦閱讀:

插入排序insertion sort
重建二叉樹
正則表達式匹配
偽·從零開始學演算法 - 1.2 演算法的歷史
演算法:2. Add Two Numbers

TAG:Python | 資料庫 | 演算法 |