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))
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()))
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
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
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
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