python與redis的初次碰撞——把玩redis資料庫的一點心得
運行環境:
win10 x64
Pycharm 2017.1
anaconda 4.3.1
Python 3.5.3:需要注意一下,這裡不能用3.6.X版本,因為後面的redis-py模塊還沒有支持這個版本,會報錯。截至2017.4.17,redis-py只支持到python 2.7.X和3.5.X。讓我們期待模塊作者的更新吧;
redis-py 2.10.5模塊:連接redis資料庫和python的橋樑,這種橋樑有很多,但是這個模塊是最常用的一個;
redis 3.2.8:目前穩定版就是3.2.8,最新的4.0版本已發布,添加了更多的高級功能,但是似乎穩定性是個問題;
vmware workstation pro 12.5.5:運行在windows和mac下的虛擬機軟體,號稱「最好用的」虛擬機。類似的軟體還有virtualbox,我用的比較少,主要的測試環境還是習慣在vmware下進行。該軟體的功能是在windows、mac系統下創建windows、linux等沙箱環境,便於開發者完成測試工作。
CentOS 6.9:CentOS是linux系統中應用範圍最廣的系統,在阿里雲、騰訊雲、百度雲中都可以看到。當然了,其他的CentOS版本也是可以的,我在CentOS6.5、6.7中都測試過,完全沒問題(因為這個測試完全接觸不到這幾個系統的核心,所以無所謂啦)。
接下來開始一步一步地開始教程吧。首先是安裝vmware,這個不多說,大家自己去官網下載即可。然後是安裝centos,大家可以參考這裡:
在虛擬機中安裝CentOS7_百度經驗
我這裡使用的是centos 6.9,下載地址是:centos 6.9。目前國內有非常多的開源鏡像站,如果這個下載速度不佳,大家可以嘗試其他下載地址,可以自行百度:開源鏡像站即可。
在虛擬機中安裝好centos以後,開始準備折騰redis了。為什麼非要搭建個linux環境,用windows就不能好好玩耍redis了?答案是可以,但是你在windows本體上安裝redis,後期會遇到更多的坑。這裡就不可避免的聊到redis的作者了,他認為windows本身的封閉和api調用的複雜性太大,如果為了適配windows,必然花費大量的時間。而redis本身是追求高速、自由、簡單的,這麼做也跟redis的精神不符。所以作者很傲氣地拒絕開發適配windows的redis,堅持在linux上進行開發。
如果你非要在windows上使用redis,辦法不是沒有,你可以看看這裡:MSOpenTech/redis。這裡是redis的分支,功能基本與redis保持一致,是由windows團隊開發的。但是據說問題也不少,而且版本更新也追不上原作者。
接下來是安裝redis。在centos中安裝還是比較簡單的,在終端中執行以下命令即可:
wget http://download.redis.io/releases/redis-3.2.8.tar.gzn#下載安裝包ntar xzf redis-3.2.8.tar.gzn#解壓ncd redis-3.2.8n#進入解壓後的默認目錄nmaken#執行安裝程序n
因為這裡的centos系統是自帶圖形化桌面的,所以可以直接打開redis-3.2.8文件夾,修改一下redis.conf文件,才能在外網訪問虛擬機的redis資料庫。簡單說明一下,redis.conf是redis的配置文件。需要修改的地方有以下幾處:
1.將所有的bind信息全部屏蔽(注釋掉)。這裡的bind是指綁定本機ip,默認情況下redis是只允許本機訪問的,也是為了安全起見。修改後如下:(我嘗試過了,如果不注釋掉bind功能,redis就無法通過外網連接,只能在本機上運行)
2.修改防火牆,這裡有2個辦法,一個是開放redis的6379埠,另一個就是省事地關閉防火牆,我選了後者。在虛擬機中選擇系統→管理→防火牆,直接關閉即可(這裡需要root密碼)。3.開啟守護進程,讓redis可以在後台運行。方法是將deamonize no改成deamonize yes。
4.關閉redis的保護模式(protected-mode)。這裡的保護模式是指是否允許其他ip的設備訪問redis。如果開啟的話,就是只允許本機進行訪問了。所以要將protected-mode改成no。請注意,這裡是測試環境,所以可以關閉保護模式。如果用於生產開發,請務必開啟保護模式,這是redis提供的一種自我保護機制!(評論區有愛挑刺的小夥伴,所以這裡提示一下)
5.設置redis資料庫的密碼。如果只是linux本機調試,可以跳過這一步。但是如果要開放外網訪問redis,就必須給redis添加密碼。好像這是redis近期版本的更新內容,因為redis作者認為開放了所有的外網許可權但是不添加密碼,這樣的資料庫無疑就是活靶子,所以強制添加密碼,否則在外網訪問時會發生「伺服器積極拒絕」的錯誤。我沒有測試過其他版本的redis,如果這個地方如果解釋的不對,懇請指出。方法是將requirepass取消注釋,添加上你的密碼,如下:再次重申,以上操作步驟均基於學習環境,正式的公司測試機、開發機請不要如此設置,這樣做相當於關閉了所有的安全機制,很容易發生被黑的後果!
經此五步,redis的配置文件修改完成。重新打開終端,接下來開啟redis的服務端:
cd redis-3.2.8n#進入redis目錄ncd srcn#進入src目錄,這是redis程序的主目錄之一n./redis-servern開啟redis服務端n
然後會顯示下圖的提示,出現The server is now ready to accept connections on port 6379,就說明服務端開啟成功啦。
如果你要在linux虛擬機上測試一下redis,可以開啟一個新的終端:cd redis-3.2.8ncd srcn./redis-clin
就開啟了redis的本機客戶端,最簡單的測試辦法就是輸入ping,如果客戶端返回pong,就說明程序正常運行。
接下來就是從外網連接進入虛擬機了。首先需要確定虛擬機redis的ip,這樣才好連接。重新開啟一個終端,輸入ifconfig(不是ipconfig!),獲取linux終端的ip地址如下:將ip記下來,客戶端就可以關掉了。接下來就是通過pycharm調用redis-py模塊,訪問redis了。
簡單說一下redis-py模塊。這個模塊的名稱是redis-py,但是在python中的導入名是import redis。目前支持到python 2.7.X和3.5.X。如果用python 3.6.X是會報錯的,我已經試過了。(2017.5.8修改:目前redis-py模塊可以「硬安裝」,就是直接把redis-py模塊文件夾複製到anaconda的lib里,經測試也可以正常使用,但是某些高級特性會不支持)因為我使用的是anaconda環境包,所以直接在pycharm的terminal中輸入安裝命令就可以了:
conda install -c conda-forge redis-py=2.10.5n
最後重啟一下虛擬機,在windows下的pycharm中測試跑一下:
import redisnnnr = redis.Redis(host=10.40.0.124,port=6379,db=0, password=123456)n#創建Redis類下的實例,4個參數分別是主機地址、埠、資料庫(redis默認有16個資料庫,第一的編號就是0)、redis剛才設置的連接密碼nr.set(a,1)n#最基本的命令,設置一個新的鍵值對,相當於python里的a=1nprint(r.get(a))n#獲取a鍵的值,相當於python的 print (a)n
運行結果,成功!到此,python和redis基本實現了無縫銜接!
在折騰redis時,可能會發生這樣的錯誤:Creating Server TCP listening socket *:6379: bind: Address already in use
說明服務端被不正確的關閉了,所以顯示6379埠佔用。這裡有兩個處理方法:
方法一:在客戶端上輸入shutdown命令,來關閉服務端。這樣做是最合適的,這時的服務端會自動處理、保存相關數據。
方法二:可以查找一下redis服務端的進程,然後殺掉該進程,就可以重新開啟服務端啦。還是說明一下,這是基於學習環境,不要用於生產環境。因為強制殺掉進程的話,會導致redis數據丟失。具體如下:
ps -e|grep redis
#關於這個命令的詳解,可以看這裡:linux命令大全——ps命令詳解。這裡的redis欄位是模糊查詢,查找redis服務端的進程,如果找到了,會返回埠信息
然後結束該進程就可以啦。輸入:kill -9 3534
就可以重新開啟redis服務端了。
如果又雙叕修改了redis的配置文件redis.conf怎麼辦?難道每修改一次就要重啟一次虛擬機?No,只需要重啟一下redis服務端即可。關閉redis服務端以後,重新打開終端:
cd redis-3.2.8ncd srcn#這是進入到redis-server的目錄中n./redis-server ../redis.confn#意思是運行當前目錄的服務端,參數值為上級目錄的redis.conf文件n
運行後如果正常是不會顯示任何內容的。那怎麼查看服務端是否開啟呢?還是之前的查進程命令:
ps -e|grep redisn
這時候就會顯示redis-server進程了:
這個問題產生的原因有很多種,但99%是以下的問題:
1.虛擬機防火牆沒有設置好:需要關閉,或者開放6379埠;
2.python中Redis類下的實例參數錯誤,比如host錯誤、db漏寫、password錯誤等,這個需要自行檢查;
3.虛擬機中的redis.conf沒有設置好:請按照之前的幾個設置方法再來一遍。
如此這般,redis也就算是會用了。
這一路走來,折騰了一兩天,才算是徹底弄明白虛擬機內外通信的基本原理,以及redis的運行方式,希望也能對大家有所幫助,謝謝!
我的專欄:Python程序員
我的其他文章:
Scrapy爬蟲框架入門教程(1)——爬取廖雪峰老師的博客
用python寫爬蟲,爬取清純妹子網站(requests/lxml)Python入門——針對零基礎學習者的資料推薦python與redis的初次碰撞——把玩redis資料庫的一點心得歡迎加QQ群:613081176,純技術交流,杜絕廣告、刷屏、機器人
點個贊再收藏呀,親!現在點贊1000+,收藏突破2000+,真有點無語哎!
歡迎關注微信訂閱號:python程序員之路介紹python最新的功能、模塊,詳解實用代碼。主要針對python的初級和中級愛好者。更新頻率不會太高,絕不推送廣告。有我在,成長的路上不會孤單!
推薦閱讀: