本文環境:centos 7,Python3編譯安裝成功,包括pip3,而後須要安裝redis相關的Python3驅動包,本的redis指redis包而非redis數據庫,rediscluster相似。html
先理清楚幾個概念
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源
node
槽點1python
糟糕的命名規則,很早就想吐槽了,爲何Python的MySQL驅動包名是pymysql,Python的SQL Server驅動是pymssql,而Python的redis驅動名稱是redis(不更應該叫pyredis麼)。
而redis這個驅動又不支持集羣的連接,支持集羣鏈接的驅動包名是rediscluster,這樣很容易給人以誤解,爲何不像其餘包同樣加上一個py前綴,pyredis,pyredisclsuter,這樣是否是不會清晰不少。
mysql
槽點2git
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這裏是源碼包的地址
github
槽點3redis
那麼就卸載redis-cluster-py(沒有卸載redis驅動是一個更大的槽點),從新安裝其餘版本的redis-py-cluster(這裏筆者下載的是redis-py-cluster-1.3.5)sql
經過這裏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),仍舊報錯。
centos
無奈再次卸載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
http://www.javashuo.com/article/p-ngswidvp-dy.htmlhttp://www.javashuo.com/article/p-bjjxavbb-ma.html
https://blog.csdn.net/u010953692/article/details/100062261