Redis是一個基於記憶體的高效的鍵值型非關係型資料庫,存取效率極高,而且支援多種儲存資料結構,使用也非常簡單。本節中,我們就來介紹一下Python的Redis操作,主要介紹RedisPy這個庫的用法。
1. 準備工作
在開始之前,請確保已經安裝好了Redis及RedisPy庫。如果要做資料匯入/匯出操作的話,還需要安裝RedisDump。如果沒有安裝,可以參考第1章。
2. Redis和StrictRedis
RedisPy庫提供兩個類Redis
和StrictRedis
來實現Redis的命令操作。
StrictRedis
實現了絕大部分官方的命令,引數也一一對應,比如set()
方法就對應Redis命令的set
方法。而Redis
是StrictRedis
的子類,它的主要功能是用於向後相容舊版本庫裡的幾個方法。為了做相容,它將方法做了改寫,比如lrem()
方法就將value
和num
引數的位置互換,這和Redis命令列的命令引數不一致。
官方推薦使用StrictRedis
,所以本節中我們也用StrictRedis類
的相關方法作演示。
3. 連線Redis
現在我們已經在本地安裝了Redis並執行在6379埠,密碼設定為foobared。那麼,可以用如下示例連線Redis並測試:
1
2
3
4
5
|
from redis import StrictRedis
redis = StrictRedis(host=`localhost`, port=6379, db=0, password=`foobared`)
redis.set(`name`, `Bob`)
print(redis.get(`name`))
|
這裡我們傳入了Redis的地址、執行埠、使用的資料庫和密碼資訊。在預設不傳的情況下,這4個引數分別為localhost
、6379
、0
和None
。首先宣告瞭一個StrictRedis
物件,接下來呼叫set()
方法,設定一個鍵值對,然後將其獲取並列印。
執行結果如下:
1
|
b`Bob`
|
這說明我們連線成功,並可以執行set()
和get()
操作了。
當然,我們還可以使用ConnectionPool
來連線,示例如下:
1
2
3
4
|
from redis import StrictRedis, ConnectionPool
pool = ConnectionPool(host=`localhost`, port=6379, db=0, password=`foobared`)
redis = StrictRedis(connection_pool=pool)
|
這樣的連線效果是一樣的。觀察原始碼可以發現,StrictRedis
內其實就是用host
和port
等引數又構造了一個ConnectionPool
,所以直接將ConnectionPool
當作引數傳給StrictRedis
也一樣。
另外,ConnectionPool
還支援通過URL來構建。URL的格式支援有如下3種:
1
2
3
|
redis://[:password]@host:port/db
rediss://[:password]@host:port/db
unix://[:password]@/path/to/socket.sock?db=db
|
這3種URL分別表示建立Redis TCP連線、Redis TCP+SSL連線、Redis UNIX socket連線。我們只需要構造上面任意一種URL即可,其中password
部分如果有則可以寫,沒有則可以省略。下面再用URL連線演示一下:
1
2
3
|
url = `redis://:foobared@localhost:6379/0`
pool = ConnectionPool.from_url(url)
redis = StrictRedis(connection_pool=pool)
|
這裡我們使用第一種連線字串進行連線。首先,宣告一個Redis連線字串,然後呼叫from_url()
方法建立ConnectionPool
,接著將其傳給StrictRedis
即可完成連線,所以使用URL的連線方式還是比較方便的。
4. 鍵操作
表5-5總結了鍵的一些判斷和操作方法。
表5-5 鍵的一些判斷和操作方法
方法 |
作用 |
引數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
判斷一個鍵是否存在 |
|
|
是否存在 |
|
|
刪除一個鍵 |
|
|
刪除 |
1 |
|
判斷鍵型別 |
|
|
判斷 |
|
|
獲取所有符合規則的鍵 |
|
|
獲取所有以 |
|
|
獲取隨機的一個鍵 |
|
獲取隨機的一個鍵 |
|
|
|
重新命名鍵 |
|
|
將 |
|
|
獲取當前資料庫中鍵的數目 |
|
獲取當前資料庫中鍵的數目 |
100 |
|
|
設定鍵的過期時間,單位為秒 |
|
|
將 |
|
|
獲取鍵的過期時間,單位為秒,-1表示永久不過期 |
|
|
獲取 |
-1 |
|
將鍵移動到其他資料庫 |
|
|
將 |
|
|
刪除當前選擇資料庫中的所有鍵 |
|
刪除當前選擇資料庫中的所有鍵 |
|
|
|
刪除所有資料庫中的所有鍵 |
|
刪除所有資料庫中的所有鍵 |
|
5. 字串操作
Redis支援最基本的鍵值對形式儲存,用法總結如表5-6所示。
表5-6 鍵值對形式儲存
方法 |
作用 |
引數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
給資料庫中鍵為 |
|
|
給 |
|
|
返回資料庫中鍵為 |
|
|
返回 |
|
|
給資料庫中鍵為 |
|
|
賦值 |
|
|
返回多個鍵對應的 |
|
|
返回 |
|
|
如果不存在這個鍵值對,則更新 |
|
|
如果 |
第一次執行結果是 |
|
設定可以對應的值為 |
|
|
將 |
|
|
設定指定鍵的 |
|
|
設定 |
11,修改後的字串長度 |
|
批量賦值 |
|
|
將 |
|
|
鍵均不存在時才批量賦值 |
|
|
在 |
|
|
鍵為 |
|
|
|
1,即修改後的值 |
|
鍵為 |
|
|
|
-1,即修改後的值 |
|
鍵為 |
|
|
向鍵為 |
13,即修改後的字串長度 |
|
返回鍵為 |
|
|
返回鍵為 |
|
|
獲取鍵的 |
|
|
返回鍵為 |
|
6. 列表操作
Redis還提供了列表儲存,列表內的元素可以重複,而且可以從兩端儲存,用法如表5-7所示。
表5-7 列表操作
方法 |
作用 |
引數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
在鍵為 |
|
|
向鍵為 |
3,列表大小 |
|
在鍵為 |
|
|
向鍵為 |
4,列表大小 |
|
返回鍵為 |
|
|
返回鍵為 |
4 |
|
返回鍵為 |
|
|
返回起始索引為1終止索引為3的索引範圍對應的列表 |
|
|
擷取鍵為 |
|
|
保留鍵為 |
|
|
返回鍵為 |
|
|
返回鍵為 |
b’2′ |
|
給鍵為 |
|
|
將鍵為 |
|
|
刪除 |
|
|
將鍵為 |
1,即刪除的個數 |
|
返回並刪除鍵為 |
|
|
返回並刪除名為 |
|
|
返回並刪除鍵為 |
|
|
返回並刪除名為 |
|
|
返回並刪除名稱在 |
|
|
返回並刪除鍵為 |
|
|
返回並刪除鍵為 |
|
|
返回並刪除名為 |
|
|
返回並刪除名稱為 |
|
|
將鍵為 |
|
7. 集合操作
Redis還提供了集合儲存,集合中的元素都是不重複的,用法如表5-8所示。
表5-8 集合操作
方法 |
作用 |
引數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
向鍵為 |
|
|
向鍵為 |
3,即插入的資料個數 |
|
從鍵為 |
|
|
從鍵為 |
1,即刪除的資料個數 |
|
隨機返回並刪除鍵為 |
|
|
從鍵為 |
|
|
從 |
|
|
從鍵為 |
|
|
返回鍵為 |
|
|
獲取鍵為 |
3 |
|
測試 |
|
|
判斷 |
|
|
返回所有給定鍵的集合的交集 |
|
|
返回鍵為 |
|
|
求交集並將交集儲存到 |
|
|
求鍵為 |
1 |
|
返回所有給定鍵的集合的並集 |
|
|
返回鍵為 |
|
|
求並集並將並集儲存到 |
|
|
求鍵為 |
3 |
|
返回所有給定鍵的集合的差集 |
|
|
返回鍵為 |
|
|
求差集並將差集儲存到 |
|
|
求鍵為tags |
3 |
|
返回鍵為 |
|
|
返回鍵為 |
|
|
隨機返回鍵為 |
|
|
隨機返回鍵為 |
8. 有序集合操作
有序集合比集合多了一個分數字段,利用它可以對集合中的資料進行排序,其用法總結如表5-9所示。
表5-9 有序集合操作
方法 |
作用 |
引數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
向鍵為 |
|
|
向鍵為 |
2,即新增的元素個數 |
|
刪除鍵為 |
|
|
從鍵為 |
1,即刪除的元素個數 |
|
如果在鍵為 |
|
|
鍵為 |
98.0,即修改後的值 |
|
返回鍵為 |
|
|
得到鍵為 |
1 |
|
返回鍵為 |
|
|
得到鍵為 |
2 |
|
返回鍵為 |
|
|
返回鍵為 |
|
|
返回鍵為 |
|
|
返回鍵為 |
|
|
返回鍵為 |
|
|
返回鍵為 |
2 |
|
返回鍵為 |
|
|
獲取鍵為 |
3 |
|
刪除鍵為 |
|
|
刪除鍵為 |
1,即刪除的元素個數 |
|
刪除鍵為 |
|
|
刪除 |
1,即刪除的元素個數 |
9. 雜湊操作
Redis還提供了雜湊表的資料結構,我們可以用name
指定一個雜湊表的名稱,表記憶體儲了各個鍵值對,用法總結如表5-10所示。
表5-10 雜湊操作
方法 |
作用 |
引數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
向鍵為 |
|
|
向鍵為 |
1,即新增的對映個數 |
|
如果對映鍵名不存在,則向鍵為 |
|
|
向鍵為 |
1,即新增的對映個數 |
|
返回鍵為 |
|
|
獲取鍵為 |
5 |
|
返回鍵為 |
|
|
獲取鍵為 |
|
|
向鍵為 |
|
|
向鍵為 |
|
|
將鍵為 |
|
|
|
6,修改後的值 |
|
鍵為 |
|
|
鍵為 |
|
|
在鍵為 |
|
|
從鍵為 |
|
|
從鍵為 |
|
|
從鍵為 |
6 |
|
從鍵為 |
|
|
從鍵為 |
|
|
從鍵為 |
|
|
從鍵為 |
|
|
從鍵為 |
|
|
從鍵為 |
|
10. RedisDump
RedisDump提供了強大的Redis資料的匯入和匯出功能,現在就來看下它的具體用法。
首先,確保已經安裝好了RedisDump。
RedisDump提供了兩個可執行命令:redis-dump
用於匯出資料,redis-load
用於匯入資料。
redis-dump
首先,可以輸入如下命令檢視所有可選項:
1
|
redis-dump -h
|
執行結果如下:
Usage: redis-dump [global options] COMMAND [command options] -u, --uri=S Redis URI (e.g. redis://hostname[:port]) -d, --database=S Redis database (e.g. -d 15) -s, --sleep=S Sleep for S seconds after dumping (for debugging) -c, --count=S Chunk size (default: 10000) -f, --filter=S Filter selected keys (passed directly to redis` KEYS command) -O, --without_optimizations Disable run time optimizations -V, --version Display version -D, --debug --nosafe複製程式碼
其中-u
代表Redis連線字串,-d
代表資料庫代號,-s
代表匯出之後的休眠時間,-c
代表分塊大小,預設是10000,-f
代表匯出時的過濾器,-O
代表禁用執行時優化,-V
用於顯示版本,-D
表示開啟除錯。
我們拿本地的Redis做測試,執行在6379埠上,密碼為foobared,匯出命令如下:
1
|
redis-dump -u :foobared@localhost:6379
|
如果沒有密碼的話,可以不加密碼字首,命令如下:
1
|
redis-dump -u localhost:6379
|
執行之後,可以將本地0至15號資料庫的所有資料輸出出來,例如:
1
2
3
4
5
6
7
8
|
{“db”:0,”key”:”name”,”ttl”:-1,”type”:”string”,”value”:”James”,”size”:5}
{“db”:0,”key”:”name2″,”ttl”:-1,”type”:”string”,”value”:”Durant”,”size”:6}
{“db”:0,”key”:”name3″,”ttl”:-1,”type”:”string”,”value”:”Durant”,”size”:6}
{“db”:0,”key”:”name4″,”ttl”:-1,”type”:”string”,”value”:”HelloWorld”,”size”:10}
{“db”:0,”key”:”name5″,”ttl”:-1,”type”:”string”,”value”:”James”,”size”:5}
{“db”:0,”key”:”name6″,”ttl”:-1,”type”:”string”,”value”:”James”,”size”:5}
{“db”:0,”key”:”age”,”ttl”:-1,”type”:”string”,”value”:”1″,”size”:1}
{“db”:0,”key”:”age2″,”ttl”:-1,”type”:”string”,”value”:”-5″,”size”:2}
|
每條資料都包含6個欄位,其中db
即資料庫代號,key
即鍵名,ttl
即該鍵值對的有效時間,type
即鍵值型別,value
即內容,size
即佔用空間。
如果想要將其輸出為JSON行檔案,可以使用如下命令:
1
|
redis-dump -u :foobared@localhost:6379 > ./redis_data.jl
|
這樣就可以成功將Redis的所有資料庫的所有資料匯出成JSON行檔案了。
另外,可以使用-d
引數指定某個資料庫的匯出,例如只匯出1號資料庫的內容:
1
|
redis-dump -u :foobared@localhost:6379 -d 1 > ./redis.data.jl
|
如果只想匯出特定的內容,比如想匯出以adsl
開頭的資料,可以加入-f
引數用來過濾,命令如下:
1
|
redis-dump -u :foobared@localhost:6379 -f adsl:* > ./redis.data.jl
|
其中-f
引數即Redis的keys
命令的引數,可以寫一些過濾規則。
redis-load
同樣,我們可以首先輸入如下命令檢視所有可選項:
1
|
redis-load -h
|
執行結果如下:
redis-load --help Try: redis-load [global options] COMMAND [command options] -u, --uri=S Redis URI (e.g. redis://hostname[:port]) -d, --database=S Redis database (e.g. -d 15) -s, --sleep=S Sleep for S seconds after dumping (for debugging) -n, --no_check_utf8 -V, --version Display version -D, --debug --nosafe複製程式碼
其中-u
代表Redis連線字串,-d
代表資料庫代號,預設是全部,-s
代表匯出之後的休眠時間,-n
代表不檢測UTF-8編碼,-V
表示顯示版本,-D
表示開啟除錯。
我們可以將JSON行檔案匯入到Redis資料庫中:
1
|
< redis_data.json redis-load -u :foobared@localhost:6379
|
這樣就可以成功將JSON行檔案匯入到資料庫中了。
另外,下面的命令同樣可以達到同樣的效果:
1
|
cat redis_data.json | redis-load -u :foobared@localhost:6379
|
本節中,我們不僅瞭解了RedisPy對Redis資料庫的一些基本操作,還演示了RedisDump對資料的匯入匯出操作。由於其便捷性和高效性,後面我們會利用Redis實現很多架構,如維護代理池、Cookies池、ADSL撥號代理池、Scrapy-Redis分散式架構等,所以Redis的操作需要好好掌握。
本資源首發於崔慶才的個人部落格靜覓: Python3網路爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注我的個人微信公眾號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)