iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >利用Python编写一个简单的缓存系统
  • 308
分享到

利用Python编写一个简单的缓存系统

Python实现缓存系统Python缓存系统Python缓存 2023-05-16 15:05:01 308人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录项目展示不用落地的缓存系统系统应该如何实现铺垫python字典基本操作定义一个不用落地的缓存系统数据如何落地将对象保存到磁盘将对象从磁盘中导入到内存中将数据落地和缓存系统结合起来

我们昨天已经学习Python的文件读写,今天来做一个最简单的例子,写一个最简单的缓存系统,要求:

key``value的方式保持数据,并且需要将内容中的数据落地到文件,以便下次启动的时候,将文件的内容加载进内存中来。

还是需要声明一点,本篇文章所依赖的python环境为:

代码已经放到了gitee上,gitee地址: gitee.com/pdudo/Golearn/blob/master/python/cacheDB/main.py

项目展示

demo将分为2个部分展示,第一个部分我们会写入一些keyvalue进入到缓存系统中,而后关闭程序。

第二部分则会去获取第一个部分写入的key的名称。

第一部分main方法如下:

def main() -> None:
    c = dbCache("db.cache")
    c.cacheSetting(queueMaxKeys=3,ageSec=3)
    c.set("name","pdudo")
    c.set("site","juejin")
    c.set("hello","Word")
    c.set("hello","pdudo")

其中,dbCache是我们定义的类,而set是写入方法,cacheSetting设置一些基础环境变量,例如:

  • queueMaxKeys: 需要制定增删改缓存队列,类型为int,如果满了,则立即落地到磁盘中。
  • ageSec: 间隔时间,参数为秒数,若操作第一个key和操作第二个key时间大于该设置,则落地到磁盘。

set则是写入方法,参数为keyvalue

运行后,代码效果如下:

由于我们只有set,所以不会输出任何信息,上述open file error 是正常的警告信息,不用管它。

第一部分操作完毕了,我们可以修改第二部分,使用get去获取第一次存储的数据。

修改main如下:

def main() -> None:
    c = dbCache("db.cache")
    c.cacheSetting(queueMaxKeys=3,ageSec=3)
    print(c.get("name"))
    print(c.get("hello"))
    print(c.get("site"))

运行后,效果如下:

由此可以验证,从磁盘读取文件并且加载进内存,没什么问题。

除此之外,该库还支持其他操作,例如:

# 定义一个缓存对象
c = dbCache("db.cache")
# 配置环境变量
c.cacheSetting(queueMaxKeys=3,ageSec=3)
# 写
c.set("name","pdudo")
# 读
print(c.get("name"))
# 修改
c.update("name", "juejin")
# 删除
c.delete("name")

接下来,我们就来看下,如何一步一步完成这个最简单的缓存系统。

不用落地的缓存系统系统应该如何实现

python中,给我们提供了很多基础的数据类型,例如 列表、字典等。所以说,就没必要自己在定义一套属于自己的数据类型了,可以直接使用现有的数据类型,例如本篇文章所使用的就是字典,这里简单的铺垫一下字典的增删改查。

铺垫python字典基本操作

定义一个空的字典a,可以使用如下代码:

a = {}

写入key可以直接使用a[key] = value即可,例如:

a["name"] = "pdudo"

修改也是和上述一样的

关于查询,我们直接使用a[key]即可。

若没有这个key会抛错: KeyError: 'key'

print(a["name"])

检查是否存在key,可以使用key in dict来判断,例如: 想判断name是否是字典a中的key,可以写为:

print("name" in a)

若存在于a中,会返回True,否则会返回False

定义一个不用落地的缓存系统

有了上述关于字典的基本操作,我们可以将其封装一下,定义为自己的操作方法,例如:

class cacheDB():
    def __init__(self):
        #定义空的字典
        self.cache = {}
        
    #增
    def set(self,key,value):
        self.cache[key] = value
        
    #查
    def get(self,key):
        return self.cache[key]
        
    #修
    def update(self,key,value):
        self.cache[key] = value
        
   #删除
   def delete(self,key):
       del self.cache[key]
       
def main():
    c = cacheDB()
    c. set("name","pdudo")
    print(c.get("name"))
    c.update("name","juejin")
    print(c.get("name"))
    c.delete("name")
    
if __name__ == '__main__':
    main()

我们可以将上述方法,封装在一个class中,从而实现调用。

例如,运行之后结果为:

数据如何落地

上述,我们已经写了一个最简单的缓存系统,如果此时进程挂掉了,重新启动后,内存中的数据就都没了,所以为了避免重启后数据丢失,可以将数据定时落地到磁盘中,本篇文章所介绍的内置库为: pickle,该可可以将python对象存储到文件中,从而保存到磁盘,这个对象可以是字典、也可以是列表,我们来看下,具体方法:

将对象保存到磁盘

使用pickledump方法,可以将对象保持到文件中,这里举一个很简单的例子:

import pickle

list1 = ["name","juejin","hello"]

with open("test.txt","wb") as f:
    pickle.dump(list1,f)

上述代码,先引入了pickle库,而后定义了列表list1,最后打开文件,使用pickle.dump将列表对象保持到文件中,这里保存的是二进制,所以是wb模式。使用with...open方法,它可以主动在最后帮我们关闭文件句柄。

此时如我们执行脚本后,想查看一下文件,会发现是二进制格式的,例如:

将对象从磁盘中导入到内存中

上述,我们已经将对象保持到磁盘中,接下来,我们使用pickleload方法,将磁盘数据导入到内存中来,这里同样举一个很简答的例子:

import pickle

with open("test.txt","rb") as f:
    list2 = pickle.load(f)

print(list2)

上述代码,还是先引入pickle库,而后在以二进制的模式读取文件,最后通过pickle.load方法,将数据从磁盘中导入到list2下,接着输出list2的值。

运行后,可以发现,该值就是我们上述落地到磁盘的对象:

将数据落地和缓存系统结合起来

我们已经将数据落地测试完毕了,如何和缓存系统结合起来呢? 很简单,我们仅需要在程序启动时,检测一下是否有该文件,若有,则直接读取数据再并入到对象中,否则创建一个新的字典就好。

而后每次有增删改操作,都将数据落地即可,这里用新增数据函数举个例子:

class cacheDB():
    def __init__(self):
        try:
            with open("db.cache","rb") as f:
                self.cache = pickle.load(f)
        except Exception as e:
            self.cache = {}

    def set(self,key,value):
        self.cache[key] = value
        with open("db.cache","wb") as f:
            pickle.dump(self.cache,f)

上述在cacheDB__init__ 函数中,就尝试读取本地文件db.cache,若存在,就load到内存中,若不存在,就创建一个新的字典。

这样的话,存储的数据就不会因为程序重启而丢失了。

如何保证并发安全

作为一个服务对开提供访问时,需要注意一下并发安全,当多个函数对一个变量进行操作的时候,很容易引起数据混乱,所以还是有必要加一下的,我们可以引入threading库来完成加锁解锁操作,其加锁和解锁代码如下:

import threading

lock = threading.Lock # 定义lock
lock.acquire() # 加锁
lock.release() # 释放锁

我们可以将次引入到代码中,例如:

import pickle
import threading

lock = threading.lock
class cacheDB():
    def __init__(self):
        try:
            with open("db.cache","rb") as f:
                self.cache = pickle.load(f)
        except Exception as e:
            self.cache={}
            
    def set(self,key,value):
        lock.acquire()
        self.cache[key] = value
        with open("db.cache","wb") as f:
            pickle.dump(self.cache,f)
        lock.release()
        
def main():
    db = cacheDB()
    
if __name__ == '__main__':
    main()

这里就不做演示了。

总结

本篇文章,介绍如何写一个最简单的缓存系统,其核心点是定义了一个字典类型来保存key/value数据,并且根据相应的逻辑,使用pickleload方法保持到本地磁盘中,而后需要加载的时候再从本地文件加载到内容中即可,最后作为一个服务,应当考虑到并发安全的问题,给增删改方法加一个锁,从而避免并发问题。最后的最后,再将功能重复代码给踢出来,稍微润色一下,就差不多可以了。

到此这篇关于利用Python编写一个简单的缓存系统的文章就介绍到这了,更多相关Python缓存系统内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 利用Python编写一个简单的缓存系统

本文链接: https://www.lsjlt.com/news/210175.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 利用Python编写一个简单的缓存系统
    目录项目展示不用落地的缓存系统系统应该如何实现铺垫python字典基本操作定义一个不用落地的缓存系统数据如何落地将对象保存到磁盘将对象从磁盘中导入到内存中将数据落地和缓存系统结合起来...
    99+
    2023-05-16
    Python实现缓存系统 Python缓存系统 Python缓存
  • 利用Java编写一个简单的租车系统
    这期内容当中小编将会给大家带来有关利用Java编写一个简单的租车系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实现目标java编写一个控制台版的“租车系统”实现功能   ...
    99+
    2023-05-31
    java 租车系统 ava
  • 用Python编写一个简单的Http S
    原文地址:Write a simple HTTP server in Python http://www.acmesystems.it/python_httpd 例子中源码: https://github.com/tanzi...
    99+
    2023-01-31
    简单 Python Http
  • Python编写一个简单计算器
    一个计算器最主要的功能是加减乘除,那么用 Python 可以怎样实现呢 #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2018/1/22 22:29 # @Author ...
    99+
    2023-01-31
    计算器 简单 Python
  • 利用java编写一个简单的音乐播放器
    今天就跟大家聊聊有关利用java编写一个简单的音乐播放器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下源码:package baidu;import java.awt.*...
    99+
    2023-05-31
    java ava
  • 利用Rust编写一个简单的字符串时钟
    目录1、简介2、用到的知识点2.1 取utc时间2.2 图片变换为像素图案2.3 字符方式显示当前时间2.4 时间刷新1、简介 用rust写的一个简单的练手的demo,一个字符串时钟...
    99+
    2022-12-26
    Rust字符串时钟 Rust 时钟
  • 使用原生JAVA编写一个简单的停车场系统
    本篇文章为大家展示了使用原生JAVA编写一个简单的停车场系统,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。JAVA项目中正号需要一个停车收费系统,就整理出来给大家分享一下,希望对大家有所帮助。<...
    99+
    2023-05-31
    java 停车场系统 ava
  • 怎么用Python编写一个简单的游戏
    本篇内容介绍了“怎么用Python编写一个简单的游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在这个系列中,我们要用不同的编程语言编写相...
    99+
    2023-06-15
  • 利用Python制作一个简单的天气播报系统
    目录前言工具天气数据来源代码实现总结前言 大家好,我是辣条 相信大家都能感觉到最近天气的多变,好几次出门半路天气转变。辣条也深受其扰,直接给我整感冒,就差被隔离起来了,既然天气我没法...
    99+
    2024-04-02
  • 如何通过C++编写一个简单的投票系统?
    如何通过C++编写一个简单的投票系统?随着科技的发展,投票系统已经成为了现代社会中广泛使用的工具。投票系统可以用于选举、调查、决策等许多场景。本文将向您介绍如何通过C++编写一个简单的投票系统。首先,我们需要明确投票系统的基本功能。一个简单...
    99+
    2023-11-04
    C++ 投票系统 简单
  • Python写一个简单的在线编辑器
    直接奔入主题看下面pywebio程序,实现了Python的简陋在线编辑器 from pywebio.input import * from pywebio.output import...
    99+
    2024-04-02
  • 如何使用C++编写一个简单的网上商城系统?
    如何使用C++编写一个简单的网上商城系统?随着互联网的发展,电子商务已经成为人们购物的主要方式之一。为了满足用户的购物需求,开发一个简单实用的网上商城系统是非常有必要的。本文将介绍如何使用C++编写一个简单的网上商城系统。一、需求分析在开始...
    99+
    2023-11-02
    网上商城 C++编程 简单系统
  • 如何使用C++编写一个简单的物流管理系统?
    如何使用C++编写一个简单的物流管理系统?简介:物流管理系统是现代物流业中非常重要的一环,它能够帮助企业高效地管理运输、仓储、配送等物流环节。本文将介绍如何使用C++编写一个简单的物流管理系统,帮助读者了解C++的基本语法和面向对象的编程思...
    99+
    2023-11-04
    C++编写 简单系统。
  • 如何使用C++编写一个简单的学生选课系统?
    如何使用C++编写一个简单的学生选课系统?随着科技的不断发展,计算机编程已经成为了一种必备的技能。而在学习编程的过程中,一个简单的学生选课系统可以帮助我们更好地理解和应用编程语言。在本文中,我们将介绍如何使用C++编写一个简单的学生选课系统...
    99+
    2023-11-02
    C++ 编写 学生选课系统
  • 如何使用C++编写一个简单的餐厅预订系统?
    如何使用C++编写一个简单的餐厅预订系统?餐饮行业是一个快节奏的行业,餐厅经常需要面对繁忙的预订情况。为了有效管理预订,提高服务质量,很多餐厅都会使用电子预订系统。本文将介绍如何使用C++编写一个简单的餐厅预订系统。首先,我们需要定义餐厅预...
    99+
    2023-11-02
    C++ 简单 C++编程关键词: 餐厅预订系统
  • 如何使用C++编写一个简单的人事管理系统?
    如何使用C++编写一个简单的人事管理系统?人事管理系统是一个用于管理和维护组织内人力资源相关信息的软件。它可以帮助组织进行员工管理、薪资核算、考勤统计、福利发放等工作。本文将介绍如何使用C++编写一个简单的人事管理系统,帮助读者理解人事管理...
    99+
    2023-11-02
    C++编程 简单 人事管理系统
  • 如何使用C++编写一个简单的酒店预订系统?
    酒店预订系统是一种重要的信息管理系统,它可以帮助酒店实现更高效的管理和更良好的服务。如果你想学习如何使用C++来编写一个简单的酒店预订系统,那么本文将为您提供一个基本的框架和详细的实现步骤。酒店预订系统的功能需求在开发酒店预订系统之前,我们...
    99+
    2023-11-03
    C++ 编写 酒店预订系统
  • 如何使用C++编写一个简单的医院挂号系统?
    如何使用C++编写一个简单的医院挂号系统?随着社会的进步和人们生活水平的提高,医疗服务的需求也变得越来越迫切。为了提高医疗服务的效率和便利性,许多医院开始采用电子化挂号系统。这篇文章将向您介绍如何使用C++编写一个简单的医院挂号系统。首先,...
    99+
    2023-11-03
    医院 C++ 挂号系统
  • C#利用VS编写一个简单的网游客户端
    目录一.测试连接服务器二.设计客户端三.运行效果四.总结一.测试连接服务器 1.打开cmd,输入ping 10.1.230.74 2.输入telnet,进入telnet界面 3....
    99+
    2024-04-02
  • 利用JavaScript写一个简单计算器
    效果如下: 参考程序: <!DOCTYPE html> <html lang="en"> <head> <meta ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作