十一 快取如何設計?當更新和刪除時,如何更新快取?

2021-10-03 10:55:28 字數 3505 閱讀 9038

快取基本策略:

單個物件快取:key:就是物件id;value:就是物件

多個物件快取(比如分頁查詢): key:就是「函式名+引數1+引數2+…」;value:就是「物件id集合」

1、插入策略:刪除全部集合快取(只刪除該類相關的所有集合快取,通過key來尋找該類相關的快取,如何構建key,參見備註)ps:暫時想不出來其他更好的辦法了~_~~_~

2、更新策略:只更新單個物件快取

3、刪除策略:只刪除單個物件快取

4、查詢策略:查詢策略又分為單個物件查詢和多個物件查詢

(1)單個物件查詢:基本一致

(2)多個物件查詢:獲取快取,取出id集合,然後遍歷id集合,再去單個物件快取裡去找:

a.若全部找到,則返回物件集合

b.若未找到全部,則說明有物件已被刪除,刪除該快取,重新查詢資料庫,更新快取,返回

備註:若是自己寫的區域性快取,就按上述策略;若使用像redis這種全域性快取,則重點需要構建key:物件的全域性唯一id:id

案例:本案例採用 qt/c++ 簡單實現,不足之處,還請見諒:

userdao.h

#ifndef userdao_h

#define userdao_h

#include

#include

#include

#include

class

user

;class

userdao

;#endif

// userdao_h

userdao.cpp

#include

"userdao.h"

#include

"db/sqlutil.h"

#include

"db/dbutil.h"

#include

"demo/bean/user.h"

#include

/** * <?xml version="1.0" encoding="utf-8"?>

id, username, password, email, mobile

select from user where id=%1

select id, username, password, email, mobile from user

insert into user (username, password, email, mobile)

values (:username, :password, :email, :mobile)

update user set username=:username, password=:password,

email=:email, mobile=:mobile

where id=:id

*/static

const qstring sql_namespace_user =

"user";/*

* 快取基本策略:

* * 單個物件快取:key:就是物件id;value:就是物件

* 多個物件快取(比如分頁查詢): key:就是「函式名+引數1+引數2+...」;value:就是「物件id集合」

* * 1、更新策略:只更新單個物件快取

* 2、刪除策略:只刪除單個物件快取

* 3、查詢策略:查詢策略又分為單個物件查詢和多個物件查詢

* (1)單個物件查詢:基本一致

* (2)多個物件查詢:獲取快取,取出id集合,然後遍歷id集合,再去單個物件快取裡去找:

* a.若全部找到,則返回物件集合

* b.若未找到全部,則說明有物件已被刪除,刪除該快取,重新查詢資料庫,更新快取,返回

* * 備註:若是自己寫的區域性快取,就按上述策略;若使用像redis這種全域性快取,則重點需要構建key:物件的全域性唯一id:id

*///在.**件中定義了靜態變數,在.cpp檔案中使用,必須再次申明,否則報錯

qcache userdao::usercache;

qcacheint>> userdao::userscache;

user userdao::

finduserbyid

(int id)

else

}/**

* 查詢所有資料,基本思路:

* 1、根據key獲取id集合

* 2、遍歷id集合,判斷快取是否存在該id對應的物件,一旦沒有,則中斷迴圈,清空物件集合

* 3、判斷物件集合是否為空,非空則說明快取中對應的物件都在,返回快取中物件即可

* 4、若此時程式還未終止,說明快取中資料有問題,查詢資料庫,更新快取

*/qlist userdao::

findall()

users.

(*usercache.

object

(qstring::

number

(id)))

;}if(

!users.

isempty()

)}users = dbutil::

selectbeans

(maptouser,

getsql

("findall"))

;for

(user user : users)

userscache.

insert

(key, ids)

;return users;

}int userdao::

insert

(user *user)

return newid;

}bool userdao::

update

(user *user)

return result;

}bool userdao::

deleteuser

(int id)

return result;

}/**

* @brief 將 qvariantmap 物件轉換成 user

* @param rowmap 資料庫查詢到的結果轉換成的 qvariantmap 物件

* @return user

*/user userdao::

maptouser

(const qvariantmap &rowmap)

/** * @brief 從配置檔案中取出sql

* @param 函式名

* @return sql

*/qstring userdao::

getsql

(const qstring &functionname)

qstring userdao::

buildkey

(std::initializer_list params)

return key;

}

zencart如何更新快取

首先,zencart 的快取指的是sql資料庫快取,就是zencart 讀取資料庫時,可以儲存部分查詢結果,一定程度上減少對資料庫的查詢次數。zencart的sql快取設定有三個選項 none,database 和 file 前台的資料庫快取,在 includesconfigure.php 檔案中設...

MySQL資料庫筆記(十一) 插入 更新和刪除資料

sql語句的分類 先建立t student表 create table t student id int primary key auto increment,name varchar 10 not null,email varchar 30 unique,birthday date 將資料插入到t...

快取層如何設計

3 快取層如何設計 我們前面講過 了n tier架構。在我們的程式當中,還可以設計乙個快取層。在去訪問資料庫之前,先看看快取層中有沒有資料,如果沒有的話,從資料庫取完資料回來,一 定要放在快取層當中乙份,下次就不用去資料庫了。如果對資料庫當中,某個資料更新了,同時一定要記住也更新一下快取當中的資料。...