aredis — 一款高效的非同步 redis 客戶端
背景
aredis是一款由同步的 redis 客戶端redis-py改寫而成的高效的非同步 redis 客戶端,在最新的 1.0.7 版本中完成了對於 redis 叢集的支援。
改動
主要重寫了底部建立連線和讀取資料部分的程式碼,介面部分都向下相容,便於使用者從 redis-py 的同步程式碼遷移到 async 和 await 的協程版本,詳細文件請看aredis 文件
使用
安裝 pip install aredis
具體姿勢可以參閱專案文件和例子,介面向下相容 redis-py,支援 Python 3.5 及以上版本,在最新的 1.0.7 版本中也支援 redis cluster,並且對於 Python 3.6 還支援各個資料型別的 scan iter 操作。
一個簡單的例子如下所示:
>>> import aredis >>> import asyncio >>> r = aredis.StrictRedis(host='localhost', port=6379, db=0) >>> loop = asyncio.get_event_loop() >>> async def test(): >>> await r.set('foo', 'bar') >>> print(await r.get('foo')) >>> loop.run_until_complete(test()) b'bar'
優勢
使用了協程的非同步客戶端相較於同步客戶端來說由於使用了 Python 的事件迴圈等多餘程式碼,實際上執行效率是較低的,但是好處在於它不會阻塞你的 io,你可以在網路 io 進行的同時進行別的操作,aredis 比較適用於爬蟲、http 伺服器等密集網路 io 的操作,使得你的程式碼不用等上 redis 操作的時間。
而相比於現有的兩款支援 async/await 的 redis 客戶端來說:
aioredis:
aioredis 要求裝上 hiredis , 而 aredis 可以不需要相關依賴地執行,速度上兩者持平且都可以使用 hiredis 來作為 parser ,用 uvloop 代替 asyncio 的 eventloop 來加速
asyncio_redis:
asyncio_redis 使用了 Python 提供的 protocol 來進行非同步通訊,而 aredis 則使用 StreamReader 和 StreamWriter 來進行非同步通訊,在執行速度上兩倍於 asyncio_redis ,附上benchmark
而且以上兩款客戶端目前都還沒有對於叢集的支援,相對來說 aredis 的功能更為全面一些。
劣勢
現在對於編碼的支援還不是那麼完善,大部分命令還是用 bytes 型別作為返回值,且目前只支援 Python 3.5 及以上的版本
前排求 star 和 pr 0- 0
專案連結aredis