最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

利用Python編寫一個簡單的緩存系統(tǒng)

 更新時間:2023年04月19日 09:54:19   作者:真的不能告訴你我的名字  
今天來做一個最簡單的例子,利用寫一個最簡單的緩存系統(tǒng),以key``value的方式保持?jǐn)?shù)據(jù),并且需要將內(nèi)容中的數(shù)據(jù)落地到文件,以便下次啟動的時候,將文件的內(nèi)容加載進內(nèi)存中來,感興趣的可以了解一下

我們昨天已經(jīng)學(xué)習(xí)了python的文件讀寫,今天來做一個最簡單的例子,寫一個最簡單的緩存系統(tǒng),要求:

key``value的方式保持?jǐn)?shù)據(jù),并且需要將內(nèi)容中的數(shù)據(jù)落地到文件,以便下次啟動的時候,將文件的內(nèi)容加載進內(nèi)存中來。

還是需要聲明一點,本篇文章所依賴的python環(huán)境為:

代碼已經(jīng)放到了gitee上,gitee地址: gitee.com/pdudo/golearn/blob/master/python/cacheDB/main.py

項目展示

demo將分為2個部分展示,第一個部分我們會寫入一些keyvalue進入到緩存系統(tǒng)中,而后關(guān)閉程序。

第二部分則會去獲取第一個部分寫入的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設(shè)置一些基礎(chǔ)環(huán)境變量,例如:

  • queueMaxKeys: 需要制定增刪改緩存隊列,類型為int,如果滿了,則立即落地到磁盤中。
  • ageSec: 間隔時間,參數(shù)為秒數(shù),若操作第一個key和操作第二個key時間大于該設(shè)置,則落地到磁盤。

set則是寫入方法,參數(shù)為keyvalue。

運行后,代碼效果如下:

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

第一部分操作完畢了,我們可以修改第二部分,使用get去獲取第一次存儲的數(shù)據(jù)。

修改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"))

運行后,效果如下:

由此可以驗證,從磁盤讀取文件并且加載進內(nèi)存,沒什么問題。

除此之外,該庫還支持其他操作,例如:

# 定義一個緩存對象
c = dbCache("db.cache")
# 配置環(huán)境變量
c.cacheSetting(queueMaxKeys=3,ageSec=3)
# 寫
c.set("name","pdudo")
# 讀
print(c.get("name"))
# 修改
c.update("name", "juejin")
# 刪除
c.delete("name")

接下來,我們就來看下,如何一步一步完成這個最簡單的緩存系統(tǒng)。

不用落地的緩存系統(tǒng)系統(tǒng)應(yīng)該如何實現(xiàn)

python中,給我們提供了很多基礎(chǔ)的數(shù)據(jù)類型,例如 列表、字典等。所以說,就沒必要自己在定義一套屬于自己的數(shù)據(jù)類型了,可以直接使用現(xiàn)有的數(shù)據(jù)類型,例如本篇文章所使用的就是字典,這里簡單的鋪墊一下字典的增刪改查。

鋪墊python字典基本操作

定義一個空的字典a,可以使用如下代碼:

a = {}

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

a["name"] = "pdudo"

修改也是和上述一樣的

關(guān)于查詢,我們直接使用a[key]即可。

若沒有這個key會拋錯: KeyError: 'key'。

print(a["name"])

檢查是否存在key,可以使用key in dict來判斷,例如: 想判斷name是否是字典a中的key,可以寫為:

print("name" in a)

若存在于a中,會返回True,否則會返回False。

定義一個不用落地的緩存系統(tǒng)

有了上述關(guān)于字典的基本操作,我們可以將其封裝一下,定義為自己的操作方法,例如:

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中,從而實現(xiàn)調(diào)用。

例如,運行之后結(jié)果為:

數(shù)據(jù)如何落地

上述,我們已經(jīng)寫了一個最簡單的緩存系統(tǒng),如果此時進程掛掉了,重新啟動后,內(nèi)存中的數(shù)據(jù)就都沒了,所以為了避免重啟后數(shù)據(jù)丟失,可以將數(shù)據(jù)定時落地到磁盤中,本篇文章所介紹的內(nèi)置庫為: 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方法,它可以主動在最后幫我們關(guān)閉文件句柄。

此時如我們執(zhí)行腳本后,想查看一下文件,會發(fā)現(xiàn)是二進制格式的,例如:

將對象從磁盤中導(dǎo)入到內(nèi)存中

上述,我們已經(jīng)將對象保持到磁盤中,接下來,我們使用pickleload方法,將磁盤數(shù)據(jù)導(dǎo)入到內(nèi)存中來,這里同樣舉一個很簡答的例子:

import pickle

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

print(list2)

上述代碼,還是先引入pickle庫,而后在以二進制的模式讀取文件,最后通過pickle.load方法,將數(shù)據(jù)從磁盤中導(dǎo)入到list2下,接著輸出list2的值。

運行后,可以發(fā)現(xiàn),該值就是我們上述落地到磁盤的對象:

將數(shù)據(jù)落地和緩存系統(tǒng)結(jié)合起來

我們已經(jīng)將數(shù)據(jù)落地測試完畢了,如何和緩存系統(tǒng)結(jié)合起來呢? 很簡單,我們僅需要在程序啟動時,檢測一下是否有該文件,若有,則直接讀取數(shù)據(jù)再并入到對象中,否則創(chuàng)建一個新的字典就好。

而后每次有增刪改操作,都將數(shù)據(jù)落地即可,這里用新增數(shù)據(jù)函數(shù)舉個例子:

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__ 函數(shù)中,就嘗試讀取本地文件db.cache,若存在,就load到內(nèi)存中,若不存在,就創(chuàng)建一個新的字典。

這樣的話,存儲的數(shù)據(jù)就不會因為程序重啟而丟失了。

如何保證并發(fā)安全

作為一個服務(wù)對開提供訪問時,需要注意一下并發(fā)安全,當(dāng)多個函數(shù)對一個變量進行操作的時候,很容易引起數(shù)據(jù)混亂,所以還是有必要加一下鎖的,我們可以引入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()

這里就不做演示了。

總結(jié)

本篇文章,介紹如何寫一個最簡單的緩存系統(tǒng),其核心點是定義了一個字典類型來保存key/value數(shù)據(jù),并且根據(jù)相應(yīng)的邏輯,使用pickleload方法保持到本地磁盤中,而后需要加載的時候再從本地文件加載到內(nèi)容中即可,最后作為一個服務(wù),應(yīng)當(dāng)考慮到并發(fā)安全的問題,給增刪改方法加一個鎖,從而避免并發(fā)問題。最后的最后,再將功能重復(fù)代碼給踢出來,稍微潤色一下,就差不多可以了。

到此這篇關(guān)于利用Python編寫一個簡單的緩存系統(tǒng)的文章就介紹到這了,更多相關(guān)Python緩存系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python字符串循環(huán)左移

    python字符串循環(huán)左移

    這篇文章主要為大家詳細介紹了Python字符串循環(huán)左移,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • PyCharm設(shè)置護眼背景色的方法

    PyCharm設(shè)置護眼背景色的方法

    今天小編就為大家分享一篇PyCharm設(shè)置護眼背景色的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • python interpolate插值實例

    python interpolate插值實例

    這篇文章主要介紹了python interpolate插值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python批量將Word文檔(.doc)轉(zhuǎn)換為.docx格式的完整實現(xiàn)步驟

    Python批量將Word文檔(.doc)轉(zhuǎn)換為.docx格式的完整實現(xiàn)步驟

    這篇文章主要介紹了Python批量將Word文檔(.doc)轉(zhuǎn)換為.docx格式的完整實現(xiàn)步驟,文中通過代碼介紹的非常詳細,適用于Windows系統(tǒng),解決了手動轉(zhuǎn)換的低效率和出錯率問題,需要的朋友可以參考下
    2024-12-12
  • 解決PyCharm不在run輸出運行結(jié)果而不是再Console里輸出的問題

    解決PyCharm不在run輸出運行結(jié)果而不是再Console里輸出的問題

    這篇文章主要介紹了解決PyCharm不在run輸出運行結(jié)果而不是再Console里輸出的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • python庫安裝與使用示例詳解

    python庫安裝與使用示例詳解

    這篇文章主要介紹了Python中的生成器函數(shù)yield、openslide庫、ASAP庫、concurrent.futures.ThreadPoolExecutor、xml.etree.ElementTree庫、skimage庫和PIL.Image庫的相關(guān)知識,感興趣的朋友一起看看吧
    2025-02-02
  • python寫入Excel表格的方法詳解

    python寫入Excel表格的方法詳解

    這篇文章主要為大家詳細介紹了python寫入Excel表格的方法,使用jupyter?notebook,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • python局部賦值的規(guī)則

    python局部賦值的規(guī)則

    Python提出如下假設(shè):如果在函數(shù)體內(nèi)的任何地方對變量賦值,則Python將名稱添加到局部命名空間中。
    2013-03-03
  • 如何利用飾器實現(xiàn) Python 函數(shù)重載

    如何利用飾器實現(xiàn) Python 函數(shù)重載

    這篇文章主要介紹了如何利用飾器實現(xiàn) Python 函數(shù)重載,需要的朋友可以參考下面文章內(nèi)容,希望能幫助到你
    2021-09-09
  • Django獲取model中的字段名和字段的verbose_name方式

    Django獲取model中的字段名和字段的verbose_name方式

    這篇文章主要介紹了Django獲取model中的字段名和字段的verbose_name方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論

华宁县| 竹山县| 铜山县| 搜索| 西宁市| 古丈县| 牙克石市| 巴彦淖尔市| 宁南县| 花莲市| 山东| 卢龙县| 依兰县| 沙坪坝区| 旌德县| 呼图壁县| 德惠市| 西乌珠穆沁旗| 望都县| 镇沅| 乐东| 简阳市| 塘沽区| 两当县| 吴忠市| 新干县| 定州市| 北海市| 突泉县| 临洮县| 察哈| 莱州市| 平塘县| 大同县| 寿宁县| 桑日县| 太原市| 岢岚县| 焉耆| 岢岚县| 哈巴河县|