mongodb是一個nosql數據庫,無結構化、和去中心化。python
那爲何要用mongo來存呢?正則表達式
1. 首先、數據關係複雜,沒有錶鏈接,結構化弱。redis
2. 而後、利用mongo全文索引查找方便sql
3. 最好、數據不重要,記錄的日誌數據庫。意外丟失風險能夠接受mongodb
安裝:python3 -m pip3 install pymongo數據庫
1.2.1 建立一個數據庫緩存
建立數據庫須要使用 MongoClient 對象,而且指定鏈接的 URL 地址和要建立的數據庫名。服務器
實例: 建立數庫(鏈接數據庫)user_infoapp
import pymongo mongo_client = pymongo.MongoClient(host='192.168.102.100', port=27017) USER_MONGO = mongo_client['user_info']
注意:nosql
在 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.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]
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.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}
{'_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.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
我實踐中主要使用redis做爲消息隊列。實際最佳場景爲作緩存使用,效率高。redis是一個key-value結構的數據庫,value的格式能夠使string,set,list,map(即python裏面的dict),sorted set(有序集合)
安裝:
pip install redis
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)