1. 程式人生 > 資料庫 >高效非同步redis客戶端aredis優劣勢原理解析

高效非同步redis客戶端aredis優劣勢原理解析

背景

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。