1. 程式人生 > 資料庫 >令人抓狂的redis和rediscluster Python驅動包的安裝

令人抓狂的redis和rediscluster Python驅動包的安裝

本文環境: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,也似乎沒有問題,可惜就是無法正常導包。這裡是原始碼包的地址

 

槽點3

那麼就解除安裝redis-cluster-py(沒有解除安裝redis驅動是一個更大的槽點),重新安裝其他版本的redis-py-cluster(這裡筆者下載的是redis-py-cluster-1.3.5)

通過這裡下載較低版本的安裝包,自行安裝,隱約記得之前是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://www.cnblogs.com/theboy/p/10690838.html