[python] redis 模塊 -- 實現 python 與 Redis 數據庫的結合

Redis 能夠說是 NoSQL (非關係型數據庫)中較爲流行的一種數據庫,雖然相較於 MongoDB , Redis 的檢索算法不夠全面,可是它的性能更好,對數據持久化的處理也較優。html

Redis-icon

因此在創建數據庫時,也常常會用到 Redis ,並且通常用它和其餘數據庫相互組合使用。相較於 SQL , Redis 能夠很好地處理緩存類的部分,而且更易實現分佈式,從而提高服務器的訪問效率。python

1. 安裝 redis 和 python 第三方模塊

Redis 的服務器文件咱們須要到它的官網上去下載:Redis.ioredis

下載完成後,咱們解壓文件,而後打開控制檯,切換到解壓後的目錄下,而後輸入 make 指令,通過一段時間的安裝後, Redis 就安裝成功了。算法

安裝好了服務器以後,咱們須要安裝 python 的 redis 第三方模塊,來實現對 Redis 鏈接的支持。數據庫

$ pip install redis

2. 鏈接 Redis 數據庫

首先咱們先以普通模式運行 Redis 數據庫,打開終端,能夠看到一個 Redis 的圖標。編程

$ redis-server

redis_bash

在調試完成後,咱們應該使用 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 服務器的密碼,若是沒有設置密碼就不用填

3. 對數據庫進行操做

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 循環來完成解碼,這樣就解決問題。,可是每一次使用這些功能時,都須要設置這麼多的步驟。其實咱們能夠本身作一個模塊,從而可以在其餘程序中更簡單地完成這些操做。

4. 寫一個簡單的 Redis 操做模塊

爲了方便以後的使用,咱們能夠將一些 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 模塊

5. redis + 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 這一個數據模塊,而且可以在以後的項目裏更好地使用它。

相關文章
相關標籤/搜索