成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一日一技:實(shí)現(xiàn)有過期時(shí)間的LRU緩存

存儲(chǔ)
現(xiàn)在我們考慮下面這個(gè)應(yīng)用場(chǎng)景:MongoDB中有100對(duì)id-用戶名的對(duì)應(yīng)關(guān)系,我從Redis中持續(xù)不斷讀取id,如果id能在MongoDB中找到對(duì)應(yīng)關(guān)系,那么就把對(duì)應(yīng)的用戶名打印出來。如果找不到對(duì)應(yīng)關(guān)系,那么就把這個(gè)id丟棄。

 [[413316]]

在一日一技:實(shí)現(xiàn)函數(shù)調(diào)用結(jié)果的 LRU 緩存一文中,我們提到Python自帶的LRU緩存lru_cache。通過這個(gè)裝飾器可以非常輕松地實(shí)現(xiàn)緩存。

現(xiàn)在我們考慮下面這個(gè)應(yīng)用場(chǎng)景:MongoDB中有100對(duì)id-用戶名的對(duì)應(yīng)關(guān)系,我從Redis中持續(xù)不斷讀取id,如果id能在MongoDB中找到對(duì)應(yīng)關(guān)系,那么就把對(duì)應(yīng)的用戶名打印出來。如果找不到對(duì)應(yīng)關(guān)系,那么就把這個(gè)id丟棄。

為了防止頻繁讀取MongoDB,我在程序開始的時(shí)候直接讀取這一百對(duì)對(duì)應(yīng)關(guān)系,并存為字典:

  1. import pymongo 
  2. import redis 
  3.  
  4. client = redis.Redis() 
  5. handler = pymongo.MongoClient().weibo.id_name_map 
  6.  
  7.  
  8. def read_id_name_map(): 
  9.     id_name = {} 
  10.     for row in handler.find(): 
  11.         id_name[row['id']] = row['name'
  12.     return id_name 
  13.  
  14.  
  15. id_name_map = read_id_name_map() 
  16. while True
  17.     data = client.blpop('weibo_id'
  18.     user_id = data[1].decode() 
  19.     if user_id in id_name_map: 
  20.         print(id_name_map[user_id]) 

大家可以思考一下,上面這段代碼有沒有什么問題。然后繼續(xù)看后面。

如果我現(xiàn)在需要再增加100個(gè)id-用戶名的對(duì)應(yīng)關(guān)系怎么辦?

由于這個(gè)程序運(yùn)行以后就一直阻塞式地讀取Redis,不會(huì)停止,所以整個(gè)過程只會(huì)讀取一次MongoDB。后面即使我向MongoDB中添加了新的對(duì)應(yīng)關(guān)系,只要程序不重啟,就無法讀取到新的對(duì)應(yīng)關(guān)系。

肯定有同學(xué)想到,在while循環(huán)里面增加一個(gè)計(jì)時(shí)器,每x分鐘就重新調(diào)用一下read_id_name_map()函數(shù),更新對(duì)應(yīng)關(guān)系。

不過今天我們要講的是另一個(gè)更有創(chuàng)意的辦法,使用lru_cache來實(shí)現(xiàn)。

對(duì)于這個(gè)例子來說,lru_cache的maxsize參數(shù)只需要設(shè)置為1,因?yàn)橹恍枰娣?份對(duì)應(yīng)關(guān)系即可。那么我們?nèi)绾巫龅剑热缑?0分鐘更新一次呢?我們知道,在使用lru_cache時(shí),如果調(diào)用同一個(gè)函數(shù),并且傳入的參數(shù)相同,那么從第二次開始就會(huì)使用緩存。現(xiàn)在我們?nèi)绾巫寱r(shí)間在每10分鐘內(nèi)相同呢?

我們來看現(xiàn)在的時(shí)間戳:1578399211.30042

它除以600,值是1578399211.30042 // 600 = 2630665.0。然后我讓這個(gè)時(shí)間戳加5分鐘,也就是增加300秒,變成1578399511.30042。這個(gè)新的時(shí)間戳再除以600,發(fā)現(xiàn)結(jié)果還是2630665.0。但如果原來的時(shí)間戳增加超過10分鐘,例如增加了601秒,我們?cè)賮砜纯葱Ч?1578399211.30042 + 601) // 600 = 2630666.0,此時(shí)的結(jié)果也發(fā)生了變化。

利用這個(gè)特點(diǎn),修改一下我們的代碼:

  1. import pymongo 
  2. import redis 
  3. import time 
  4. from functools import lru_cache 
  5.  
  6. client = redis.Redis() 
  7. handler = pymongo.MongoClient().weibo.id_name_map 
  8.  
  9.  
  10. @lru_cache(maxsize=1) 
  11. def read_id_name_map(_): 
  12.     id_name = {} 
  13.     for row in handler.find(): 
  14.         id_name[row['id']] = row['name'
  15.     return id_name 
  16.  
  17.  
  18. while True
  19.     data = client.blpop('weibo_id'
  20.     id_name_map = read_id_name_map(time.time() // 600) 
  21.     user_id = data[1].decode() 
  22.     if user_id in id_name_map: 
  23.         print(id_name_map[user_id]) 

現(xiàn)在,我們直接在while循環(huán)內(nèi)部調(diào)用read_id_name_map,如果兩次調(diào)用的時(shí)間間隔小于600秒,那么time.time() // 600的值是相同的,第二次直接使用緩存,也就不會(huì)查詢MongoDB了。當(dāng)時(shí)間超過10分鐘后,時(shí)間戳除以600的值增加了,于是緩存沒有命中,進(jìn)入查詢MongoDB的過程,更新id_name_map。實(shí)現(xiàn)了有過期時(shí)間的LRU緩存。

補(bǔ)充:可能有同學(xué)注意到定義read_id_name_map函數(shù)的時(shí)候,參數(shù)我寫的是下劃線。這是Python 編碼規(guī)范中建議的一種寫法。當(dāng)一個(gè)變量不會(huì)被使用,但又需要保留時(shí),就可以用下劃線表示。

本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 未聞Code
相關(guān)推薦

2021-12-28 21:43:51

緩存搜索頻率

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2021-09-13 20:38:47

Python鏈?zhǔn)?/a>調(diào)用

2021-03-12 21:19:15

Python鏈?zhǔn)?/a>調(diào)用

2021-02-22 09:23:55

LRU時(shí)間HashMap

2024-11-11 00:38:13

Mypy靜態(tài)類型

2021-07-27 21:32:57

Python 延遲調(diào)用

2021-04-27 22:15:02

Selenium瀏覽器爬蟲

2024-10-16 21:47:15

2021-10-15 21:08:31

PandasExcel對(duì)象

2024-11-13 09:18:09

2021-04-05 14:47:55

Python多線程事件監(jiān)控

2022-03-12 20:38:14

網(wǎng)頁Python測(cè)試

2025-05-28 03:15:00

Scrapy數(shù)據(jù)sleep

2021-04-12 21:19:01

PythonMakefile項(xiàng)目

2021-01-22 05:47:21

Python關(guān)鍵字函數(shù)

2023-10-28 12:14:35

爬蟲JavaScriptObject

2024-07-30 08:11:16

2021-04-19 23:29:44

MakefilemacOSLinux

2024-07-30 08:16:18

Python代碼工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 青娱乐一区二区 | 国产激情亚洲 | 国产99久久精品一区二区300 | 一级h片 | av永久 | 国产精品高潮呻吟久久 | 综合天天久久 | 国产精品免费大片 | 亚洲精品视频在线观看免费 | 精品欧美乱码久久久久久1区2区 | 伊人狠狠干 | 精品久久久网站 | 午夜天堂精品久久久久 | 自拍偷拍中文字幕 | 欧美一区免费在线观看 | 亚洲精品黄色 | 中文字幕亚洲视频 | 一区二区三区四区电影视频在线观看 | 国产精品欧美一区二区三区不卡 | 欧美一级在线 | 日韩精品四区 | 91影院 | 亚洲一区二区久久 | 91婷婷韩国欧美一区二区 | 日本一区二区视频 | 国产农村妇女精品一区 | 天天看天天干 | 久久久精品一区 | 激情一区二区三区 | 国产一级毛片视频 | 欧美一区二区三区在线看 | 国产精品久久久久久久7777 | 九九热精品在线视频 | 欧美久久视频 | 国产视频第一页 | 国产精品日韩在线观看一区二区 | 成人免费一区二区三区牛牛 | 日韩成年人视频在线 | 99国内精品| 国产亚洲精品成人av久久ww | 日韩成人影院在线观看 |