1. python對mongo的常見CURD的操作
1.1 mongo簡介
mongodb是一個nosql數據庫,無結構化、和去中心化。
那為什么要用mongo來存呢?
1. 首先、數據關系復雜,沒有表連接,結構化弱。
2. 然后、利用mongo全文索引查找方便
3. 最好、數據不重要,記錄的日志數據庫。意外丟失風險可以接受
安裝:python3 -m pip3 install pymongo
1.2 python使用pymongo的簡單CURD操作
1.2.1 創建一個數據庫
創建數據庫需要使用 MongoClient 對象,並且指定連接的 URL 地址和要創建的數據庫名。
實例: 創建數庫(連接數據庫)user_info
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) USER_MONGO = mongo_client['user_info']
注意:
在 MongoDB 中,數據庫只有在內容插入后才會創建! 就是說,數據庫創建后要創建集合(數據表)並插入一個文檔(記錄),數據庫才會真正創建。
1.2.2 判斷數據庫是否存在
可以讀取 MongoDB 中的所有數據庫,並判斷指定的數據庫是否存在
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) USER_MONGO = mongo_client['user_info'] # 獲取取數據庫中的所有數據庫 db_list = mongo_client.list_database_names() if 'user_info' in db_list: print('數據庫已存在') else: print('數據庫不存在')
注意:
database_names 在最新版本的 Python 中已廢棄,Python3.7+ 之后的版本改為了 list_database_names()。
1.2.3 pymongo創建集合
MongoDB 中的集合類似 SQL 的表。MongoDB 使用數據庫對象來創建集合。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 my_watch = my_db['Asimov'] print(my_watch)
注意:
在 MongoDB 中,集合只有在內容插入后才會創建! 就是說,創建集合(數據表)后要再插入一個文檔(記錄),集合才會真正創建。
1.2.4 判斷集合是否已經存在
我們可以讀取 MongoDB 數據庫中的所有集合,並判斷指定的集合是否存在:
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 my_watch = my_db['Asimov'] print(my_watch) # 獲取當前數據庫中的所有表 col_list = my_db.list_collection_names() print(col_list) if 'my_watch' in col_list: print('集合已經存在') else: print('集合不存在')
1.3 Python Mongodb數據插入
1.3.1 插入一條數據
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] my_dict = {"name": "xiaoming", "age": 10000} x = user.insert_one(my_dict) print(x.inserted_id) # 返回id字段 print(x) # 5c808602707dc3863025ba3b # <pymongo.results.InsertOneResult object at 0x000001F3C6764F48>
如果我們在插入文檔時沒有指定 _id,MongoDB 會為每個文檔添加一個唯一的 id。
1.3.2 插入多條數據
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] my_list = [ {"name": "xiaohua", "age": 18}, {"name": "xiaoyang", "age": 20}, {"name": "xiaoli", "age": 10}, ] x = user.insert_many(my_list) print(x.inserted_ids) # 返回id字段 print(x) # [ObjectId('5c8086f1707dc385485a7dce'), ObjectId('5c8086f1707dc385485a7dcf'), ObjectId('5c8086f1707dc385485a7dd0')] # <pymongo.results.InsertManyResult object at 0x000002305991BF48>
1.3.3 插入指定 _id 的多個文檔
我們也可以自己指定 id,插入,以下實例我們在 site2 集合中插入數據,_id 為我們指定的:
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] my_list = [ {'_id': 1, "name": "xiaoxiong", "age": 18}, {'_id': 2, "name": "xiaomao", "age": 20}, ] x = user.insert_many(my_list) print(x.inserted_ids) # 返回id字段 # [1, 2]
1.4 Python Mongodb文檔查詢操作
MongoDB 中使用了 find 和 find_one 方法來查詢集合中的數據,它類似於 SQL 中的 SELECT 語句。
> use user_info switched to db user_info > db.dep.find() { "_id" : ObjectId("5c808503707dc381ec13b78e"), "name" : "xiaoming", "age" : 10000 } { "_id" : ObjectId("5c808602707dc3863025ba3b"), "name" : "xiaoming", "age" : 10000 } { "_id" : ObjectId("5c8086f1707dc385485a7dce"), "name" : "xiaohua", "age" : 18 } { "_id" : ObjectId("5c8086f1707dc385485a7dcf"), "name" : "xiaoyang", "age" : 20 } { "_id" : ObjectId("5c8086f1707dc385485a7dd0"), "name" : "xiaoli", "age" : 10 } { "_id" : 1, "name" : "xiaoxiong", "age" : 18 } { "_id" : 2, "name" : "xiaomao", "age" : 20 }
1.4.1 查詢一條數據
find_one()
x = user.find_one() print(x) # {'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 10000}
1.4.2 查詢所有數據
find()
for i in user.find(): print(i) # {'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 18} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 20} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 10} {'_id': 1, 'name': 'xiaoxiong', 'age': 18} {'_id': 2, 'name': 'xiaomao', 'age': 20}
1.4.3 查詢指定字段數據
find() 方法來查詢指定字段的數據,將要返回的字段對應值設置為 1。
for i in user.find({}, {"_id": 0, "name": 1, "age": 1}): print(i) #{'name': 'xiaoming', 'age': 10000} {'name': 'xiaoming', 'age': 10000} {'name': 'xiaohua', 'age': 18} {'name': 'xiaoyang', 'age': 20} {'name': 'xiaoli', 'age': 10} {'name': 'xiaoxiong', 'age': 18} {'name': 'xiaomao', 'age': 20}
注意:
除了 _id 你不能在一個對象中同時指定 0 和 1,如果你設置了一個字段為 0,則其他都為 1,反之亦然。
1.4.4 根據指定條件查詢
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {"name": "xiaoxiong"} mydoc = user.find(myquery) for x in mydoc: print(x) # {'_id': 1, 'name': 'xiaoxiong', 'age': 18}
1.4.5 高級查詢
查詢的條件語句中,我們還可以使用修飾符。
如讀取 age 字段中值大於 18的數據,大於的修飾符條件為 {"$gt": 18} :
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {"age": {"$gt": 18}} mydoc = user.find(myquery) for x in mydoc: print(x)

{'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 20} {'_id': 2, 'name': 'xiaomao', 'age': 20}
1.4.6 使用正則表達式查詢
使用正則表達式作為修飾符。正則表達式修飾符只用於搜索字符串的字段。
如讀取 name 字段中第一個字母為 "x" 的數據,正則表達式修飾符條件為 {"$regex": "^x"} :
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {"name": {"$regex": "^x"}} mydoc = user.find(myquery) for x in mydoc: print(x)

{'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 18} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 20} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 10} {'_id': 1, 'name': 'xiaoxiong', 'age': 18} {'_id': 2, 'name': 'xiaomao', 'age': 20}
1.4.7 返回指定條數記錄
要對查詢結果設置指定條數的記錄可以使用 limit() 方法,該方法只接受一個數字參數。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] mydoc = user.find().limit(3) for x in mydoc: print(x)

{'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 18}
1.5 Python Mongodb 修改文檔
1.5.1 MongoDB 中使用 update_one() 方法修改文檔中的記錄。
該方法第一個參數為查詢的條件,第二個參數為要修改的字段。如果查出兩條數據則只會修改第一條。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {'age': 20} newvalue = {'$set': {'age': 30}} user.update_one(myquery, newvalue) for i in user.find(): print(i)

{'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 10000} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 18} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 10} {'_id': 1, 'name': 'xiaoxiong', 'age': 18} {'_id': 2, 'name': 'xiaomao', 'age': 20}
1.5.2 修改所有匹配到的記錄,可以使用 update_many()。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {'name': {'$regex': 'x'}} newvalue = {'$set': {'age': 30}} data = user.update_many(myquery, newvalue) print('文檔修改數量:', data.modified_count) for i in user.find(): print(i)

文檔修改數量: 6 {'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 30} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 30} {'_id': 1, 'name': 'xiaoxiong', 'age': 30} {'_id': 2, 'name': 'xiaomao', 'age': 30}
1.6 Python Mongodb 排序

{'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 20} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 30} {'_id': 1, 'name': 'xiaoxiong', 'age': 18} {'_id': 2, 'name': 'xiaomao', 'age': 30}
sort() 方法可以指定升序或降序排序。
sort() 方法第一個參數為要排序的字段,第二個字段指定排序規則,1 為升序,-1 為降序,默認為升序。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] # mydoc = user.find().sort('age') mydoc = user.find().sort('age',-1) for i in mydoc: print(i)

{'_id': 1, 'name': 'xiaoxiong', 'age': 18} {'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 20} {'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 30} {'_id': 2, 'name': 'xiaomao', 'age': 30}

{'_id': ObjectId('5c808602707dc3863025ba3b'), 'name': 'xiaoming', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 30} {'_id': 2, 'name': 'xiaomao', 'age': 30} {'_id': ObjectId('5c808503707dc381ec13b78e'), 'name': 'xiaoming', 'age': 20} {'_id': 1, 'name': 'xiaoxiong', 'age': 18}
1.7 Python Mongodb 刪除數據
1.7.1 delete_one() 方法來刪除一個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {"name":'xiaoming'} user.delete_one(myquery) for i in user.find(): print(i)

{'_id': ObjectId('5c8086f1707dc385485a7dce'), 'name': 'xiaohua', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dcf'), 'name': 'xiaoyang', 'age': 30} {'_id': ObjectId('5c8086f1707dc385485a7dd0'), 'name': 'xiaoli', 'age': 30} {'_id': 1, 'name': 'xiaoxiong', 'age': 18} {'_id': 2, 'name': 'xiaomao', 'age': 30}
1.7.2 delete_many() 方法來刪除多個文檔,該方法第一個參數為查詢對象,指定要刪除哪些數據。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] myquery = {"age": {'$gt': 18}} user.delete_many(myquery) for i in user.find(): print(i)

{'_id': 1, 'name': 'xiaoxiong', 'age': 18}
1.7.3 刪除集合中的所有文檔
delete_many() 方法如果傳入的是一個空的查詢對象,則會刪除集合中的所有文檔:
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] data = user.delete_many({}) for i in user.find(): print(i)

# 空
1.7.4 刪除集合
drop() 方法來刪除一個集合。
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) my_db = mongo_client['user_info'] # 獲取取數據庫中對應表 user = my_db['dep'] user.drop()

> show dbs; admin 0.000GB local 0.000GB user_info 0.000GB > show dbs; admin 0.000GB local 0.000GB
2. python對redis的常見操作
我實踐中主要使用redis作為消息隊列。實際最佳場景為做緩存使用,效率高。redis是一個key-value結構的數據庫,value的格式可以使string,set,list,map(即python里面的dict),sorted set(有序集合)
安裝:
pip install redis
2.1 初始化
2.1.1 直接連接
import redis r = redis.StrictRedis(host='192.168.102.100', port=6379) r.set('one', 'first') print(r.get('one')) # b'first'
'''
參數: set(name, value, ex=None, px=None, nx=False, xx=False) ex,過期時間(秒) px,過期時間(毫秒) nx,如果設置為True,則只有name不存在時,當前set操作才執行,同setnx(name, value) xx,如果設置為True,則只有name存在時,當前set操作才執行
'''
#批量設置值
r.mset(name1='zhangsan', name2='lisi')
#或
r.mget({"name1":'zhangsan', "name2":'lisi'})
2.1.2 redis 連接池連接
redis使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池。
import redis pool = redis.ConnectionPool(host='192.168.102.100', port=6379) r = redis.Redis(connection_pool=pool) r.set('two', 'second') r.set('three', 'third') print(r.get('two')) print(r.get('three') # b'second' # b'third'
#批量獲取
print(r.mget("name1","name2"))
#或
li=["name1","name2"]
print(r.mget(li))
#設置新值,打印原值
print(r.getset("name1","wangwu")) #輸出:zhangsan
print(r.get("name1")) #輸出:wangwu
#根據字節獲取子序列
r.set("name","zhangsan")
print(r.getrange("name",0,3))#輸出:zhan
#修改字符串內容,從指定字符串索引開始向后替換,如果新值太長時,則向后添加
r.set("name","zhangsan")
r.setrange("name",1,"z")
print(r.get("name")) #輸出:zzangsan
r.setrange("name",6,"zzzzzzz")
print(r.get("name")) #輸出:zzangszzzzzzz
2.1.3 redis pipeline機制
可以在一次請求中執行多個命令,這樣避免了多次的往返時延,並且默認情況下一次pipline 是原子性操作。
import redis pool = redis.ConnectionPool(host='192.168.102.100', port=6379) r = redis.Redis(connection_pool=pool) pipe = r.pipeline() pipe.set('two', 'second') pipe.set('three', 'third') pipe.execute()
2.1.4 string的存取
r.set("key1","value1") r.get("key1") r.delete("key1")
2.1.5 dict的存取
#存 r.hset("usr1","name","kevin") r.hset("usr1","age","18") #取 d=r.hgetall("usr1")
hgetall()方法會返回字典類型{"name":"kevin","age":"18"}
2.1.6 set(即無需的列表)存取
r.sadd("key1","value1","value2","value3") r.smembers("key1")
2.1.7 list的存取
rpush()添加元素,llen()查看列表長度,ltrim()修剪列表,只保留起始下標到結束下標之間的數據,lrange(),為查找數據,查找出起始下標到結束下標之間的數據,返回的數據類型為list,如果結束下標小於起始下標,返回全部
r.rpush('log', 'log11') r.rpush('log', 'log22') r.rpush('log', 'log33') print(r.llen('log')) print(r.ltrim('log', 0, 3)) print(r.lrange('log', 0, -1))

4 True [b'log11', b'log22', b'log33', b'log11']
linsert(name, where, refvalue, value))
# 在name對應的列表的某一個值前或后插入一個新值 r.linsert("list_name","BEFORE","2","SS")#在列表內找到第一個元素2,在它前面插入SS ''' 參數: name: redis的name where: BEFORE(前)或AFTER(后) refvalue: 列表內的值 value: 要插入的數據 '''
r.lset(name, index, value)
#對list中的某一個索引位置重新賦值 r.lset("list_name",0,"bbb")
r.lrem(name, value, num)
#刪除name對應的list中的指定值 r.lrem("list_name","SS",num=0) ''' 參數: name: redis的name value: 要刪除的值 num: num=0 刪除列表中所有的指定值; num=2 從前到后,刪除2個; num=-2 從后向前,刪除2個 '''
lpop(name)
#移除列表的左側第一個元素,返回值則是第一個元素 print(r.lpop("list_name"))
lindex(name, index)
#根據索引獲取列表內元素 print(r.lindex("list_name",1))
lrange(name, start, end)
#分片獲取元素 print(r.lrange("list_name",0,-1))
ltrim(name, start, end)
#移除列表內沒有在該索引之內的值 r.ltrim("list_name",0,2)
rpoplpush(src, dst)
# 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊 #src 要取數據的列表 #dst 要添加數據的列表
2.1.8 hash操作
redis中的Hash 在內存中類似於一個name對應一個dic來存儲
hset(name, key, value)
#name對應的hash中設置一個鍵值對(不存在,則創建,否則,修改) r.hset("dic_name","a1","aa")
hget(name,key)
r.hset("dic_name","a1","aa") #在name對應的hash中根據key獲取value print(r.hget("dic_name","a1"))#輸出:aa
hgetall(name)
#獲取name對應hash的所有鍵值 print(r.hgetall("dic_name"))
hmset(name, mapping)
#在name對應的hash中批量設置鍵值對,mapping:字典 dic={"a1":"aa","b1":"bb"} r.hmset("dic_name",dic) print(r.hget("dic_name","b1"))#輸出:bb
hmget(name, keys, *args)
# 在name對應的hash中獲取多個key的值 li=["a1","b1"] print(r.hmget("dic_name",li)) print(r.hmget("dic_name","a1","b1"))
hlen(name)、hkeys(name)、hvals(name)
dic={"a1":"aa","b1":"bb"} r.hmset("dic_name",dic) #hlen(name) 獲取hash中鍵值對的個數 print(r.hlen("dic_name")) #hkeys(name) 獲取hash中所有的key的值 print(r.hkeys("dic_name")) #hvals(name) 獲取hash中所有的value的值 print(r.hvals("dic_name"))
hexists(name, key)
#檢查name對應的hash是否存在當前傳入的key print(r.hexists("dic_name","a1"))#輸出:True
hdel(name,*keys)
#刪除指定name對應的key所在的鍵值對 r.hdel("dic_name","a1")
hincrby(name, key, amount=1)
#自增hash中key對應的值,不存在則創建key=amount(amount為整數) print(r.hincrby("demo","a",amount=2))
hincrbyfloat(name, key, amount=1.0)
#自增hash中key對應的值,不存在則創建key=amount(amount為浮點數)
2.1.9 發布訂閱
發布者:服務器
訂閱者:Dashboad和數據處理
訂閱者:
import redis r = redis.Redis() pub = r.pubsub() # 生成訂閱對象 pub.subscribe('fm104.5') # 訂閱哪個鍵,只是一個字符串 pub.parse_response() # 解析數據結果 while True: print('working...') msg = pub.parse_response() print(msg)
發布者:
import redis r = redis.Redis() while True: msg = input('>>>') r.publish('fm104.5', msg) # 發布訂閱
2.1.10 sentinel模式使用
redis中的sentinel主要用於在redis主從復制中,如果master掛掉,則自動將slave替換成master
#!/usr/bin/env python # -*- coding:utf-8 -*- from redis.sentinel import Sentinel # 連接哨兵服務器(主機名也可以用域名) sentinel = Sentinel([('192.168.102.101', 26379), ('192.268.102.102', 26380), ], socket_timeout=0.5) # 獲取主服務器地址 master = sentinel.discover_master('mymaster') print(master) # 獲取從服務器地址 slave = sentinel.discover_slaves('mymaster') print(slave) # 獲取主服務器進行寫入 master = sentinel.master_for('mymaster') #master.set('foo', 'bar') # 獲取從服務器進行讀取(默認是round-roubin) slave = sentinel.slave_for('mymaster', password='redis_auth_pass') ret = slave.get('foo') print(ret)