思路: 分两部分
第一部分: 将要修改的用户id存入到redis list中按照队列先进先出的思路
第二部分: 然后用协程实现异步修改

1. 代码: 封装redis 实现队列效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class MyRedisQueue:

def __init__(self, key, **redis_kwargs):
self.__db = redis.Redis(**redis_kwargs)
self.key = key

def push(self, key, value):
self.__db.lpush(key, value)

def lrange(self, key):
return self.__db.lrange(key, 0, -1)

def llen(self, key):
return self.__db.llen(key)

def pop(self):
return self.__db.rpop(self.key)


async def dojob():
r = MyRedisQueue('queue')
ccc = 'jg'
while 1:
dea = r.pop()
if not dea:
break
else:
a = eval(dea)
print(a)
if User.objects.filter(username=a[1]):
r.hset(ccc, a[0], 400)
else:
User.objects.filter(id=a[0]).update(username=a[1])
r.hset(ccc, a[0], 200)

2. 代码: 实现异步消费

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
r = MyRedisQueue('queue', decode_responses=True)


class Update(APIView):

def get(self, request):
id = request.query_params.get('id')
# print(r.lrange(key))
# list = r.lrange()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
res = loop.run_until_complete(dojob())
loop.close()

a = r.hget('jg', id)
print(a)
if a == '200':
return Response({"msg": '修改成功'})
else:
return Response({'msg': '用户名重复'})


class UpdateUser(APIView):

def post(self, request):
id = request.query_params.get('id')
vip = request.data.get('vip')
new_username = request.data.get('new_username')
r.push('queue',f'{id, new_username, vip}')

return Response({'msg': '正在审核'})