python数据缓存

数据缓存方式

  1. 基于内存,如将数据信息存储到字典中;
  2. 基于文件,如将数据存储到文件中**.txt, **.csv,**.sqlite;
  3. 基于数据库(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)
				# 使用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
  • 优点:数据能够长期保存。
  • 缺点:如果缓存数据较多,会占用较大的磁盘空间。如果缓存的文件较多,文件不容易管理。

基于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服务,即具体准备条件

你可能感兴趣的:(数据缓存,python)