緩存汙染
有些數據被訪問的次數非常少,甚至只會被訪問一次。當這些數據服務完訪問請求後,如果還繼續留存在緩存中的話,就只會白白佔用緩存空間。這種情況,就是緩存汙染。
如何解決緩存汙染問題?
分析前幾章提到的淘汰策略是否可以解決緩存污染
volatile-random 和 allkeys-random
效果非常有限
CleanShot 2025-09-10 at 22.54.16@2x
Sep 11, 2025・Contributed by
緩存大小的考量
Redis 作為緩存時,需要考慮容量設置。
例子:MySQL 資料庫 1TB,通常不會建立 1TB 的緩存,性價比太低。
常見做法:設置資料庫大小的 15% ~ 30% 作為緩存。
一旦確定了緩存最大容量,比如 4GB,你就可以使用下面這個命令來設定緩存的大小了:
CONFIG SET maxmemory 4gb
Redis 緩存有哪些淘汰策略?
CleanShot 2025-08-19 at 16.16.14@2x
Aug 21, 2025・Contributed by
當你從 Redis 中刪除大量資料後,卻發現 內存佔用率並沒有明顯下降,這其實是 Redis 設計上的行為。以下是重點整理:
1. 內存管理方式:惰性回收(Lazy Freeing)
Redis 採用 jemalloc 作為記憶體配置器,當刪除鍵時,只是「標記」為無效,實際的記憶體不一定會立刻歸還給系統。
jemalloc 會將這些空間保留給 Redis 未來的物件重複使用,而不是立即釋放。
2. fork 操作會保留頁面(Copy-on-Write)
在執行 RDB 或 AOF 的 fork 操作時,會複製整個進程記憶體,Redis 為了效率,在此期間會保留這些頁面不被釋放,導致內存暫時居高不下。
3. 內存碎片
Jul 31, 2025・Contributed by
一、Redis 和 CPU 的基本關係
多數人認為 Redis 性能僅與 CPU 快慢有關,其實 CPU 的「多核架構」與「多 CPU 架構」也會影響 Redis 效能。
二、主流的 CPU 架構
1. CPU 核心與快取層級
每個 CPU 處理器有多個物理核心,每個核心擁有私有的 L1 與 L2 cache。
L3 cache 為共享緩存,各物理核心可共用,容量大但速度較慢。
兩個超執行緒(邏輯核心)共用一個物理核心的 L1/L2 cache。
CleanShot 2025-06-26 at 13.08.44@2x
Jun 26, 2025・Contributed by
時間序列數據(Time Series Data)
時間序列數據(Time Series Data)是依時間先後順序排列的數據集合,通常用來表示某個變數隨時間變化的情況。
特點:
時間順序重要
數據點具備時間戳(例如:每天的氣溫、每分鐘的股價)
常用於分析趨勢、季節性、異常等
常見應用:
May 22, 2025・Contributed by
先跟你分享一個我曾經遇到的需求。
當時,我們要開發一個圖片存儲系統,要求這個系統能快速地記錄圖片 ID 和圖片在存儲系統中保存時的 ID(可以直接叫作圖片存儲對象 ID)。同時,還要能夠根據圖片 ID 快速查找到圖片存儲對象 ID。
photo_id: 1101000051photo_obj_id: 3301000051
127.0.0.1:6379> set 1101000051 3301000051
我們保存了 1 億張圖片,大約用了 6.4GB 的內存。但是,隨著圖片數據量的不斷增加,我們的 Redis 內存使用量也在增加,結果就遇到了大內存 Redis 實例因為生成 RDB 而響應變慢的問題
Apr 23, 2025・Contributed by
打開 Message API Webhook 功能
進入 Line Office Account,在帳號一覽選擇你要設定的 Official Account
設定 > 回應設定 > 打開「聊天」跟「Webhook」功能
image
設定 > Messaging API > 啟用 Messaging API
選擇服務提供者 > 選擇你的帳號
Apr 13, 2025・Contributed by
複雜性是規模擴展的大敵
你知道的,程式碼越簡單越好
如果真的無法消除複雜性,那就把它隔離開來
一個簡單的範例
譬如說要計算 sin 的時候,我們只要直接去呼叫 sin 函數就好而不用去管內部的實作
實際上計算 sin 的實作非常的複雜,但是因為他的介面簡單,所以我們用起來也不會很複雜
隱藏內部的細節
v1
Jun 13, 2024・Contributed by
如何消除掉那種實際上可以避免的狀況(或者說是「使用上的錯誤」,像是在關閉檔案之後又想要寫入檔案,或是在物件完成初始化之前就去調用那個物件裡的方法)
設計出不容易誤用的程式(介面)
比如說,你寫了某個函式,其中有兩個參數是陣列值,或許你會希望這兩個陣列,總是具有相同的大小
void showAuthorRoyalties(
const vector<string> & titles,
const vector<double> & royalties)
{
assert(titles.size() == royalties.size());
May 23, 2024・Contributed by
大部分情況下,我們會傾向找出更通用的做法
譬如以下的例子
Sign * findRedSign(const vector<Sign *> & signs)
{
for (Sign * sign : signs)
if (sign->color() == Color::Red)
return sign;
Apr 25, 2024・Contributed by
11.1 將兩個查詢結果聯集的 UNION
使用UNION 關鍵字可以將兩個查詢的結果做聯集,只要兩者的欄位資料型別、欄位數與欄位排列順序相同即可。
用 UNION 聯集只保留不重複的列資料
聯集的意思就是將兩個集合中的所有元素放在一起,並將重複的元素只保留一個。
我們用兩個SELECT 語句分別查出市集年份是2019與2020年的首次市集日期,然後將這兩個查詢的輸出結果合併起來。因為第一個查詢與第二個查詢的輸出不重複,都會被放進聯集的輸出中:
SELECT market_year, MIN(market_date) AS first_market_date
FROM farmers_market.market_date_info
Mar 29, 2024・Contributed by
如果我們是第一次接觸到這個資料庫時,在做查詢與分析之前,就需要瞭解他的結構與特性。
EDA: 探索性資料分析
9.1 EDA 準備要探索的標的
我們需要透過 SQL 查詢瞭解表格的資料樣貌,包括以下幾件事情:
表格多大?
資料的時間跨度?
每個產品與每筆購買記錄中有哪些可用資訊?
Mar 14, 2024・Contributed by