Python基于内存缓存简单实现
Python基于内存缓存简单实现
整体设计思路
整体是使用字典来进行存储键值对。
过期时间?
想要知道一个缓存的 key 是否失效,就必须知道这个 key 是啥时候放进去的,所以需要有一个 put_time 记录;
同时需要设置失效时间,所以还需要一个多长时间失效的 expired 记录;
那么现在的字典格式就变成了:
{ key: [value, put_time, expired]}
后面的 list 可以进一步封装为一个 Value 对象
class Value:def __init__(self, value, put_time, expired):"""缓存值对象:param value: 具体的值:param put_time: 放入缓存的时间:param expired: 缓存失效时间"""self.value = valueself.put_time = put_timeself.expired = expired
现在字典的样子就变成了:
{ key: Value(value, put_time, expired) }
好了,现在关于数据结构设计好了
取值放值逻辑
放值
放值的时候需要设置一下「放入的时间」和「过期时间」还有「具体的值」这三个字段
def set_value(self, k, v, expired):"""将值放入缓存中:param k: 缓存的 key:param v: 缓存值:param expired: 缓存失效时间,单位秒(s)"""current_timestamp = int(time.time()) # 获取当前时间戳 10 位 秒级value = Value(v, current_timestamp, expired)self.__cache[k] = valuelogger.info("已放入缓存, key: {} {}", k, value)
取值
取值的时候需要检查是否过期
- 过期:删除 key,不让它占内存了
- 不过期:去除 key 对应的 value 返回
def check_key(self, k):"""检查缓存是否可用:param k: 缓存 key:return: True or False"""current_timestamp = int(time.time())value = self.__cache.get(k, None)# 考虑k不存在的情况if value is None:return Falsediffer = current_timestamp - value.put_timeif differ > value.expired:del self.__cache[k] # 证明缓存失效了,删除键值对logger.info("缓存已失效, key: {}", k)return Falsereturn Truedef get_value(self, k):"""通过缓存key获取值:param k: key:return: value"""if self.check_key(k):return self.__cache[k].valuereturn None
如何全局使用一个缓存对象呢?
python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc
文件,当第二次导入时,就会直接加载 .pyc
文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:
class Singleton(object):def foo(self):pass
singleton = Singleton()
使用:
from a import singleton
好了,现在可以全局使用一个缓存对象,并且还拥有 set 和 get 逻辑,还带有过期时间,一个简单的缓存已经实现了!
整体代码
cache.py
"""
基于内存缓存
使用 memory_cache 实例即可
"""
import timefrom loguru import loggerclass Value:def __init__(self, value, put_time, expired):"""缓存值对象:param value: 具体的值:param put_time: 放入缓存的时间:param expired: 缓存失效时间"""self.value = valueself.put_time = put_timeself.expired = expireddef __str__(self):return f"value: {self.value} put_time: {self.put_time} expired: {self.expired}"class MemoryCache:def __init__(self):self.__cache = {}def set_value(self, k, v, expired):"""将值放入缓存中:param k: 缓存的 key:param v: 缓存值:param expired: 缓存失效时间,单位秒(s)"""current_timestamp = int(time.time()) # 获取当前时间戳 10 位 秒级value = Value(v, current_timestamp, expired)self.__cache[k] = valuelogger.info("已放入缓存, key: {} {}", k, value)def check_key(self, k):"""检查缓存是否可用:param k: 缓存 key:return: True or False"""current_timestamp = int(time.time())value = self.__cache.get(k, None)# 考虑k不存在的情况if value is None:return Falsediffer = current_timestamp - value.put_timeif differ > value.expired:del self.__cache[k] # 证明缓存失效了,删除键值对logger.info("缓存已失效, key: {}", k)return Falsereturn Truedef get_value(self, k):"""通过缓存key获取值:param k: key:return: value"""if self.check_key(k):return self.__cache[k].valuereturn Nonememory_cache = MemoryCache()
使用
测试放入一个 3 秒过期的缓存,再放入一个 6 秒过期的,然后 sleep 5 秒
看看 6 秒过期的缓存是否可以正常取出,3 秒过期的缓存是否失效,进行验证
test.py
import timefrom cache import memory_cachememory_cache.set_value('my_blog', 'sunnyc.icu', 3) # 设置一个 3 秒过期的键值对
memory_cache.set_value('my_github', 'hczs', 6) # 设置一个 6 秒过期的键值对
time.sleep(5)
print('my_blog: ', memory_cache.get_value('my_blog'))
print('my_github: ', memory_cache.get_value('my_github'))
测试结果:
2022-03-19 10:53:34.021 | INFO | cache:set_value:43 - 已放入缓存, key: my_blog value: sunnyc.icu put_time: 1647658414 expired: 3
2022-03-19 10:53:34.021 | INFO | cache:set_value:43 - 已放入缓存, key: my_github value: hczs put_time: 1647658414 expired: 6
my_blog: None
my_github: hczs
2022-03-19 10:53:39.032 | INFO | cache:check_key:60 - 缓存已失效, key: my_blog
Python基于内存缓存简单实现相关推荐
- Python基于keras训练简单微笑识别
文章目录 一.数据预处理 二.训练模型 创建模型 训练模型 训练结果 三.预测 效果 四.源代码 pretreatment.py train.py predict.py 一.数据预处理 实验数据来自g ...
- python socket 网络聊天室_Python基于Socket实现简单聊天室
本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...
- python基于值的自动内存管理方式_为什么说Python采用的是基于值的内存管理模式...
展开全部 内存管理架构: 1.python的内存管理机制由两部分组成,其由PYMALLOC_DEBUG控制,在debug模式下的内存管理机制和正常模32313133353236313431303231 ...
- python基于值得内存_为什么说Python采用的是基于值的内存管理模式
匿名用户 1级 2018-01-31 回答 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++, ...
- python基于值的内存管理模式_为什么说python采用的是基于值的内存管理模式
匿名用户 1级 2018-05-20 回答 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++, ...
- [项目回顾]基于Annotation与SpringAOP的缓存简单解决方案
[项目回顾]基于Annotation与SpringAOP的缓存简单解决方案 参考文章: (1)[项目回顾]基于Annotation与SpringAOP的缓存简单解决方案 (2)https://www. ...
- python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...
- Neo4j离线环境搭建与基于python中py2neo的简单操作
Neo4j离线环境搭建与基于python中py2neo的简单操作 1 安装与配置 1.1 Neo4j安装 1.2 python操作环境配置 2 Neo4j操作 2.1 创建: 创建点 创建点边: 2. ...
- python 基于numpy数组的简单图像处理
文章目录 使用PIL库进行灰度处理 将其旋转180度 使用matplotlib库完成灰度处理 python 基于numpy数组的简单图像处理 如图,以该猫咪图片为例(忽略水印).将该文件命名为cat. ...
最新文章
- 全网唯一秃头数据集:20 万张人像,网罗各类秃头
- 浏览器兼容问题IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
- uipath sequence传递参数_多孔材料测试及声学参数识别(中)_多孔材料声学参数正向识别...
- http://blog.chinaunix.net/uid-25082381-id-3242162.html
- 757计算机电子元件,飞行员的好帮手 波音757的发动机指示与机组报警系统简介...
- Packer创建阿里云本地镜像
- 《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序
- Linux CentOS 查看服务器信息命令及其它常用命令
- 在java代码中设置TextView文本内容可滚动
- wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
- 信息熵,交叉熵,KL散度,JS散度之间的关系
- 【全网最详细】 树莓派控制ws2812b灯带 点亮教程
- 在线编辑word文档
- 1. 数理统计---数理统计基本概念
- 科技进步计算机开机速度,笔者教你电脑开机慢怎么办
- 01 【介绍 使用步骤 引入方式 基础配置】
- 获取电脑内存信息 VC
- AI 可以从人类思维中学习的11个启示
- iOS-记一些官网地址
- TSFS终端存储文件系统边缘计算技术构架
热门文章
- 汉王 PDF OCR
- 华为大数据战略_华为大数据开源战略部部长陈亮 - Apache CarbonData,实现大数据即席查询秒级响应...
- 南昌大学计算机与信息调剂,南昌大学计算机应用技术调剂生复试经验
- 给大家介绍一个大文件传输软件
- 【软路由】J4125安装PVE7.3+iKuai+OpenWrt+NAS+Win10+Debian+CentOS
- vue项目 - 实现页面打印成PDF格式
- S4 HANA在建工程(AuCs)期初数据整理和导入相关配置-AS91/ABLDT_OI
- html里div水平居中,html+css div水平居中的几种方法
- C语言:函数调用逆序输出
- 医疗器械计算机管理系统,《三类医疗器械计算机管理系统要求》.docx