mongo 非同步 讀寫分離

2021-09-17 22:51:23 字數 2171 閱讀 1097

使用 asynciomotorclient 非同步庫,進行讀寫分離。

讀:從資料庫不停讀資料存到佇列,

寫: 從本地佇列不停批量向資料庫寫資料。

場景: 資料大的時候,你可以快速將a的資料匯入到b中。

可以提高資料插入效率,不必等待寫完才讀取下一批資料

import asyncio

from custom_conf import mongodb_url

from motor.motor_asyncio import asynciomotorclient

from pymongo import updateone

class combineshop:

def __init__(self, db: str, collection_read: str, collection_write: str, batch: int = 200):

"""初始化

:param db: mongo database

:param collection_read: mongo read collection

:param collection_write: mongo write collection

:param batch: bulk write

"""self.batch = batch

self.db = db

self.collection_read = collection_read

self.collection_write = collection_write

self.url = mongodb_url.format(self.db)

self.queue = asyncio.queue() # 共享佇列

self.finished = false # 完成標誌

async def run(self):

"""入口"""

await asyncio.gather(self.read(), self.write())

def connect(self):

"""連線"""

connection = asynciomotorclient(self.url)

return connection[self.db]

async def read(self):

"""讀,生產資料"""

db = self.connect()

async for shop in db[self.collection_read].find(}, ):

shop['shop_id'] = str(shop['shop_id'])

await self.queue.put(, 'update': })

self.finished = true

async def write(self):

"""寫,消費資料"""

db = self.connect()

db[self.collection_write].create_index("shop_id", unique=true)

requests =

while not self.finished or not self.queue.empty():

try:

kwargs = self.queue.get_nowait()

except asyncio.queueempty:

await asyncio.sleep(0.1)

if len(requests) == self.batch:

await db[self.collection_write].bulk_write(requests)

requests.clear()

if requests:

await db[self.collection_write].bulk_write(requests)

if __name__ == '__main__':

c = combineshop(db='your_db', collection_read='collection_read', collection_write='collection_write')

loop = asyncio.get_event_loop()

loop.run_until_complete(c.run())

mysql讀寫分離(三) 讀寫分離實現

現在的mysql讀寫分離方案有很多,在這裡筆者列舉出幾種自己使用過的方案 1.spring實現route不同的資料來源,來達到讀寫分離的目的。主要原理是根據service或者dao方法做切面,然後根據規範方法名字首來切換不同的資料來源,實現讀寫分離,好處,速度快,支援事務,但是缺點,是不好管理 2....

php mysql讀寫分離

關於mysql的讀寫分離有幾種方法 中介軟體,mysql驅動層,控制 關於中介軟體和mysql驅動層實現mysql讀寫分離的方法,今天暫不做研究,這裡主要寫一點簡單的 來實現由php 控制mysql的讀寫分離。準備工作 兩個mysql伺服器,已經配置好主從,如果沒配置過mysql主從 主伺服器192...

thinkphp mysql 讀寫分離

thinkphp提供了完善的讀寫分離功能,不需要手動切換資料庫。什麼時候讀,什麼時候寫系統會自動判斷。讀資料時系統會操作從伺服器,而寫資料時系統會操作主伺服器。最終由資料庫實現同步,這就是乙個最典型的資料庫讀寫分離,下以將配置好的兩台主從資料庫為例,詳細介紹實現讀寫分離。首先開啟專案下的資料庫配置檔...