日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

[python] redis 模块 -- 实现 python 与 Redis 数据库的结合

發布時間:2023/12/20 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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 redis

2. 連接 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 数据库的结合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。