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) }

好了,现在关于数据结构设计好了

取值放值逻辑

  1. 放值

    放值的时候需要设置一下「放入的时间」和「过期时间」还有「具体的值」这三个字段

    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)
    
  2. 取值

    取值的时候需要检查是否过期

    • 过期:删除 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基于内存缓存简单实现相关推荐

  1. Python基于keras训练简单微笑识别

    文章目录 一.数据预处理 二.训练模型 创建模型 训练模型 训练结果 三.预测 效果 四.源代码 pretreatment.py train.py predict.py 一.数据预处理 实验数据来自g ...

  2. python socket 网络聊天室_Python基于Socket实现简单聊天室

    本文实例为大家分享了Python基于Socket实现简单聊天室,供大家参考,具体内容如下 服务端 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Ti ...

  3. python基于值的自动内存管理方式_为什么说Python采用的是基于值的内存管理模式...

    展开全部 内存管理架构: 1.python的内存管理机制由两部分组成,其由PYMALLOC_DEBUG控制,在debug模式下的内存管理机制和正常模32313133353236313431303231 ...

  4. python基于值得内存_为什么说Python采用的是基于值的内存管理模式

    匿名用户 1级 2018-01-31 回答 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++, ...

  5. python基于值的内存管理模式_为什么说python采用的是基于值的内存管理模式

    匿名用户 1级 2018-05-20 回答 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++, ...

  6. [项目回顾]基于Annotation与SpringAOP的缓存简单解决方案

    [项目回顾]基于Annotation与SpringAOP的缓存简单解决方案 参考文章: (1)[项目回顾]基于Annotation与SpringAOP的缓存简单解决方案 (2)https://www. ...

  7. python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析

    这篇文章主要介绍了python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析的实例,帮助大家更好的理解和学习使用python.感兴趣的朋友可以了解下 一.环境准备 python3.8.3 ...

  8. Neo4j离线环境搭建与基于python中py2neo的简单操作

    Neo4j离线环境搭建与基于python中py2neo的简单操作 1 安装与配置 1.1 Neo4j安装 1.2 python操作环境配置 2 Neo4j操作 2.1 创建: 创建点 创建点边: 2. ...

  9. python 基于numpy数组的简单图像处理

    文章目录 使用PIL库进行灰度处理 将其旋转180度 使用matplotlib库完成灰度处理 python 基于numpy数组的简单图像处理 如图,以该猫咪图片为例(忽略水印).将该文件命名为cat. ...

最新文章

  1. 全网唯一秃头数据集:20 万张人像,网罗各类秃头
  2. 浏览器兼容问题IE兼容模式下 SCRIPT1028: 缺少标识符、字符串或数字
  3. uipath sequence传递参数_多孔材料测试及声学参数识别(中)_多孔材料声学参数正向识别...
  4. http://blog.chinaunix.net/uid-25082381-id-3242162.html
  5. 757计算机电子元件,飞行员的好帮手 波音757的发动机指示与机组报警系统简介...
  6. Packer创建阿里云本地镜像
  7. 《零基础看得懂的C语言入门教程 》——(三)轻轻松松理解第一个C语言程序
  8. Linux CentOS 查看服务器信息命令及其它常用命令
  9. 在java代码中设置TextView文本内容可滚动
  10. wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
  11. 信息熵,交叉熵,KL散度,JS散度之间的关系
  12. 【全网最详细】 树莓派控制ws2812b灯带 点亮教程
  13. 在线编辑word文档
  14. 1. 数理统计---数理统计基本概念
  15. 科技进步计算机开机速度,笔者教你电脑开机慢怎么办
  16. 01 【介绍 使用步骤 引入方式 基础配置】
  17. 获取电脑内存信息 VC
  18. AI 可以从人类思维中学习的11个启示
  19. iOS-记一些官网地址
  20. TSFS终端存储文件系统边缘计算技术构架

热门文章

  1. 汉王 PDF OCR
  2. 华为大数据战略_华为大数据开源战略部部长陈亮 - Apache CarbonData,实现大数据即席查询秒级响应...
  3. 南昌大学计算机与信息调剂,南昌大学计算机应用技术调剂生复试经验
  4. 给大家介绍一个大文件传输软件
  5. 【软路由】J4125安装PVE7.3+iKuai+OpenWrt+NAS+Win10+Debian+CentOS
  6. vue项目 - 实现页面打印成PDF格式
  7. S4 HANA在建工程(AuCs)期初数据整理和导入相关配置-AS91/ABLDT_OI
  8. html里div水平居中,html+css div水平居中的几种方法
  9. C语言:函数调用逆序输出
  10. 医疗器械计算机管理系统,《三类医疗器械计算机管理系统要求》.docx