Jelajahi Sumber

redis加锁,防止同时进行序列号的下载,上传,获取操作

locky 3 tahun lalu
induk
melakukan
ed82b48c1f
2 mengubah file dengan 35 tambahan dan 9 penghapusan
  1. 19 1
      Controller/FileController.py
  2. 16 8
      Controller/SerialNumberController.py

+ 19 - 1
Controller/FileController.py

@@ -298,6 +298,14 @@ class UploadSerialNumberFileView(View):
             return response.json(tko.code)
 
         try:
+            # redis加锁,防止同时进行其他操作
+            redisObj = RedisObject()
+            serial_operate_lock_key = 'serial_operate_lock'
+            isLock = redisObj.CONN.setnx(serial_operate_lock_key, 1)
+            if not isLock:
+                return response.json(5)
+            redisObj.CONN.expire(serial_operate_lock_key, 60)
+
             content = base64.b64decode(content).decode().strip()
             content = content[3:(len(content)-3)]
             serial_number_list = content.split('\n')
@@ -320,6 +328,7 @@ class UploadSerialNumberFileView(View):
                     serial_number_qs.update(use_status=1)   # 重置序列号状态为已分配
                     operation = self.formatOperation('重置', int(count))
                     self.add_log(request, operation, tko)
+            redisObj.del_data(key=serial_operate_lock_key)      # redis解锁
             return response.json(0)
         except Exception as e:
             # print('e:', e)
@@ -667,7 +676,13 @@ class DownloadSerialNumberFileView(View):
         if not order_number or not board or not plan or not checksum or not ic_model or not order_quantity or not fileType or not company_id:
             return response.json(444)
 
-
+        # redis加锁,防止同时进行其他操作
+        redisObj = RedisObject()
+        serial_operate_lock_key = 'serial_operate_lock'
+        isLock = redisObj.CONN.setnx(serial_operate_lock_key, 1)
+        if not isLock:
+            return response.json(5)
+        redisObj.CONN.expire(serial_operate_lock_key, 60)
 
         if quantity > 0:
 
@@ -813,4 +828,7 @@ class DownloadSerialNumberFileView(View):
         response['content_type'] = "application/octet-stream"
         response['Content-Disposition'] = 'attachment; filename=SerialNumber_'+ fileTypeName + time.strftime('_%Y_%m_%d_%H_%M_%S',
                                                                                      time.localtime()) + '.zip'
+        serial_operate_lock_key = 'serial_operate_lock'
+        redisObj = RedisObject()
+        redisObj.del_data(key=serial_operate_lock_key)  # redis解锁
         return response

+ 16 - 8
Controller/SerialNumberController.py

@@ -191,13 +191,20 @@ class SerialNumberView(View):
         if token != time_stamp or distance > 60000 or distance < -60000:  # 为了全球化时间控制在一天内
             return response.json(404)
 
-        redisObject = RedisObject()
+        redisObj = RedisObject()
+        # redis加锁,防止同时进行其他操作
+        serial_operate_lock_key = 'serial_operate_lock'
+        isLock = redisObj.CONN.setnx(serial_operate_lock_key, 1)
+        if not isLock:
+            return response.json(5)
+        redisObj.CONN.expire(serial_operate_lock_key, 60)
+
         key = 'serial_lock'
-        value = redisObject.lpop(key)
+        value = redisObj.lpop(key)
         count = 0
         while value is False and count < 5:
             time.sleep(1)
-            value = redisObject.lpop(key)
+            value = redisObj.lpop(key)
             count += 1
 
         if count == 5 and value is False:  # 暂时注释
@@ -205,7 +212,7 @@ class SerialNumberView(View):
         userid = '3'
         user_qs = UserModel.objects.filter(id=userid)
         if not user_qs.exists():
-            redisObject.rpush(key, value)
+            redisObj.rpush(key, value)
             return response.json(9)
 
         user = user_qs[0]
@@ -232,7 +239,7 @@ class SerialNumberView(View):
             return response.json(444, '序列号不足')
         count = result['num']
         if count < quantity:
-            redisObject.rpush(key, value)
+            redisObj.rpush(key, value)
             return response.json(444, '序列号不足')
 
         try:
@@ -240,8 +247,8 @@ class SerialNumberView(View):
                 sn_qs = sn_qs[0: quantity]
                 serial_number = sn_qs[0].serial_number
                 # 防止重复获取序列号
-                is_lock = redisObject.CONN.setnx(serial_number + 'serial_number_lock', 1)
-                redisObject.CONN.expire(serial_number + 'serial_number_lock', 60)
+                is_lock = redisObj.CONN.setnx(serial_number + 'serial_number_lock', 1)
+                redisObj.CONN.expire(serial_number + 'serial_number_lock', 60)
                 if not is_lock:
                     return response.json(5)
 
@@ -283,7 +290,8 @@ class SerialNumberView(View):
                     'user': user_qs[0]
                 }
                 LogModel.objects.create(**log)
-                redisObject.rpush(key, value)
+                redisObj.del_data(key=serial_operate_lock_key)  # redis解锁
+                redisObj.rpush(key, value)
                 return response.json(0, {'serial_number': serial_number + mark, 'mac': mac})
         except Exception as e:
             return response.json(500, repr(e))