遗留问题
- 1、封装API
- 2、有账号密码
- 3、查询所有有效的具体数据,也就是缓存的所有字段
封装查询所有有效具体数据的方法
基本封装
def get_all(self, is_active=True, limit=100000):"""遍历数据库中所有的key,默认查询所有没过期的:param is_active: 是否只查没过期的:param limit: 默认10000,但是允许做限制:return: 遍历到的所有的key,没有返回空列表"""_disk_get = self._disk.getcolumns = ["key", "raw", "store_time", "expire_time", "access_time", "access_count", "tag", "size", "mode","filename", "value"]column = ",".join(columns)rows = Noneif is_active:# 查没过期的select = f'SELECT {column} FROM Cache where expire_time > ? LIMIT ?'rows = self._sql(select, (time.time(), limit)).fetchall()else:# 查所有的select = f'SELECT {column} FROM Cache LIMIT ?'rows = self._sql(select, (limit,)).fetchall()# 处理data = []for row in rows:item = {}for i in range(len(columns)):item[columns[i]] = row[i]data.append(item)# 返回return data
基本用法
import zdppy_cache as c
import time# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)# 获取所有的缓存的key-value
print(c.get_all())time.sleep(3)
print("默认查询未过期的:", c.get_all())
print("查询过期的:", c.get_all(False))# 清空缓存
c.delete_all()
查询总缓存大小
最简单的方案
它是基于磁盘的,我们统计磁盘大小就知道了。
基本封装
def get_size():"""获取占据的内存大小但是只有在调用方法的那一刻会占据内存,平时都是存储在磁盘中的"""with Cache(cache_directory) as cache:return cache.volume()
使用示例
import zdppy_cache as c
import time# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)# 获取占据磁盘大小
print(c.get_size())# 加很多东西
for i in range(100):c.set(f"zhangsan{i}", i)print(c.get_size())# 清空缓存
c.delete_all()
有账号密码
思路?
账号密码是用来校验权限,主要是为了确定自己专属数据库。
对账号密码做sha256加密得到一个字符串作为缓存目录。如果这个目录存在,说明系统中有该用户,否则没有,新建。
python实现sha256加密
import hashlibdata = "你好" # 要进行加密的数据
data_sha = hashlib.sha256(data.encode('utf-8')).hexdigest()
print(data_sha)
需要key用户私钥吗?
不需要,简单点。
简单的实现
import hashlib
import shutil
import os
from .core import Cacheclass UserCache:def __init__(self, username, password, cache_dir="./tmp/.zdppy_cache"):# 构建缓存目录self.key = hashlib.sha256(f"{username}&&{password}".encode('utf-8')).hexdigest()self.cache_dir = os.path.join(cache_dir, self.key).replace("\\", "/")if not os.path.isdir(self.cache_dir):os.makedirs(self.cache_dir)self.cache = Cache(self.cache_dir)def set(self, key, value, expire=180):"""设置缓存"""self.cache.set(key, value, expire)def get(self, key):"""获取缓存"""value = self.cache.get(key)return valuedef delete_all(self):"""清空缓存"""self.cache.close()try:shutil.rmtree(self.cache_dir)except OSError:pass
使用示例
import zdppy_cache# 设置缓存
key = "code"
value = "A13k"# 设置缓存
c = zdppy_cache.UserCache("admin", "admin123456")
c.set(key, value, 3)# 获取缓存
print(c.get(key))# 让另一个用户去获取缓存
c = zdppy_cache.UserCache("admin", "admin123457")
print("另一个用户", c.get(key))# 清空缓存
c.delete_all()
封装API
基本目标
- 1、管理员,传两个配置的key进来
- 1、设置缓存
- 2、获取缓存
- 3、删除缓存
- 4、清空缓存
- 5、查询所有key,带查询参数:active只查激活的,value包含value默认只获取key
- 6、当前缓存大小
- 7、看所有数据
- 2、普通用户,功能和管理员完全一样,但是必须要传账号密码
实现基于zdppy_api的接口缓存
基本示例:
import api
import zdppy_cachekey1 = "admin"
key2 = "admin123456"
app = api.Api(routes=[*zdppy_cache.zdppy_api.cache(key1, key2, api)]
)if __name__ == '__main__':app.run()
设置缓存:
req -X POST -d '{\"key\":1,\"value\":111}' http://127.0.0.1:8888/zdppy_cache/set
获取缓存:
req -d '{\"key\":1}' http://127.0.0.1:8888/zdppy_cache/get
想法
- 查询总缓存大小 搞定