Bläddra i källkod

推送数据通过读写redis列表批量保存

locky 1 år sedan
förälder
incheckning
ebed7105ea
3 ändrade filer med 79 tillägg och 20 borttagningar
  1. 10 0
      Object/RedisObject.py
  2. 37 20
      Service/DevicePushService.py
  3. 32 0
      Service/EquipmentInfoService.py

+ 10 - 0
Object/RedisObject.py

@@ -62,3 +62,13 @@ class RedisObject:
             return ttl
         else:
             return 0
+
+    def ltrim(self, name, start, end):
+        """
+        对一个列表进行修剪(trim),让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
+        @param name: 列表名称
+        @param start: 区间开始下标, 0:第一个元素
+        @param end: 区间结束下标, -1:最后一个元素
+        @return : bool
+        """
+        return self.CONN.ltrim(name, start, end)

+ 37 - 20
Service/DevicePushService.py

@@ -23,10 +23,11 @@ from AnsjerPush.config import XMPUSH_CONFIG, OPPOPUSH_CONFIG
 from Model.models import UidPushModel, SysMsgModel, DeviceSharePermission, DeviceChannelUserSet, \
     DeviceChannelUserPermission, UidSetModel, Device_Info
 from Object.ETkObject import ETkObject
+from Object.RedisObject import RedisObject
 from Object.UidTokenObject import UidTokenObject
 from Object.utils import LocalDateTimeUtil
 from Service.CommonService import CommonService
-from Service.EquipmentInfoService import EquipmentInfoService
+from Service.EquipmentInfoService import EquipmentInfoService, EQUIPMENT_INFO_DICT
 from Service.HuaweiPushService.HuaweiPushService import HuaweiPushObject
 from Service.PushService import PushObject
 
@@ -149,14 +150,15 @@ class DevicePushService:
         uid = params['uid']
         push_kwargs = params['push_kwargs']
         now_time = int(time.time())
+        redis_obj = RedisObject()
         try:
             params['event_tag'] = cls.get_event_tag(params['ai_type'], params['event_type'], params['detection'])
             is_app_push = True if params['event_type'] in [606, 607] else \
                 cls.is_send_app_push(
                     params['event_type'], params['event_tag'], params['app_push_config'], params['app_push'], uid)
 
-            equipment_info_list = []
-            equipment_info_model = EquipmentInfoService.randoms_choice_equipment_info()
+            save_equipment_info = False
+            equipment_info_key = EquipmentInfoService.randoms_choice_equipment_info_key()
             for up in params['uid_set_push_list']:
                 lang = up['lang']
                 tz = up['tz']
@@ -176,23 +178,27 @@ class DevicePushService:
                                                         updTime=now_time, uid=uid, eventType=params['event_type']))
                     # 保存推送消息
                     else:
+                        if not save_equipment_info:
+                            save_equipment_info = True
                         params['userID_id'] = user_id
-                        equipment_info_list.append(
-                            equipment_info_model(
-                                device_user_id=params['userID_id'],
-                                event_time=params['n_time'],
-                                event_type=params['event_type'],
-                                device_uid=params['uid'],
-                                device_nick_name=params['nickname'],
-                                channel=params['channel'],
-                                alarm='Motion \tChannel:{}'.format(params['channel']),
-                                is_st=params['is_st'],
-                                add_time=int(time.time()),
-                                storage_location=params['storage_location'],
-                                event_tag=params['event_tag'],
-                                answer_status=True if params['dealings_type'] == 1 else False
-                            )
-                        )
+                        answer_status = 1 if params['dealings_type'] == 1 else 0
+                        equipment_info_kwargs = {
+                            'device_user_id': params['userID_id'],
+                            'event_time': params['n_time'],
+                            'event_type': params['event_type'],
+                            'device_uid': params['uid'],
+                            'device_nick_name': params['nickname'],
+                            'channel': params['channel'],
+                            'alarm': 'Motion \tChannel:{}'.format(params['channel']),
+                            'is_st': params['is_st'],
+                            'add_time': int(time.time()),
+                            'storage_location': params['storage_location'],
+                            'event_tag': params['event_tag'],
+                            'answer_status': answer_status
+                        }
+                        # 保存到redis列表
+                        equipment_info_value = json.dumps(equipment_info_kwargs)
+                        redis_obj.rpush(equipment_info_key, equipment_info_value)
                     saved_user_id_list.append(user_id)
 
                 # 推送
@@ -232,7 +238,18 @@ class DevicePushService:
             # 写入系统消息
             if sys_msg_list:
                 SysMsgModel.objects.bulk_create(sys_msg_list)
-            if equipment_info_list:
+            if save_equipment_info:
+                equipment_info_list = []
+                equipment_info_model = EQUIPMENT_INFO_DICT[equipment_info_key]
+                # 缓存数据多于100条,批量保存前100条,否则保存全部
+                equipment_info_len = redis_obj.llen(equipment_info_key)
+                end = 99 if equipment_info_len > 100 else equipment_info_len - 1
+                equipment_info_redis_list = redis_obj.lrange(equipment_info_key, 0, end)
+                redis_obj.ltrim(equipment_info_key, end+1, -1)
+
+                for equipment_info in equipment_info_redis_list:
+                    equipment_info_data = eval(equipment_info)
+                    equipment_info_list.append(equipment_info_model(**equipment_info_data))
                 equipment_info_model.objects.bulk_create(equipment_info_list)
 
             return True

+ 32 - 0
Service/EquipmentInfoService.py

@@ -20,6 +20,34 @@ EQUIPMENT_INFO_LIST = [
     EquipmentInfo11, EquipmentInfo12, EquipmentInfo13, EquipmentInfo14, EquipmentInfo15, EquipmentInfo16,
     EquipmentInfo17, EquipmentInfo18, EquipmentInfo19, EquipmentInfo20]
 
+EQUIPMENT_INFO_KEY_LIST = [
+    'EquipmentInfo1', 'EquipmentInfo2', 'EquipmentInfo3', 'EquipmentInfo4', 'EquipmentInfo5', 'EquipmentInfo6',
+    'EquipmentInfo7', 'EquipmentInfo8', 'EquipmentInfo9', 'EquipmentInfo10',
+    'EquipmentInfo11', 'EquipmentInfo12', 'EquipmentInfo13', 'EquipmentInfo14', 'EquipmentInfo15', 'EquipmentInfo16',
+    'EquipmentInfo17', 'EquipmentInfo18', 'EquipmentInfo19', 'EquipmentInfo20']
+EQUIPMENT_INFO_DICT = {
+    'EquipmentInfo1': EquipmentInfo1,
+    'EquipmentInfo2': EquipmentInfo2,
+    'EquipmentInfo3': EquipmentInfo3,
+    'EquipmentInfo4': EquipmentInfo4,
+    'EquipmentInfo5': EquipmentInfo5,
+    'EquipmentInfo6': EquipmentInfo6,
+    'EquipmentInfo7': EquipmentInfo7,
+    'EquipmentInfo8': EquipmentInfo8,
+    'EquipmentInfo9': EquipmentInfo9,
+    'EquipmentInfo10': EquipmentInfo10,
+    'EquipmentInfo11': EquipmentInfo11,
+    'EquipmentInfo12': EquipmentInfo12,
+    'EquipmentInfo13': EquipmentInfo13,
+    'EquipmentInfo14': EquipmentInfo14,
+    'EquipmentInfo15': EquipmentInfo15,
+    'EquipmentInfo16': EquipmentInfo16,
+    'EquipmentInfo17': EquipmentInfo17,
+    'EquipmentInfo18': EquipmentInfo18,
+    'EquipmentInfo19': EquipmentInfo19,
+    'EquipmentInfo20': EquipmentInfo20
+}
+
 
 class EquipmentInfoService:
 
@@ -43,3 +71,7 @@ class EquipmentInfoService:
     @staticmethod
     def randoms_choice_equipment_info():
         return random.choice(EQUIPMENT_INFO_LIST)
+
+    @staticmethod
+    def randoms_choice_equipment_info_key():
+        return random.choice(EQUIPMENT_INFO_KEY_LIST)