本文環境:centos 7,Python3編譯安裝成功,包括pip3,然後需要安裝redis相關的Python3驅動包,本的redis指redis包而非redis資料庫,rediscluster類似。 先理清楚幾個概念1,redis包更準確地說是redis-py包,是Python連接Redis的驅動 ...
本文環境:centos 7,Python3編譯安裝成功,包括pip3,然後需要安裝redis相關的Python3驅動包,本的redis指redis包而非redis資料庫,rediscluster類似。
先理清楚幾個概念
1,redis包更準確地說是redis-py包,是Python連接Redis的驅動文件,如果下載原始文件的話,文件名稱就是redis-py-***.tar.gz
2,rediscluster 包更準確地說是redis-py-cluster包,是Python連接Redis Cluster(Redis集群)的驅動文件
3,rediscluster包依賴於redis包,也就是說rediscluster包連接Redis集群的時候需要依賴redis包
4,這兩個表可以單獨pip(pip3)安裝,但是安裝rediscluster包的時候redis包會被自動安裝
這是三者之間的關係,其實不太繞,但是名字非常操蛋!!!再加上pip安裝造成的一系列問題,就更操蛋了(可能跟具體的yum源有關,某些yum源就沒有問題)。
這裡EC2是京東提供的伺服器,預設使用的京東雲的yum源
槽點1
糟糕的命名規則,很早就想吐槽了,為什麼Python的MySQL驅動包名是pymysql,Python的SQL Server驅動是pymssql,而Python的redis驅動名稱是redis(不更應該叫pyredis麽)。
而redis這個驅動又不支持集群的鏈接,支持集群連接的驅動包名是rediscluster,這樣很容易給人以誤解,為什麼不像其他包一樣加上一個py首碼,pyredis,pyredisclsuter,這樣是不是不會清晰很多。
槽點2
pip安裝redis-py-cluster,會自動安裝最新版的redis-py-cluster 2.0.0,同時會自動安裝其依賴的redis(redis-py)驅動包,redis(redis-py)包的版本是最新的3.0.1
問題是,這樣自動安裝完成後,壓根用不了
from rediscluster import StrictRedisCluster會提示錯誤,如上:File "<stdin>", line 1, in <module> ImportError: cannot import name 'StrictRedisCluster'
然後通過源碼包觀察setup.py中的依賴信息,似乎也沒有問題,要求redis驅動的版本是3.0.0~3.1.0,也似乎沒有問題,可惜就是無法正常導包。https://github.com/Grokzen/redis-py-cluster/releases這裡是源碼包的地址
槽點3
那麼就卸載redis-cluster-py(沒有卸載redis驅動是一個更大的槽點),重新安裝其他版本的redis-py-cluster(這裡筆者下載的是redis-py-cluster-1.3.5)
通過這裡https://github.com/Grokzen/redis-py-cluster/releases下載較低版本的安裝包,自行安裝,隱約記得之前是1.3.5版本的,這裡下載的是redis-py-cluster 1.3.5
tar xf redis-py-cluster-1.3.5.tar.gz
cd redis-py-cluster-1.3.5
python3 setup.py install
他這裡命名告訴best match:redis 3.0.1,
然後再次嘗試導包from rediscluster import StrictRedisCluster,仍舊會出現如下錯誤。
>>> from rediscluster import StrictRedisCluster Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/redis-py-cluster-1.3.5/rediscluster/__init__.py", line 7, in <module> from .client import StrictRedisCluster, RedisCluster File "/usr/local/redis-py-cluster-1.3.5/rediscluster/client.py", line 10, in <module> from .connection import ( File "/usr/local/redis-py-cluster-1.3.5/rediscluster/connection.py", line 11, in <module> from .nodemanager import NodeManager File "/usr/local/redis-py-cluster-1.3.5/rediscluster/nodemanager.py", line 12, in <module> from redis._compat import b, unicode, bytes, long, basestring ImportError: cannot import name 'b' >>>
還是是redis-py和redis-py-cluster版本不相容的問題,然後繼續,嘗試卸載redis-3.0.1,重新pip安裝redis最新版(redis-3.3.11),仍舊報錯。
無奈再次卸載redis 3.3.11包,安裝redis 2.10.6包
終於……
槽點4
後續進過嘗試,redis-py-cluster-1.3.5的在安裝的時候,仍舊會找到最新的redis版本,結果就是因為redis-py-cluster和redis版本相容問題,仍舊無法正常導包
所以想要使用redis-py-cluster-1.3.5,需要提前先安裝好redis 2.10.6,不要讓redis-py-cluster-1.3.5自行安裝一個不相容的redis(redis-py)包
單獨安裝redis-py-cluster-1.3.5又會自動安裝redis-3*版本的包,結果導包的時候還是會出錯。
後續經過嘗試,只有redis-py-cluster-1.3.6的在安裝的時候(沒有提前安裝任何redis包),會自動安裝對應的redis版本(redis-2.10.6)
總結:
1,結論先行的話就是:不要使用直接pip自動安裝redis,redis-py-cluster這兩個包,也不要直接pip單獨安裝redis-py-cluster,自動安裝的兩個包因為版本衝突無法正常使用。
2,1)可以下載指定的redis-py包(redis-py-2.10.6),redis-py-cluster(redis-py-cluster-1.3.5.tar.gz)包,分別手動安裝。
2)也可以單獨下載的redis-py-cluster 1.3.6安裝,安裝是可以成功下載其依賴的redis包的正確的版本。
3,最新版的redis驅動包是不支持redis-py-cluster的,包括使用pip自動安裝(升級)redis,redis-py-cluster,出來之後是無法導包成功的(from rediscluster import StrictRedisCluster )。
4,對於redis,redis-py-cluster,最好最好最好手動下載對應版本的包,手動安裝。
5,Python的Redis包括Redis集群連接驅動包的命名真的很蛋疼。
https://github.com/Grokzen/redis-py-cluster
https://github.com/andymccurdy/redis-py
https://www.cnblogs.com/theboy/p/10690838.html
https://www.cnblogs.com/smileyes/p/9971240.html
https://blog.csdn.net/u010953692/article/details/100062261