数据缓存方式
- 基于内存,如将数据信息存储到字典中;
- 基于文件,如将数据存储到文件中**.txt, **.csv,**.sqlite;
- 基于数据库(radis,memcache)。
基于字典即内存的缓存
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
- 用法:使用
@+huancun_info
添加到需要缓存信息的函数名上方。相当于一个装饰器,装饰器用法。
- 缺点:缓存的数据保存周期短,即从缓存装饰器开始执行时到整个程序运行结束。
- 优点:逻辑简单,容易。
基于普通文件的缓存
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)
f.write(result)
return result
else:
with open(cache_path, encoding="utf-8") as f:
result = f.read()
result = ast.literal_eval(result)
return result
return fun
- 优点:数据能够长期保存。
- 缺点:如果缓存数据较多,会占用较大的磁盘空间。如果缓存的文件较多,文件不容易管理。
基于redis的缓存
import redis
def redis_cache(fun_name):
con = redis.Redis()
def fun(*args, **kwargs):
key = "-".join(args)
if not con.exists(key):
info = fun_name(*args, **kwargs)
con.set(key, info)
return info
else:
print("数据已缓存")
return con.get(key)
return fun
- 使用redis准备条件。
- 优点:数据可以保存较长的时间,可以给
con.set()
设置第三个参数,用于记录数据保存的时间单位是秒,默认条件下是永久保存。
- 缺点:使用
redis
数据库,需要导入redis
包,安装redis
数据库,开启redis
服务,即具体准备条件。