Redis 能夠說是 NoSQL (非關係型數據庫)中較爲流行的一種數據庫,雖然相較於 MongoDB , Redis 的檢索算法不夠全面,可是它的性能更好,對數據持久化的處理也較優。html
因此在創建數據庫時,也常常會用到 Redis ,並且通常用它和其餘數據庫相互組合使用。相較於 SQL , Redis 能夠很好地處理緩存類的部分,而且更易實現分佈式,從而提高服務器的訪問效率。python
Redis 的服務器文件咱們須要到它的官網上去下載:Redis.io 。redis
下載完成後,咱們解壓文件,而後打開控制檯,切換到解壓後的目錄下,而後輸入 make
指令,通過一段時間的安裝後, Redis 就安裝成功了。算法
安裝好了服務器以後,咱們須要安裝 python 的 redis 第三方模塊,來實現對 Redis 鏈接的支持。數據庫
$ pip install redis
首先咱們先以普通模式運行 Redis 數據庫,打開終端,能夠看到一個 Redis 的圖標。編程
$ redis-server
在調試完成後,咱們應該使用 conf 配置文件打開 Redis 服務器,否則會有安全性隱患。緩存
在 python 中,咱們能夠經過定義一個 Redis 對象來實現對 Redis 數據庫的鏈接。這裏咱們先使用 IDLE 的交互式編程模式來完成。安全
>>> import redis >>> database = redis.Redis()
只須要一個簡單的函數,咱們就能鏈接咱們的服務器了。bash
其中, Redis
這個函數其實還有可選參數:服務器
host 設置 Redis 服務器的 IP 位置,默認爲 localhost
port 設置 Redis 服務器的端口,默認爲 6379
db 設置使用的數據庫標號,默認爲 db=0
password 設置 Redis 服務器的密碼,若是沒有設置密碼就不用填
Redis 的操做很是簡單,最基礎的只有兩個函數, set()
和 get()
。
redis.set(key, value) 將 key 對應的值設置爲 value ,若是設置成功就返回 True
redis.get(key) 返回 key 對應的值,若是 key 不存在,則返回 None
讓咱們先來試一試這兩個函數:
>>> database.set('username', 'cometeme') True >>> database.get('username') b'cometeme'
能夠看到,雖然的確成功返回了咱們存入的信息,可是前面多了一個 b'
,這表明的是這是 byte 形式的值。那麼怎麼樣才能還原成正常的數據呢?
其實只須要加個 decode
函數就能夠恢復爲正常的數據。
>>> database.get('username').decode() 'cometeme'
假如你存了許多鍵值對,想要查看全部設置過的鍵值對,那麼你就可使用 redis.keys()
這個函數來返回全部鍵。
>>> database.keys() [b'passwd', b'username']
這樣返回的又都是帶 b'
的數據了,若是想要將它所有復原的話,咱們可使用 for
循環來完成解碼,這樣就解決問題。,可是每一次使用這些功能時,都須要設置這麼多的步驟。其實咱們能夠本身作一個模塊,從而可以在其餘程序中更簡單地完成這些操做。
爲了方便以後的使用,咱們能夠將一些 Redis 數據庫的操做寫成一個模塊,這樣能夠便於以後調用。咱們能夠新建一個叫 redisOperation.py 的文件,而且定義一個類。
import redis class redisOperation(): def __init__(self, host='localhost', port=6379, db=0,password=""): self.database = redis.Redis(host=host, port=port, db=db, password=password) print("Successfully connect to Redis Server.") def setData(self, key, value): self.database.set(key, value) def getData(self, key): data = self.database.get(key) if data is None: return None else: return data.decode() def getKeys(self): byteKeys = self.database.keys() rawKeys = [] for key in byteKeys: rawKeys.append(key.decode()) return rawKeys
首先在初始化的位置,咱們設定了默認參數,這樣能夠以最簡單的方式來測試一個服務器。 setData()
函數沒有任何改變,可是 getData()
和 getKeys()
函數都加入瞭解碼的過程,這樣只須要調用這個函數就能夠直接返回原始值,減小了重複的工做。
接下來咱們就可使用本身寫的模塊了:
from redisOperation import redisOperation r = redisOperation() r.setData('username', 'cometeme') print(r.getData('username'))
可是,在有一類狀況下,單純使用 decode()
會出現問題:當你存入的數據不是字符串類型,可是使用 decode()
以後返回的是一個字符串。若是你想要使用它,你就必須知道當初存進去的是什麼類型,再決定是否須要使用 eval()
函數,這無疑增長了非文本類型的存儲(特別是文本與非文本類型混合存儲)時的解碼難度。
>>> r.setData('username', [10,20,90,(30,10,29)]) >>> r.getData('username') '[10, 20, 90, (30, 10, 29)]'
其實問題在於,咱們存入一個值,而取出時爲 byte 類型。這意味着咱們存入時會先將信息變爲 byte 類型,就是這一步致使以後咱們沒法區分數據類型。那怎樣才能讓咱們的數據「原樣進,原樣出」呢?等等,是否是想到了咱們以前介紹的 pickle 模塊?[python] pickle 模塊
其實要使用 pickle 模塊完成數據的存儲,只須要簡單的更改上面的代碼。在介紹 pickle 模塊時,我提到了有兩個不經常使用的函數: dumps()
和 loads()
,這兩個就是用來生成與還原二進制流的。雖然我說他們不經常使用,可是在這裏他們就派上了用場。咱們只須要在存入時經過 dumps()
將任意的 python 變量轉化爲二進制流,而在取出時用 loads()
將其完整的取出,那就能夠實現任意類型的 python 變量存儲。
更新後的代碼以下,其實只改動了很小一部分。
import redis import pickle class redisOperation(): def __init__(self, host='localhost', port=6379, db=0, password=""): self.database = redis.Redis( host=host, port=port, db=db, password=password) print("Successfully connect to Redis Server.") def setData(self, key, value): self.database.set(key, pickle.dumps(value)) def getData(self, key): data = self.database.get(key) if data is None: return None else: return pickle.loads(data) def getKeys(self): byteKeys = self.database.keys() rawKeys = [] for key in byteKeys: rawKeys.append(key.decode()) return rawKeys
這樣就能夠完美地實如今 Redis 數據庫中進行各類數據類型的存儲了。
>>> r.setData('username', [10,20,90,(30,10,29)]) >>> r.getData('username') [10, 20, 90, (30, 10, 29)]
其實若是平時設置 key 時使用字符串,那麼在存入時咱們的 key 就不須要用 pickle 模塊來編碼,這樣也能夠增長效率。不過若是你想要將 key 值設置成更多的變量類型,那麼就能夠在存儲 key 時增長 dumps() 函數
如此咱們就介紹完了 python 與 redis 的鏈接與使用,相信在看完了篇文章後,你可以更徹底地瞭解 Redis 這一個數據模塊,而且可以在以後的項目裏更好地使用它。