zdppy+vue3+onlyoffice文档管理系统实战 20240823上课笔记 Python缓存框架的进一步封装

news2024/11/15 9:49:27

上节课遗留问题

封装一些简单的方法,比如:

  • set:设置缓存,带默认超时时间
  • get:获取缓存
  • delete:删除缓存
  • delete_all:清空缓存

封装set方法

基本方法

from zdppy_cache import Cache

# 创建缓存对象
cache = Cache()

# 关闭缓存对象
cache.close()

# 通过上下文自动关闭缓存对象
with Cache(cache.directory) as reference:
    reference.set('key', 'value')

# 通过缓存对象获取值
print(cache.get('key'))

封装思路

  • 1、基于内存
  • 2、带默认缓存时间,单位秒,默认180秒
  • 3、缓存默认上限 size_limit=100 * 1024 * 1024 100M

基本封装

def set(key, value, expire=180):
    """
    设置缓存
    @param expire 默认过期时间,单位秒,默认180,也就是3分钟
    :return:
    """
    # 设置缓存
    with Cache(cache_directory, ) as cache:
        return cache.set(key, value, expire=expire)

封装get方法

原始代码

value = cache.get('key1')
print('Cached value:', value)  # 输出: Cached value: value1

封装

def get(key):
    """
    根据key获取缓存
    :param key: 缓存的key
    :return:
    """
    with Cache(cache_directory, ) as cache:
        return cache.get(key)

封装delete方法

原始代码

cache.delete('key1')

封装方法

def delete(key):
    """
    根据key删除缓存
    :param key: 缓存的key
    :return:
    """
    with Cache(cache_directory, ) as cache:
        return cache.delete(key)

封装delete_all方法

原始代码

cache.close()
import shutil
try:
    shutil.rmtree(cache.directory)
except OSError:  # Windows wonkiness
    pass

封装代码

def delete_all():
    """
    删除所有的缓存
    :return:
    """
    try:
        shutil.rmtree(cache_directory)
    except OSError:
        pass

测试代码

import zdppy_cache as c

# 设置缓存
key = "code"
value = "A13k"
c.set(key, value)

# 获取缓存
print(c.get(key))

# 删除缓存
c.delete(key)
print(c.get(key))

# 清空缓存
c.delete_all()

测试超时

默认三分钟超时,我们手动设置为3秒超时,3秒以后再访问。

import zdppy_cache as c
import time

# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)

# 获取缓存
print(c.get(key))

# 3秒后再获取
time.sleep(3)
print(c.get(key))

# 清空缓存
c.delete_all()

为什么cache都关闭了还能计算超时

因为数据是存在文件里面的,记录了开始时间和缓存结束时间。当我们get的时候,获取get那个时刻的时间,和缓存结束时间对比,就知道有没有过期了。

底层核心代码如下:

select = (
    'SELECT rowid, expire_time, tag, mode, filename, value'
    ' FROM Cache WHERE key = ? AND raw = ?'
    ' AND (expire_time IS NULL OR expire_time > ?)'
)

if expire_time and tag:
    default = (default, None, None)
elif expire_time or tag:
    default = (default, None)

if not self.statistics and update_column is None:
    # Fast path, no transaction necessary.

    rows = self._sql(select, (db_key, raw, time.time())).fetchall()

想要有可以查询所有key的方法

原本的方法

from zdppy_cache import Cache

cache = Cache()
for key in [4, 1, 3, 0, 2]:
    cache[key] = key
print(list(cache.iterkeys()))

封装方法

def get_all_keys():
    """
    获取所有的key
    :return:
    """
    with Cache(cache_directory) as cache:
        return list(cache.iterkeys())

测试封装的方法

import zdppy_cache as c
import time

# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)

# 获取所有的缓存的key
print(c.get_all_keys())

time.sleep(3)
print("过期后:", c.get_all_keys())

# 清空缓存
c.delete_all()

查询所有有效的key

底层的方法

def iterkeys(self, reverse=False):
    """Iterate Cache keys in database sort order.

    >>> cache = Cache()
    >>> for key in [4, 1, 3, 0, 2]:
    ...     cache[key] = key
    >>> list(cache.iterkeys())
    [0, 1, 2, 3, 4]
    >>> list(cache.iterkeys(reverse=True))
    [4, 3, 2, 1, 0]

    :param bool reverse: reverse sort order (default False)
    :return: iterator of Cache keys

    """
    sql = self._sql
    limit = 100
    _disk_get = self._disk.get

    if reverse:
        select = (
            'SELECT key, raw FROM Cache'
            ' ORDER BY key DESC, raw DESC LIMIT 1'
        )
        iterate = (
            'SELECT key, raw FROM Cache'
            ' WHERE key = ? AND raw < ? OR key < ?'
            ' ORDER BY key DESC, raw DESC LIMIT ?'
        )
    else:
        select = (
            'SELECT key, raw FROM Cache'
            ' ORDER BY key ASC, raw ASC LIMIT 1'
        )
        iterate = (
            'SELECT key, raw FROM Cache'
            ' WHERE key = ? AND raw > ? OR key > ?'
            ' ORDER BY key ASC, raw ASC LIMIT ?'
        )

    row = sql(select).fetchall()

    if row:
        ((key, raw),) = row
    else:
        return

    yield _disk_get(key, raw)

    while True:
        rows = sql(iterate, (key, raw, key, limit)).fetchall()

        if not rows:
            break

        for key, raw in rows:
            yield _disk_get(key, raw)

缓存表的结构

在这里插入图片描述

封装的方法1

    def get_all_keys(self, is_active=False, limit=100000):
        """
        遍历数据库中所有的key,默认查询所有没过期的
        :param is_active: 是否只查没过期的
        :param limit: 默认10000,但是允许做限制
        :return: 遍历到的所有的key,没有返回空列表
        """
        sql = self._sql
        _disk_get = self._disk.get

        rows = None
        if is_active:
            # 查没过期的
            select = 'SELECT key FROM Cache where expire_time < ? LIMIT ?'
            rows = sql(select, (time.time(), limit)).fetchall()
        else:
            # 查所有的
            select = 'SELECT key FROM Cache  LIMIT ?'
            rows = sql(select, (limit,)).fetchall()

        # 返回,这里rows不可能为None,所以可以这么写
        return [v[0] for v in rows]

测试方法1

from zdppy_cache import Cache

cache = Cache("tmp/a")
for key in [4, 1, 3, 0, 2]:
    cache[key] = key

print(cache.get_all_keys())

封装的方法2

def get_all_keys(is_active=True):
    """
    获取所有的key
    :return:
    """
    with Cache(cache_directory) as cache:
        return cache.get_all_keys(is_active=is_active)

测试方法2

import zdppy_cache as c
import time

# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)

# 获取所有的缓存的key
print(c.get_all_keys())

time.sleep(3)
print("默认查询未过期的:", c.get_all_keys())
print("查询过期的:", c.get_all_keys(False))

# 清空缓存
c.delete_all()

查询所有的键值对

import zdppy_cache as c
import time

# 设置缓存
key = "code"
value = "A13k"
c.set(key, value, 3)

# 获取所有的缓存的key-value
print(c.get_all_items())

time.sleep(3)
print("默认查询未过期的:", c.get_all_items())
print("查询过期的:", c.get_all_items(False))

# 清空缓存
c.delete_all()

其他想法

  • 1、封装API
  • 2、有账号密码
  • 3、想要有可以查询所有key的方法 搞定
  • 4、查所有key value的方法,字典格式 搞定
  • 5、查询所有有效的key 搞定
  • 6、查所有有效的key value 搞定
  • 7、查询所有有效的具体数据,也就是缓存的所有字段

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2069982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文字游侠AI工具:一个高效内容创作的革命性助手,效率一键提高20倍!

在当今快节奏、高效率要求的信息时代&#xff0c;传统的内容生产方式已经难以满足不断增长的网络信息需求。随着人工智能技术的飞速发展&#xff0c;一系列创新的AI工具应运而生&#xff0c;极大地改变了我们处理信息和创造内容的方式。其中&#xff0c;文字游侠AI工具凭借其出…

校友会系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;校友管理&#xff0c;生活模块管理&#xff0c;兼职信息管理&#xff0c;表白墙管理&#xff0c;我的收藏管理&#xff0c;校友论坛&#xff0c;系统管理 微信端账号功能包括&…

css实现闪烁渐变背景,@property自定义属性

自 2024 年 7 月起&#xff0c;此功能适用于最新的设备和浏览器版本。此功能可能无法在较旧的设备或浏览器中使用。 property 是 CSS 中一个相对较新的功能&#xff0c;主要用于定义自定义属性&#xff08;即 CSS 变量&#xff09;的类型、继承性以及初始值。它允许开发者更好地…

DevEco Studio 预览器报错踩坑

This module is referencing one or more HSPs and cannot be previewed. To preview components in an HSP, switch to the HSP first. 不知道大家遇见这个问题没有 是因为我们在使用name跳转别的模块的页面时 引入了hsp模块进来 所以他在编译的时候 告诉我们这个模块中引…

pyro 教程 时间序列 单变量,重尾,python pytorch,教程和实例 Forecasting预测,布朗运动项、偏差项和协变量项

预测I:单变量&#xff0c;重尾 本教程介绍了预测模块&#xff0c;用Pyro模型进行预测的框架。本教程只涵盖单变量模型和简单的可能性。本教程假设读者已经熟悉慢病毒感染和张量形状. 另请参见: 预测II:状态空间模型 预测三:层次模型 摘要 要创建预测模型: 创建预测模型班级…

加密学中的零知识证明(Zero-Knowledge Proof, ZKP)到底是什么?

加密学中的零知识证明&#xff08;Zero-Knowledge Proof, ZKP&#xff09;到底是什么&#xff1f; 引言 在加密学的应用中&#xff0c;零知识证明&#xff08;Zero-Knowledge Proof, ZKP&#xff09;无疑是一颗璀璨的明星。它不仅挑战了我们对信息验证的传统认知&#xff0c;…

如何使用ssm实现理发店会员管理系统的设计和实现+vue

TOC ssm089理发店会员管理系统的设计和实现vue 绪论 1.1 选题背景 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。计算机软件可以针对不同行业的营业…

C语言刷题日记(附详解)(2)

一、有理数加法 输入格式&#xff1a; 输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数&#xff0c;其中分子和分母全是整形范围内的正整数。 输出格式&#xff1a; 在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式&#xff0c;若…

OpenCSG全网首发!Phi-3.5 Mini Instruct全参微调中文版

前沿科技速递&#x1f680; &#x1f389; 震撼发布&#xff01;OpenCSG正式推出全参数微调的Phi-3.5-mini-instruct中文版模型&#xff01; &#x1f50d; 本次发布的Phi-3.5-mini-instruct中文版模型基于最新的Phi-3.5架构&#xff0c;经过全参数微调&#xff0c;专为中文场景…

软件测试——JMeter安装配置

文章目录 JMeter介绍JMeter下载及配置配置错误 提示此时不应有...修改语言为中文 JMeter介绍 Apache JMeter 是 Apache 组织基于 Java 开发的压⼒测试⼯具&#xff0c;⽤于对软件做性能测试 JMeter下载及配置 环境要求&#xff1a;JDK版本在1.8及以上 下载压缩包&#xff0c;…

设计模式—代理模式

文章目录 以前自己做的笔记动态代理(重点)1.基于jdk的动态代理2.基于cglib的动态代理 新资料第 15 章 代理模式1、代理模式的基本介绍2、静态代码模式3、动态代理模式4、Cglib 代理模式5、代理模式(Proxy)的变体 代理模式是给某一个对象提供一个代理&#xff0c;并通过代理对象…

第12章 网络 (6)

12.8 网络层 12.8.4 分组转发 转发IP分组&#xff0c;根据目标地址分为&#xff1a; 1. 直接和本地相连。 2. 不直接相连&#xff0c;需要网关转发。 int ip_route_input_noref(skb, daddr, saddr, tos, net_dev)&#xff1a; //查找路由表。 如果 skb->_skb_r…

安捷伦色谱仪器LabVIEW软件替换与禁运配件开发

可行性分析及实现路径 可行性&#xff1a; 软件替换&#xff1a; 驱动程序支持&#xff1a; 要实现LabVIEW对安捷伦色谱仪器的控制&#xff0c;需要检查安捷伦是否提供LabVIEW驱动程序。如果没有现成的驱动&#xff0c;则可能需要开发自定义的驱动程序&#xff0c;通过LabVIEW…

微软推出全新多语言高质量Phi-3.5语言模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

css flex布局 justify-content: space-between 最后两张居左

比如如果是8张&#xff0c;最后两张两边对齐&#xff0c;第八张最后一张 放个占位符就OK了 <div class"previewPadding flex" > <div class"picList picList3" v-for"(item,index) in picDataList" :key"index"> <…

6个免费字体网站,无需担心版权问题~

在设计项目中&#xff0c;选择合适的字体至关重要。然而&#xff0c;许多高质量的字体往往价格不菲。幸运的是&#xff0c;有一些网站提供了免费的商用字体&#xff0c;既能满足设计需求&#xff0c;又不需要额外的预算。在这篇文章中&#xff0c;分享6个免费商用字体网站&…

济南网站制作方案定制

在当今数字化时代&#xff0c;拥有一个专业的网站已经成为企业发展不可或缺的一部分。济南作为山东省的省会&#xff0c;经济发展迅速&#xff0c;各行各业对网站制作的需求也日益增加。因此&#xff0c;定制化的网站制作方案在济南显得尤为重要&#xff0c;能够帮助企业在激烈…

深入探究为什么 RAG 并不总是按预期工作:概述其背后的业务价值、数据和技术。

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 欢迎来到雲闪世界。我们将首先探讨决定基于 RAG 的项目成败的业务要素。然后&#xff0c;我们将深入探讨常见的技术障碍&#xff08;从数据处理到性能优化&#xff09;&#xff0c;并讨论克服这些障碍的策略…

数据结构(邓俊辉)学习笔记】优先级队列 10——左式堆:插入 + 删除

文章目录 1. 插入即是合并2. 删除亦是合并 1. 插入即是合并 以上&#xff0c;我们已经实现了&#xff0c;对于左式堆来说最为在意的合并算法。非常有意思的是&#xff0c;尽管合并操作并非优先级队列所要求的基本操作接口。但基于合并操作&#xff0c;我们却同样可以实现左式堆…

超全大模型训练流程,教你如何训练自己的大模型

“大模型的核心主要有两部分&#xff0c;一是训练数据&#xff0c;二是机器学习模型。” 现在大模型发展得如火如荼&#xff0c;但是没有学过人工智能技术的开发者&#xff0c;只会调用其接口&#xff0c;但不清楚怎么训练一个大模型。 今天就简单介绍一下自己的理解&#xf…