自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

記一種不錯的緩存設(shè)計思路

數(shù)據(jù)庫
之前與同事討論接口性能問題時聽他介紹了一種緩存設(shè)計思路,覺得不錯,做個記錄供以后參考。

之前與同事討論接口性能問題時聽他介紹了一種緩存設(shè)計思路,覺得不錯,做個記錄供以后參考。

場景

假設(shè)有個以下格式的接口:

GET /api?keys={key1,key2,key3,...}&types={1,2,3,...}

其中 keys 是業(yè)務(wù)主鍵列表,types 是想要取到的信息的類型。

請求該接口需要返回業(yè)務(wù)主鍵列表對應(yīng)的業(yè)務(wù)對象列表,對象里需要包含指定類型的信息。

業(yè)務(wù)主鍵可能的取值較多,千萬量級,type 取值范圍為 1-10,可以任意組合,每種 type 對應(yīng)到數(shù)據(jù)庫是 1-N 張表,示意:

現(xiàn)在設(shè)想這個接口遇到了性能瓶頸,打算添加 Redis 緩存來改善響應(yīng)速度,應(yīng)該如何設(shè)計?

設(shè)計思路

方案一:最簡單粗暴的方法是直接使用請求的所有參數(shù)作為緩存 key,請求的返回內(nèi)容為 value。

方案二:如果稍做一下思考,可能就會想到文首我提到的覺得不錯的思路了:

  • 使用 業(yè)務(wù)主鍵:表名 作為緩存 key,表名里對應(yīng)的該業(yè)務(wù)主鍵的記錄作為 value;
  • 查詢時,先根據(jù)查詢參數(shù) keys,以及 types 對應(yīng)的表,得到所有 key1:tb_1_1、key1:tb_1_2 這樣的組合,使用 Redis 的 mget 命令,批量取到所有緩存中存在的信息,剩下沒有命中的,批量到數(shù)據(jù)庫里查詢到結(jié)果,并放入緩存;
  • 在某個表的數(shù)據(jù)有更新時,只需刷新 涉及業(yè)務(wù)主鍵:該表名 的緩存,或令其失效即可。

小結(jié)

在以上兩種方案之間做評估和選擇,考慮幾個方面:

  • 緩存命中率;
  • 緩存數(shù)量、占用空間大??;
  • 刷新緩存是否方便;

稍作思考和計算,就會發(fā)現(xiàn)此場景下方案二的優(yōu)勢。

另外,就是需要根據(jù)實際業(yè)務(wù)場景,如業(yè)務(wù)對象復(fù)雜度、讀寫次數(shù)比等,來評估合適的緩存數(shù)據(jù)的粒度和層次,是對應(yīng)到某一級組合后的業(yè)務(wù)對象(緩存值對應(yīng)存儲 + 部分邏輯),還是最基本的數(shù)據(jù)庫表/字段(存儲的歸存儲,邏輯的歸邏輯)。

責(zé)任編輯:趙寧寧 來源: 悶騷的程序員
相關(guān)推薦

2022-06-23 07:05:46

跳板機服務(wù)器PAM

2016-10-26 09:12:58

2018-04-18 07:34:58

2014-03-17 10:30:12

網(wǎng)絡(luò)服務(wù)器

2020-11-27 14:45:57

開發(fā)服務(wù)器代碼

2024-05-09 08:20:29

AC架構(gòu)數(shù)據(jù)庫冗余存儲

2018-12-29 10:37:05

HTTP緩存URL

2022-08-17 09:07:09

低代碼LCDP編碼

2017-07-05 14:09:04

系統(tǒng)設(shè)計與架構(gòu)java云計算

2017-08-24 15:02:01

前端增量式更新

2024-04-30 08:12:05

CRUD方法JavaAC架構(gòu)

2024-04-26 08:58:54

if-else代碼JavaSpring

2019-11-22 09:21:17

技術(shù)研發(fā)數(shù)據(jù)

2016-10-13 10:57:55

phptcp專欄

2021-05-18 06:22:39

CSS 制作波浪技巧

2020-05-12 10:00:14

緩存算法贈源碼

2010-08-23 14:25:13

marginCSS

2013-09-04 12:38:56

架構(gòu)設(shè)計架構(gòu)設(shè)計構(gòu)思

2020-05-06 11:29:29

UX設(shè)計釣魚攻擊用戶體驗

2020-12-23 10:10:23

Pythonweb代碼
點贊
收藏

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