[python] redis 模块 -- 实现 python 与 Redis 数据库的结合
2019獨角獸企業重金招聘Python工程師標準>>>
Redis 可以說是 NoSQL (非關系型數據庫)中較為流行的一種數據庫,雖然相較于 MongoDB , Redis 的檢索算法不夠全面,但是它的性能更好,對數據持久化的處理也較優。
所以在建立數據庫時,也經常會用到 Redis ,而且一般用它和其他數據庫相互組合使用。相較于 SQL , Redis 可以很好地處理緩存類的部分,并且更易實現分布式,從而提升服務器的訪問效率。
1. 安裝 redis 和 python 第三方模塊
Redis 的服務器文件我們需要到它的官網上去下載:Redis.io 。
下載完成后,我們解壓文件,然后打開控制臺,切換到解壓后的目錄下,然后輸入 make 指令,經過一段時間的安裝后, Redis 就安裝成功了。
安裝好了服務器之后,我們需要安裝 python 的 redis 第三方模塊,來實現對 Redis 連接的支持。
$ pip install redis2. 連接 Redis 數據庫
首先我們先以普通模式運行 Redis 數據庫,打開終端,可以看到一個 Redis 的圖標。
$ redis-server在調試完成后,我們應該使用 conf 配置文件打開 Redis 服務器,不然會有安全性隱患。
在 python 中,我們可以通過定義一個 Redis 對象來實現對 Redis 數據庫的連接。這里我們先使用 IDLE 的交互式編程模式來完成。
>>> import redis >>> database = redis.Redis()只需要一個簡單的函數,我們就能連接我們的服務器了。
其中, 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 redisclass 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 Noneelse: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 redisOperationr = 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 pickleclass 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 Noneelse: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 這一個數據模塊,并且能夠在之后的項目里更好地使用它。
轉載于:https://my.oschina.net/u/3729927/blog/1929867
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的[python] redis 模块 -- 实现 python 与 Redis 数据库的结合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 0036-商场促销
- 下一篇: Wannafly挑战赛22游记