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)