python與redis的初次碰撞——把玩redis資料庫的一點心得

Redis是最近幾年NoSQL(非關係型資料庫)中最異軍突起的一位了,在很多大小公司的業務中起了很大的作用。Redis是鍵值形式的存儲系統,跟mongodb的存儲方式有些類似(感覺NoSQL似乎都有這個共性?)。Redis主要運行於內存中,因此具有天生的極速性,官方測試速度是8-10萬次/秒的讀寫速度(set/get)。跟MySQL、MongoDB相比,語法更親和,沒有複雜繞口的單詞、大括弧、中括弧、小括弧、%#&^$,沒有各種跨表查詢等等,簡直不能更贊。這兩天自己把玩了一下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進程了:

此外,最有可能碰到的錯誤,就是cmd中顯示:redis.exceptions.ConnectionError: Error 10061 connecting to 10.40.0.124:6379. 由於目標計算機積極拒絕,無法連接。

這個問題產生的原因有很多種,但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的初級和中級愛好者。更新頻率不會太高,絕不推送廣告。有我在,成長的路上不會孤單!

推薦閱讀:

TAG:编程 | Python | Redis |