Python操做MongoDB和Redis

1. python對mongo的常見CURD的操做

 

1.1 mongo簡介

mongodb是一個nosql數據庫,無結構化、和去中心化。python

那爲何要用mongo來存呢?正則表達式

  1. 首先、數據關係複雜,沒有錶鏈接,結構化弱。redis

  2. 而後、利用mongo全文索引查找方便sql

  3. 最好、數據不重要,記錄的日誌數據庫。意外丟失風險能夠接受mongodb

安裝:python3 -m pip3 install pymongo數據庫

 

 

1.2 python使用pymongo的簡單CURD操做

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 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","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)
相關文章
相關標籤/搜索