Python操作MongoDB和Redis

时间:2021-12-23 22:27:15

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}

db

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","")
#取
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","","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 发布订阅

Python操作MongoDB和Redis

发布者:服务器

订阅者: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)