def get_model_for_url(self, key): """通过当前页面路由url,获取菜单对应的记录""" # 使用md5生成对应的缓存key值 key_md5 = encrypt_helper.md5(key) # 从缓存中提取菜单记录 model = cache_helper.get(key_md5) # 记录不存在时,运行记录载入缓存程序 if not model: self._load_cache() model = cache_helper.get(key_md5) return model
def del_relevance_cache(self): """删除关联缓存————将和数据表记录关联的,个性化缓存全部删除""" # 从nosql中读取全局缓存列表 cache_list = cache_helper.get(self.__cache_list) # 清除已删除缓存列表 cache_helper.delete(self.__cache_list) if cache_list: # 执行删除操作 for cache in cache_list: cache_helper.delete(cache)
def add_operation_times(operation_times_key): """ 累加操作次数 参数: operation_times_key 缓存key """ # 获取当前用户已记录操作次数 get_operation_times = convert_helper.to_int0( cache_helper.get(operation_times_key)) # 记录获取次数 cache_helper.set(operation_times_key, get_operation_times + 1, 600)
def add_relevance_cache_in_list(self, key): """将缓存名称存储到列表里————主要存储与记录变更关联的""" # 从nosql中读取全局缓存列表 cache_list = cache_helper.get(self.__cache_list) # 判断缓存列表是否有值,有则进行添加操作 if cache_list: # 判断是否已存储列表中,不存在则执行添加操作 if not key in cache_list: cache_list.append(key) cache_helper.set(self.__cache_list, cache_list) # 无则直接创建全局缓存列表,并存储到nosql中 else: cache_list = [key] cache_helper.set(self.__cache_list, cache_list)
def get_model_for_cache(self, pk): """从缓存中读取数据库记录""" # 生成缓存key key = self.get_cache_key(pk) # 从缓存中读取数据库记录 result = cache_helper.get(key) # 缓存中不存在记录,则从数据库获取 if not result: result = self.get_model_for_pk(pk) self.set_model_for_cache(pk, result) if result: return result else: return {}
def get_model_for_cache_of_where(self, where): """ 通过条件获取记录实体——条件必须是额外的主键,也就是说记录是唯一的(我们经常需要使用key、编码或指定条件来获取记录,这时可以通过当前方法来获取) :param where: 查询条件 :return: 记录实体 """ # 生成实体缓存key model_cache_key = self.__table_name + encrypt_helper.md5(where) # 通过条件从缓存中获取记录id pk = cache_helper.get(model_cache_key) # 如果主键id存在,则直接从缓存中读取记录 if pk: return self.get_model_for_cache(pk) # 否则从数据库中获取 result = self.get_model(where) if result: # 存储条件对应的主键id值到缓存中 cache_helper.set(model_cache_key, result.get(self.__pk_name)) # 存储记录实体到缓存中 self.set_model_for_cache(result.get(self.__pk_name), result) return result
def check_operation_times(operation_name, limiting_frequency, ip, is_add=True): """ 检查操作次数 参数: operation_name 操作名称 limiting_frequency 限制次数 is_add 是否累加 返回参数: True 不限制 False 限制操作 """ if not operation_name or limiting_frequency is None: return False, '参数错误,错误码:-400-001,请与管理员联系', '', 0 # 如果限制次数为0时,默认不限制操作 if limiting_frequency <= 0: return True, '', '', 0 ############################################################## ### 判断用户操作次数,超出次数限制执行 ### # 获取当前用户已记录操作次数 operation_times_key = operation_name + '_' + encrypt_helper.md5( operation_name + ip) operation_times = convert_helper.to_int0( cache_helper.get(operation_times_key)) # 如果系统限制了出错次数,且当前用户已超出限制,则返回错误 if limiting_frequency and operation_times >= limiting_frequency: return False, '您在10分钟内连续操作次数达到' + str( limiting_frequency ) + '次,已超出限制,请稍候再试', operation_times_key, operation_times if is_add: # 记录操作次数,默认在缓存中存储10分钟 cache_helper.set(operation_times_key, operation_times + 1, 600) return True, '', operation_times_key, operation_times
def _load_cache(self): """全表记录载入缓存""" # 生成缓存载入状态key,主要用于检查是否已执行了菜单表载入缓存判断 cache_key = self.__table_name + '_is_load' # 将自定义的key存储到全局缓存队列中(关于全局缓存队列请查看前面ORM对应章节说明) self.add_relevance_cache_in_list(cache_key) # 获取缓存载入状态,检查记录是否已载入缓存,是的话则不再执行 if cache_helper.get(cache_key): return # 从数据库中读取全部记录 result = self.get_list() # 标记记录已载入缓存 cache_helper.set(cache_key, True) # 如果菜单表没有记录,则直接退出 if not result: return # 循环遍历所有记录,组合处理后,存储到nosql缓存中 for model in result.get('rows', {}): # 提取菜单页面对应的接口(后台菜单管理中的接口值,同一个菜单操作时,经常需要访问多个接口,所以这个值有中存储多们接口值) interface_url = model.get('interface_url', '') if not interface_url: continue # 获取前端html页面地址 page_url = model.get('page_url', '') # 同一页面接口可能有多个,所以需要进行分割 interface_url_arr = interface_url.replace('\n', '').replace( ' ', '').split(',') # 逐个接口处理 for interface in interface_url_arr: # html+接口组合生成key url_md5 = encrypt_helper.md5(page_url + interface) # 存储到全局缓存队列中,方便菜单记录更改时,自动清除这些自定义缓存 self.add_relevance_cache_in_list(url_md5) # 存储到nosql缓存 cache_helper.set(url_md5, model)