記錄一次刪除快取導致的介面部分資料為空

2021-10-10 11:14:28 字數 1187 閱讀 9244

前段時間接到個需求,要求現有的資料做到實時更新。目前相關介面都是等待快取過期才能查到最新的資料,如果想做到實時更新,就要在生成資料後去觸發刪除快取資料

目前的專案使用了tp5框架,開始想的是使用框架自帶的cache類的tag進行快取的標記與刪除,看過原始碼後發現tp5的tag實現並不是很理想,其把快取key使用逗號分隔存在乙個tag中,併發場景中,可能會出現tag中的key丟失的情況,最後還是計畫通過給快取加字首,然後通過原生keys匹配到具體的快取key列表,然後使用del方法刪除快取。

為了在最小程度上修改**,我通過自定義中介軟體判斷path並確定是否需要打上標籤的資料,然後判斷request的cachetag屬性進行標記處理,中介軟體的實現如下:

<?php

namespace

;use

think\request

;class

cachetag

}}

上面實現了對快取的標記,刪除快取**就不貼出來了。

測試了幾遍沒什麼問題就發布到線上了,誰曾想線上出現了問題,有幾個介面返回介面是空陣列,並且空結果被快取了,導致前台專案長時間獲取不到資料。開始以為是刪除快取的問題,排查了一番之後並不是,於是又去翻了之前的**,真的發現了問題,由於之前的快取策略實現是model層、controller層的雙層快取策略,同時快取獲取也很不規範,竟然獲取了兩次快取(當然這不規範的**都是前人留下的,這種操作著實很迷)

$cachename

="home_index_index"

;$cacheclass

=new

\think\cache()

;if($cacheclass

->

get(

$cachename))

else

return

$res

;

到這裡我基本斷定是因為獲取兩次快取的原因了。設想一下生成空結果快取的流程:

介面存在訪問量,這時的model層在第一次獲取到快取的時候快取是有的,這時生成指數任務觸發刪除快取操作,那麼model層第二次獲取介面快取的時候就返回的是空結果了。那麼整個controller層執行完畢之後就會有部分從model層獲取的資料為空的資料被快取了下來

至此,問題找到了。

記一次由於快取導致的bug

bug描述 有一張資料庫表儲存的是 值日員工資訊,有時候可能一次性錄入1個月的資料 有時候也可能隔了很多天沒有錄入資料,也就是說這個錄資料不是很規律。bug現象 測試人員發現,上三亞地區能正常顯示當天值日員工資訊,但是珠海地區卻不能正確顯示當天值日員工資訊。而資料庫上實際是有珠海地區值日員工資訊的。...

一次快取過多導致的記憶體不足的處理

linux伺服器上部署啟動失敗,現象為cpu占用高,或者訪問失敗,慢等現象 1 檢視記憶體占用情況 free h 2 清快取 echo 1 proc sys vm drop caches 3 故障消除 root localhost free m total used free shared buff...

記錄自己第一次寫的快取

這是我第一次接觸到快取這乙個功能,不是寫在redis上,而是在記憶體上,利用list集合。在這次 的編寫中讓我對list集合更加的熟悉。以此記錄我的成長。repository value ordertypedetaildao public class ordertypedetaildao exten...