本文環境: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 StrictRedisClusterTraceback (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, basestringImportError: 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26255.html
標籤:NoSQL
上一篇:redis學習
下一篇:Redis 高可用之"持久化"
