redis异步写入mysql_异步操作redis,mysql
uvloop
asyncio 的事件循環的替代方案
效率默認大于asyncio的事件循環
性能是更高的
性能接近go
pip install uvloop
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
...
asgi-->uvicorn
內部使用的是uvlooop
異步操作redis
在我們操作redis的時候,連接,操作,斷開都是網絡io
asyncio 提高并發
pip install aioredis
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
import aioredis
async def execute(address,password):
print('開始執行',address)
redis = await aioredis.create_redis(address)
await redis.hmset_dict('car',key1=1,key2=2,key3=3)
res = await redis.hgetall('car',encoding='utf8')
print(res)
redis.close()
await redis.wait_closed()
print('結束',address)
asyncio.run(execute('redis://127.0.0.1:6379',password=''))
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
import aioredis
async def execute(address,password):
print('開始執行',address)
redis = await aioredis.create_redis(address)
await redis.hmset_dict('car',key1=1,key2=2,key3=3)
res = await redis.hgetall('car',encoding='utf8')
print(res)
redis.close()
await redis.wait_closed()
print('結束',address)
# asyncio.run(execute('redis://127.0.0.1:6379',password=''))
task_list = [
execute('redis://127.0.0.1:6379',password='') for i in range(0,10000)
]
asyncio.run(asyncio.wait(task_list))
# aioredis.errors.MaxClientsError: ERR max number of clients reached
通過lsof -p pid |wc -l ,發現連接數量超過10500. 出錯。
解決方法1:
1. 增加redis的最大連接數:修改redis.conf文件的maxclient ,修改到20000.
2. 一般redis的連接使用完畢之后會釋放,如果要用lsof命令發現鏈接始終沒有減少,則檢查代碼,看下使用redis的代碼部分是否執行類似close()的函數。將資源進行釋放
import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
import aioredis
async def execute(address,password):
print('開始執行',address)
try:
redis = await aioredis.create_redis(address)
await redis.hmset_dict('car',key1=1,key2=2,key3=3)
res = await redis.hgetall('car',encoding='utf8')
print(res)
redis.close()
await redis.wait_closed()
print('結束',address)
except aioredis.errors.MaxClientsError as e :
print(e)
await asyncio.sleep(10)
# asyncio.run(execute('redis://127.0.0.1:6379',password=''))
task_list = [
execute('redis://127.0.0.1:6379',password='') for i in range(0,10000)
]
asyncio.run(asyncio.wait(task_list))
# aioredis.errors.MaxClientsError: ERR max number of clients reached
異步操作mysql
pip install aiomysql
import aiomysql
import asyncio
import pymysql
async def execute(host,user,pwd):
try:
conn = await aiomysql.connect(host=host,port=3306,user=user,password=pwd)
cur = await conn.cursor()
await cur.execute("select host,user from mysql.user;")
res = await cur.fetchall()
print(res)
await cur.close()
conn.close()
except pymysql.err.OperationalError as e :
asyncio.sleep(10)
host='127.0.0.1'
user='root'
pwd='1234'
task_list =[
execute(host,user,pwd) for i in range(10000)
]
asyncio.run(asyncio.wait(task_list))
# pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on '127.0.0.1'")
總結
以上是生活随笔為你收集整理的redis异步写入mysql_异步操作redis,mysql的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 早盘集合竞价选股法,七步进行选股
- 下一篇: 百度回应文心一言文生图功能争议:能力来自