快取基本策略:
單個物件快取: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架構。在我們的程式當中,還可以設計乙個快取層。在去訪問資料庫之前,先看看快取層中有沒有資料,如果沒有的話,從資料庫取完資料回來,一 定要放在快取層當中乙份,下次就不用去資料庫了。如果對資料庫當中,某個資料更新了,同時一定要記住也更新一下快取當中的資料。...