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

推薦閱讀:

200G的數據,主要是查詢操作,酷睿I5個人PC,應該選擇什麼資料庫來存儲?
redis是個單線程的程序,為什麼會這麼快呢?每秒10000?這個有點不解,具體是快在哪裡呢?EPOLL?內存?
Redis服務支持5000萬的QPS,有什麼好的思路?
如何評價360開源的pika項目?

TAG:Python | Python3x | Redis |