浏览代码

更新设备影子加锁

linhaohong 1 年之前
父节点
当前提交
a9f46828cb
共有 1 个文件被更改,包括 14 次插入1 次删除
  1. 14 1
      Controller/ShadowController.py

+ 14 - 1
Controller/ShadowController.py

@@ -7,6 +7,7 @@ from Ansjer.config import SERVER_TYPE, LOGGER, CONFIG_INFO, CONFIG_CN
 from Model.models import Device_Info, UidSetModel, UID_Preview, VoicePromptModel, UidChannelSetModel, \
     AiService, CountryModel, CityInformation, IPAddr
 from Object.ETkObject import ETkObject
+from Object.RedisObject import RedisObject
 from Service.CommonService import CommonService
 from Object.IPWeatherObject import IPQuery, GeoIP2
 
@@ -22,6 +23,9 @@ def update_device_shadow(request):
         return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
     LOGGER.info('---更新设备影子---,使用配置:{}, 参数:{}'.format(SERVER_TYPE,
                                                      json.dumps(request_dict.dict())))
+    # redis加锁
+    redis_obj = RedisObject()
+    redis_key = None
 
     try:
         etk = request_dict.get('etk', None)
@@ -68,7 +72,12 @@ def update_device_shadow(request):
 
             # 更新ip信息
             update_ip_info(ip, uid)
-
+        else:
+            redis_key = f"DEVICE:UPDATE:SHADOW:{uid}"
+            is_lock = redis_obj.CONN.set(redis_key, nx=True, ex=60)
+            if not is_lock:
+                return JsonResponse(status=200, data={'code': 5, 'msg': 'Please try again one minute later!',
+                                                      'data': {}})
         ucode = request_dict.get('ucode', None)
         version = request_dict.get('version', None)
         p2p_region = request_dict.get('p2p_region', None)
@@ -150,8 +159,12 @@ def update_device_shadow(request):
             qs_dict['addTime'] = nowTime
             UidSetModel.objects.create(**qs_dict)
         LOGGER.info('***设备影子保存成功{}'.format(uid))
+        if redis_key:
+            redis_obj.del_data(redis_key)
         return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': {}})
     except Exception as e:
+        if redis_key:
+            redis_obj.del_data(redis_key)
         LOGGER.info('更新设备影子异常: errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
         return JsonResponse(status=200, data={'code': 1000001, 'update_shadow_error': repr(e)})