浏览代码

上报智能插座开关数据增加redis锁

zhangdongming 1 年之前
父节点
当前提交
e4d40f49c1
共有 1 个文件被更改,包括 11 次插入1 次删除
  1. 11 1
      Controller/gatewayController.py

+ 11 - 1
Controller/gatewayController.py

@@ -309,18 +309,25 @@ class GatewayView(View):
         """
         智能插座开关状态推送
         """
+        event_key = ''
+        redis_obj = RedisObject(db=7)
         try:
             switch_key = 'LOOCAM:SOCKET:SERIAL:NUMBER:{}:{}:{}'
-            redis_obj = RedisObject(db=7)
             serial_number = request_dict.get('serialNumber', None)
             device_time = request_dict.get('deviceTime', None)
             status = request_dict.get('status', None)
+            event_key = f'LOOCAM:SOCKET:SETNX:{serial_number}:{status}:{device_time}'
+            is_nx = redis_obj.CONN.setnx(event_key, 1)  # 获取锁
+            if not is_nx:
+                return response.json(5)
             if not all([serial_number, status, device_time]):
+                redis_obj.del_data(event_key)  # 释放锁
                 return response.json(444)
             status = int(status)
             switch_key = switch_key.format(serial_number, status, device_time)
             switch = redis_obj.get_data(switch_key)
             if switch and int(switch) == status:
+                redis_obj.del_data(event_key)  # 释放锁
                 return response.json(0, "电源开关状态重复上报")
             now_time = int(device_time) if device_time else int(time.time())
             LOGGER.info('已订阅成功接收:事件类型{},状态:{}'.format(serial_number, status))
@@ -332,7 +339,10 @@ class GatewayView(View):
             }
             SceneLog.objects.create(**log_dict)
             redis_obj.set_data(switch_key, status, 60 * 10)
+            redis_obj.del_data(event_key)  # 释放锁
             return response.json(0)
         except Exception as e:
+            print(repr(e))
+            redis_obj.del_data(event_key)
             LOGGER.info('---插座开关日志推送接口异常--- {}'.format(repr(e)))
             return response.json(500, repr(e))