Beispiel #1
0
    def sync_device_alive_status():

        # 先获得全体设备最后同步时间
        sync_last_time = redis_device_client.get(
            REDIS_PRE_DEVICE_ALIVE_SYNC_LAST_TIME_KEY)
        if sync_last_time is not None:
            log.info("当前设备存活状态不需要更新到数据库, 上次同步时间: {}".format(sync_last_time))
            return

        start_time = time.time()

        # 获得全部设备信息
        device_list = Device.get_all()
        for device in device_list:
            # 更新设备存活状态
            update_info = {
                Device.alive:
                DeviceService.get_device_alive_status(device.device_code),
                Device.utime:
                datetime.now()
            }
            Device.query.filter_by(id=device.id).update(update_info)

        # 存入最新同步时间
        redis_device_client.setex(REDIS_PRE_DEVICE_ALIVE_SYNC_LAST_TIME_KEY,
                                  DEFAULT_EXPIRED_DEVICE_ALIVE_SYNC,
                                  get_now_time())

        log.info("同步设备存活状态数目为: count = {}".format(len(device_list)))
        log.info("同步设备存活信息花费时间: start_time = {} use time = {} s".format(
            start_time,
            time.time() - start_time))
Beispiel #2
0
    def keep_device_heart(device_code):
        # 先获得心跳的主键
        device_heart_key = RedisClient.get_device_heart_key(device_code)

        redis_device_client.setex(device_heart_key,
                                  DEFAULT_EXPIRED_DEVICE_HEART,
                                  int(time.time()))
Beispiel #3
0
    def get_update_state(device_code):

        if isinstance(device_code, Device):
            return device_code.update_state

        if isinstance(device_code, basestring):
            device_update_key = RedisClient.get_device_update_status_key(
                device_code)
            update_state = redis_device_client.get(device_update_key)
            if update_state is not None:
                return update_state

            log.info("当前设备游戏更新状态还未缓存: device_code = {}".format(device_code))
            device = DeviceService.get_device_by_code(device_code)
            if device is None:
                log.error(
                    "当前设备号没有搜索到设备信息: device_code = {}".format(device_code))
                return None

            # 缓存游戏更新设备状态
            redis_device_client.setex(device_update_key,
                                      DEFAULT_EXPIRED_DEVICE_STATUS,
                                      device.update_state)
            return device.update_state

        log.error("当前参数既不是字符串类型也不是Device类型: type = {}".format(
            type(device_code)))
        return None
Beispiel #4
0
    def set_update_state(device, update_state, last_update_time=None):

        # 如果传出的是 设备号 则查找
        if isinstance(device, basestring):
            device = DeviceService.get_device_by_code(device)
            if device is None:
                return False

        update_info = {Device.update_state: update_state}

        if last_update_time is not None:
            update_info[Device.last_update_time] = last_update_time

        rowcount = Device.query.filter_by(id=device.id).update(update_info)
        if rowcount <= 0:
            log.error("设备游戏更新状态更新失败: device_id = {} update_state = {}".format(
                device.id, update_state))
            return False

        log.info("设备更新状态写入数据库完成: rowcount = {} ".format(rowcount))
        device_update_key = RedisClient.get_device_update_status_key(
            device.device_code)

        # 存储状态到redis中 状态只保存一天,防止数据被删除 缓存一直存在
        redis_device_client.setex(device_update_key,
                                  DEFAULT_EXPIRED_DEVICE_STATUS, update_state)
        log.info(
            "设备更新状态设置成功: device_id = {} device_code = {} update_state = {}".
            format(device.id, device.device_code, update_state))

        return True
Beispiel #5
0
    def set_device_status(device, device_status):
        '''
        :param device: Device 类型
        :param device_status:
        :return:
        '''
        if not isinstance(device, Device):
            log.error("当前设置设备状态传入参数错误: device = {} type = {}".format(
                device, type(device)))
            return False

        if device_status not in Device.STATUS_VALUES:
            log.error(
                "当前设置设备状态传入参数错误: device_status = {}".format(device_status))
            return False

        # 先更新数据库,确保数据更新成功
        update_info = {
            Device.state: device_status,
            Device.state_version: device.state_version + 1
        }
        rowcount = Device.query.filter_by(
            id=device.id,
            state_version=device.state_version).update(update_info)
        if rowcount <= 0:
            log.error(
                "更新设备状态失败,版本信息已经被修改: id = {} state_version = {} state = {}".
                format(device.id, device.state_version, device_status))
            return False

        log.info("设备状态写入数据库完成: rowcount = {} ".format(rowcount))
        device_status_key = RedisClient.get_device_status_key(
            device.device_code)

        # 存储状态到redis中 状态只保存一天,防止数据被删除 缓存一直存在
        redis_device_client.setex(device_status_key,
                                  DEFAULT_EXPIRED_DEVICE_STATUS, device_status)
        log.info(
            "设备状态设置成功: device_id = {} device_code = {} state = {} state_version = {}"
            .format(device.id, device.device_code, device_status,
                    device.state_version + 1))
        return True
Beispiel #6
0
    def get_device_status(device):
        '''
        获取设备使用状态
        :param device: basestring or Device 类型
        :return:
        '''

        if isinstance(device, basestring):
            device_code = device
        elif isinstance(device, Device):
            # 如果传入的是设备信息直接返回设备使用状态即可, 缓存和数据库中的设备信息是保持严格一致的,只要写入则同时写入缓存和数据库
            return device.state
        else:
            log.error("当前参数数据类型不正确: device = {} type = {}".format(
                device, type(device)))
            return None

        # 先判断是否在缓存中
        device_status_key = RedisClient.get_device_status_key(device_code)

        device_status = redis_device_client.get(device_status_key)
        if device_status is not None:
            return device_status

        # 没有从缓存中找到设备状态 则去数据库中找
        device = DeviceService.get_device_by_code(device_code)
        if device is None:
            log.error("当前设备码没有从缓存中找到,也不存在于数据库中: device_code = {}".format(
                device_code))
            return None

        # 存储状态到redis中 状态只保存一天,防止数据被删除 缓存一直存在
        redis_device_client.setex(device_status_key,
                                  DEFAULT_EXPIRED_DEVICE_STATUS, device.state)

        log.info(
            "当前设备状态从数据库中加载, 缓存到redis中: device_code = {}".format(device_code))
        return device.state