遗留问题
- 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.get
columns = ["key", "raw", "store_time", "expire_time", "access_time", "access_count", "tag", "size", "mode",
"filename", "value"]
column = ",".join(columns)
rows = None
if 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 hashlib
data = "你好" # 要进行加密的数据
data_sha = hashlib.sha256(data.encode('utf-8')).hexdigest()
print(data_sha)
需要key用户私钥吗?
不需要,简单点。
简单的实现
import hashlib
import shutil
import os
from .core import Cache
class 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 value
def 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_cache
key1 = "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
想法
- 查询总缓存大小 搞定