Redis是一個基於內存的高效的鍵值型非關係型數據庫,存取效率極高,並且支持多種存儲數據結構,使用也很是簡單。本節中,咱們就來介紹一下Python的Redis操做,主要介紹RedisPy這個庫的用法。html
在開始以前,請確保已經安裝好了Redis及RedisPy庫。若是要作數據導入/導出操做的話,還須要安裝RedisDump。若是沒有安裝,能夠參考第1章。redis
RedisPy庫提供兩個類Redis
和StrictRedis
來實現Redis的命令操做。數據庫
StrictRedis
實現了絕大部分官方的命令,參數也一一對應,好比set()
方法就對應Redis命令的set
方法。而Redis
是StrictRedis
的子類,它的主要功能是用於向後兼容舊版本庫裏的幾個方法。爲了作兼容,它將方法作了改寫,好比lrem()
方法就將value
和num
參數的位置互換,這和Redis命令行的命令參數不一致。json
官方推薦使用StrictRedis
,因此本節中咱們也用StrictRedis類
的相關方法做演示。bash
如今咱們已經在本地安裝了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
來鏈接,示例以下:app
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的鏈接方式仍是比較方便的。
表5-5總結了鍵的一些判斷和操做方法。
表5-5 鍵的一些判斷和操做方法
方法 |
做用 |
參數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
判斷一個鍵是否存在 |
|
|
是否存在 |
|
|
刪除一個鍵 |
|
|
刪除 |
1 |
|
判斷鍵類型 |
|
|
判斷 |
|
|
獲取全部符合規則的鍵 |
|
|
獲取全部以 |
|
|
獲取隨機的一個鍵 |
|
獲取隨機的一個鍵 |
|
|
|
重命名鍵 |
|
|
將 |
|
|
獲取當前數據庫中鍵的數目 |
|
獲取當前數據庫中鍵的數目 |
100 |
|
|
設定鍵的過時時間,單位爲秒 |
|
|
將 |
|
|
獲取鍵的過時時間,單位爲秒,-1表示永久不過時 |
|
|
獲取 |
-1 |
|
將鍵移動到其餘數據庫 |
|
|
將 |
|
|
刪除當前選擇數據庫中的全部鍵 |
|
刪除當前選擇數據庫中的全部鍵 |
|
|
|
刪除全部數據庫中的全部鍵 |
|
刪除全部數據庫中的全部鍵 |
|
Redis支持最基本的鍵值對形式存儲,用法總結如表5-6所示。
表5-6 鍵值對形式存儲
方法 |
做用 |
參數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
給數據庫中鍵爲 |
|
|
給 |
|
|
返回數據庫中鍵爲 |
|
|
返回 |
|
|
給數據庫中鍵爲 |
|
|
賦值 |
|
|
返回多個鍵對應的 |
|
|
返回 |
|
|
若是不存在這個鍵值對,則更新 |
|
|
若是 |
第一次運行結果是 |
|
設置能夠對應的值爲 |
|
|
將 |
|
|
設置指定鍵的 |
|
|
設置 |
11,修改後的字符串長度 |
|
批量賦值 |
|
|
將 |
|
|
鍵均不存在時才批量賦值 |
|
|
在 |
|
|
鍵爲 |
|
|
|
1,即修改後的值 |
|
鍵爲 |
|
|
|
-1,即修改後的值 |
|
鍵爲 |
|
|
向鍵爲 |
13,即修改後的字符串長度 |
|
返回鍵爲 |
|
|
返回鍵爲 |
|
|
獲取鍵的 |
|
|
返回鍵爲 |
|
Redis還提供了列表存儲,列表內的元素能夠重複,並且能夠從兩端存儲,用法如表5-7所示。
表5-7 列表操做
方法 |
做用 |
參數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
在鍵爲 |
|
|
向鍵爲 |
3,列表大小 |
|
在鍵爲 |
|
|
向鍵爲 |
4,列表大小 |
|
返回鍵爲 |
|
|
返回鍵爲 |
4 |
|
返回鍵爲 |
|
|
返回起始索引爲1終止索引爲3的索引範圍對應的列表 |
|
|
截取鍵爲 |
|
|
保留鍵爲 |
|
|
返回鍵爲 |
|
|
返回鍵爲 |
b’2′ |
|
給鍵爲 |
|
|
將鍵爲 |
|
|
刪除 |
|
|
將鍵爲 |
1,即刪除的個數 |
|
返回並刪除鍵爲 |
|
|
返回並刪除名爲 |
|
|
返回並刪除鍵爲 |
|
|
返回並刪除名爲 |
|
|
返回並刪除名稱在 |
|
|
返回並刪除鍵爲 |
|
|
返回並刪除鍵爲 |
|
|
返回並刪除名爲 |
|
|
返回並刪除名稱爲 |
|
|
將鍵爲 |
|
Redis還提供了集合存儲,集合中的元素都是不重複的,用法如表5-8所示。
表5-8 集合操做
方法 |
做用 |
參數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
向鍵爲 |
|
|
向鍵爲 |
3,即插入的數據個數 |
|
從鍵爲 |
|
|
從鍵爲 |
1,即刪除的數據個數 |
|
隨機返回並刪除鍵爲 |
|
|
從鍵爲 |
|
|
從 |
|
|
從鍵爲 |
|
|
返回鍵爲 |
|
|
獲取鍵爲 |
3 |
|
測試 |
|
|
判斷 |
|
|
返回全部給定鍵的集合的交集 |
|
|
返回鍵爲 |
|
|
求交集並將交集保存到 |
|
|
求鍵爲 |
1 |
|
返回全部給定鍵的集合的並集 |
|
|
返回鍵爲 |
|
|
求並集並將並集保存到 |
|
|
求鍵爲 |
3 |
|
返回全部給定鍵的集合的差集 |
|
|
返回鍵爲 |
|
|
求差集並將差集保存到 |
|
|
求鍵爲tags |
3 |
|
返回鍵爲 |
|
|
返回鍵爲 |
|
|
隨機返回鍵爲 |
|
|
隨機返回鍵爲 |
有序集合比集合多了一個分數字段,利用它能夠對集合中的數據進行排序,其用法總結如表5-9所示。
表5-9 有序集合操做
方法 |
做用 |
參數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
向鍵爲 |
|
|
向鍵爲 |
2,即添加的元素個數 |
|
刪除鍵爲 |
|
|
從鍵爲 |
1,即刪除的元素個數 |
|
若是在鍵爲 |
|
|
鍵爲 |
98.0,即修改後的值 |
|
返回鍵爲 |
|
|
獲得鍵爲 |
1 |
|
返回鍵爲 |
|
|
獲得鍵爲 |
2 |
|
返回鍵爲 |
|
|
返回鍵爲 |
|
|
返回鍵爲 |
|
|
返回鍵爲 |
|
|
返回鍵爲 |
|
|
返回鍵爲 |
2 |
|
返回鍵爲 |
|
|
獲取鍵爲 |
3 |
|
刪除鍵爲 |
|
|
刪除鍵爲 |
1,即刪除的元素個數 |
|
刪除鍵爲 |
|
|
刪除 |
1,即刪除的元素個數 |
Redis還提供了散列表的數據結構,咱們能夠用name
指定一個散列表的名稱,表內存儲了各個鍵值對,用法總結如表5-10所示。
表5-10 散列操做
方法 |
做用 |
參數說明 |
示例 |
示例說明 |
示例結果 |
---|---|---|---|---|---|
|
向鍵爲 |
|
|
向鍵爲 |
1,即添加的映射個數 |
|
若是映射鍵名不存在,則向鍵爲 |
|
|
向鍵爲 |
1,即添加的映射個數 |
|
返回鍵爲 |
|
|
獲取鍵爲 |
5 |
|
返回鍵爲 |
|
|
獲取鍵爲 |
|
|
向鍵爲 |
|
|
向鍵爲 |
|
|
將鍵爲 |
|
|
|
6,修改後的值 |
|
鍵爲 |
|
|
鍵爲 |
|
|
在鍵爲 |
|
|
從鍵爲 |
|
|
從鍵爲 |
|
|
從鍵爲 |
6 |
|
從鍵爲 |
|
|
從鍵爲 |
|
|
從鍵爲 |
|
|
從鍵爲 |
|
|
從鍵爲 |
|
|
從鍵爲 |
|
RedisDump提供了強大的Redis數據的導入和導出功能,如今就來看下它的具體用法。
首先,確保已經安裝好了RedisDump。
RedisDump提供了兩個可執行命令:redis-dump
用於導出數據,redis-load
用於導入數據。
首先,能夠輸入以下命令查看全部可選項:
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
命令的參數,能夠寫一些過濾規則。
一樣,咱們能夠首先輸入以下命令查看全部可選項:
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… (二維碼自動識別)