1. 程式人生 > 實用技巧 >aredis — 一款高效的非同步 redis 客戶端

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