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