Método de cache de dados
- Com base na memória, como armazenar informações de dados em um dicionário;
- Com base em arquivos, como armazenamento de dados em arquivos **.txt, **.csv, **.sqlite;
- Com base no banco de dados (redis, memcache).
Cache baseado no dicionário como memória [decorador]
def huancun_info(fun_name):
dict_info = {}
def fun(*args, **kwargs):
key = "-".join(args)
if key not in dict_info.keys():
info = fun_name(*args, **kwargs)
dict_info[key] = info
return info
else:
print("已缓存,直接返回数据")
return dict_info[key]
return fun
- Uso: Use para
@+huancun_info
adicionar acima do nome da função que requer informações em cache.
- Desvantagem: O período de armazenamento dos dados em cache é curto, ou seja, desde o início da execução do decorador de cache até o final de todo o programa.
- Vantagens: lógica simples, fácil.
Cache comum baseado em arquivo
import re
import ast
def file_cache(fun_name):
def fun(*args, **kwargs):
filename = "-".join(args)
# 文件名中不能包含\/:*?"<>|,使用正则表达式将这些数据替换成空
pattern = re.compile("""(\\\|/|:|\*|\?|\"|<|>|\|)""")
filename = pattern.sub("", filename)
cache_path = f"{filename}.txt"
if not os.path.exists(cache_path):
result = fun_name(*args, **kwargs)
with open(cache_path, "w", encoding="utf-8") as f:
# 强制类型转换
result = str(result)
# 使用write写入文件操作,参数必须是字符串
f.write(result)
return result
else:
with open(cache_path, encoding="utf-8") as f:
result = f.read()
# 使用literal_eval函数将文件中读取的数据转换为原来的数据
result = ast.literal_eval(result)
return result
return fun
- Vantagens: Os dados podem ser armazenados por um longo período de tempo.
- Desvantagem: Se houver muitos dados armazenados em cache, eles ocuparão muito espaço em disco. Se houver muitos arquivos em cache, os arquivos não serão fáceis de gerenciar.
Cache baseado em Redis
- Use redis para preparar as condições.
- Vantagens: Os dados podem ser salvos por um longo tempo e
con.set()
o terceiro parâmetro pode ser definido. A unidade de tempo para salvar os dados gravados é segundos e é salvo permanentemente por padrão.
- Desvantagens: Para usar
redis
o banco de dados, você precisa importar redis
pacotes, instalar redis
o banco de dados e iniciar redis
o serviço, ou seja, as condições específicas de preparação .