數據緩存層的開發
數據緩存層用於對訪問過的數據進行緩存,以提高訪問效率。本書所講述的數據緩存是以表為單位的數據緩存。
數據緩存層的原理
數據緩存層實際上就是對一個巨大的存在於內存中的DataSet進行管理,其原理如下:
(1)數據緩存層維護一個大DataSet,這個DataSet以static存在於應用程序中,這是緩存數據集。
(2)客戶端發起請求,數據查詢請求發送到數據緩存層。
(3)數據緩存層查詢緩存起來的數據查詢條件,查找該查詢條件是否被使用過。
(4)如果該查詢條件以前使用過,則不從數據庫查詢數據,只從緩存數據集中查詢。
(5)如果該查詢條件以前沒有用過,則調用數據訪問層從數據庫中查詢數據,並將查詢數據合並到緩存數據集中,同時緩存該查詢條件。
(6)更新數據時,將要更新的數據更新到數據庫中,同時更新緩存數據集中的數據。
(7)在查詢或更新數據時,都在緩存數據集相應數據表的擴展屬性中記錄當前訪問時間。
(8)每隔一段時間對緩存數據集進行清理,當其中某條數據行超過一定時間(可以在配置文件中進行配置)沒有訪問,則將該表釋放。
一 常見的緩存形式 :
1.文件緩存 (為了避免I/O開銷,盡量使用內存緩存)
2.內存緩存
二 為什么要使用緩存
緩存數據是為了讓客戶端很少甚至不訪問數據庫服務器進行的數據查詢,高並發下,能最大程度降低對數據庫服務器的訪問壓力
一般的數據請求:
用戶請求->數據查詢->連接數據庫服務器並查詢數據->將數據緩存起來(緩存方式: HTML , 內存 , [JSON, 序列化數據不做考慮])->顯示給客戶端
用戶再次請求或者新用戶訪問->數據查詢->直接從緩存中獲取數據->顯示給客戶端
三 緩存需要考慮的方面
1.緩存方式的選擇: 對I/O開銷比較小的方式, 比如緩存到內存
2.緩存場景的選擇: 一些不經常修改的數據適合做緩存
3. 緩存數據的實時性:
4. 緩存數據的穩定性:
四 Mysql的查詢緩存
1.啟用mysql查詢緩存:
--(1) query_cache_type : 0代表使用查詢緩存 1表示始終使用查詢緩存 2表示按需使用查詢緩存
--(2) 如果選擇1也就是始終緩存時,如果某一條sql語句不想使用緩存,可以這樣
select SQL_NO_CACHE * from student where condition;
--(3) 如果選擇2也就是按需使用查詢緩存時,可以這樣
select SQL_CACHE *from student where condition;
2. query_cache_size 配置項
默認情況下,query_cache_size為0,也就是表示為查詢緩存預留的內存為0,表示無法使用查詢緩存
(1) 可以通過 set GLOBAL query_cache_size= 來臨時設置
(2) 也可以在配置文件中,直接設置query_cache_size的大小
3. 查詢緩存可以看做是SQL文本和查詢結果的映射
第二次查詢的sql和第一次查詢的sql完全相同,則會使用緩存
4. 我們可以通過show status like 'Qcache_hits'; 命令來查看命中次數
5. 在mysql數據緩存中,除了sql語句改變會使緩存無法使用,當表的結構或數據發生改變時,查詢緩存中的數據也不再有效
總結:如果寫的頻率較高,mysql查詢緩存意義就不大,如果數據基本不發生改變,mysql查詢緩存還是比較有用的
6.清理緩存
FLUSH QUERY CACHE; //清理查詢里的緩存內存碎片
RESET QUERY CACHE; //從查詢緩存中移出所有查詢
FLUSH TABLES; //關閉所有打開的表,同時該操作將會清空查詢緩存中的內容
五 使用Memcache 緩存查詢數據
1.memcache的概念
memcache是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著 。
2.memcache 的工作原理
Memcache是一個高性能的分布式的內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,然后從內存中讀取,從而大大提高讀取速度
3. memcache工作流程
先檢查客戶端的請求數據是否在memcached中,如有,直接把請求數據返回,不再對數據庫進行任何操作;如果請求的數據不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端,同時把數據緩存一份到memcached中
4.memcache的安裝
如果沒有以下memcache文件,點擊鏈接下載
(1) 首先,獲取memcached.exe以及msvcr71.dll(這是memcache的依賴文件),如圖
(2) 在memcached所在目錄的命令行下運行memcached.exe
(3)檢查任務管理器, 驗證memcached是否已經開始運行
如果任務進程出現這樣的圖標,說明memcached已經在運行了,到這里結束!
當然,這種運行方式使用上不是太方便,每次還要在命令行上運行,所以,有另一種方式讓memcached運行而不用每次都開啟cmd窗口,見下文
(2) 以管理員身份運行cmd,將memcached安裝到服務上(將上面的第(2)步替換掉 )
(3) 查看服務中是否有memcached(將上面的第(3)步替換掉 )
將其啟動即可
注意:如果想要從服務中卸載掉memcached,需要先將memcached服務停止,然后再命令行下輸入如下命令即可卸載
5. 在php中操作memcache(需要安裝memcache拓展,安拓展是一個php程序員最基礎的東西,這里不贅述了)
(1) 連接memcache
$mem = new memcache(); $re=$mem->connect('localhost', 11211); if($re){ echo '連接memcache成功'; }else{ echo '連接失敗'; }
瀏覽器輸出:連接memcache成功 證明連接memcache成功
(2) 現在,可以操作memcache數據庫了
具體方法可以參考memcache文檔 , memcached文檔
(3) 使用遠程協議進行連接memcache的幾種方式
第一種:可以開啟telnet,然后在cmd命令行模式下使用telnet遠程連接memcache
第二種:使用putty(支持telnet的客戶端)
第三種: 圖形界面客戶端
第四種: phpmemcache 服務器狀態軟件
第五種: memadmin php管理memcache的客戶端 (推薦) 鏈接
六 使用redis緩存查詢數據
-----以后再補-----
七 Redis 與 Memcache 的區別
1. 性能相差不大
2. Redis可以持久化數據,Memcache不行
3. Redis 的數據結構很豐富, memcache相對較少
4. Redis依賴客戶端實現分布式讀寫
5. Memcache本身沒有數據的冗余機制
6. Redis支持快照,AOF, 依賴快照進行持久化, aof增強了可靠性的同時,對性能有所影響
7. memcache不支持持久化,通常做緩存提升性能
8. memcache在並發場景下,用cas保持一致性,redis事物支持比較弱,只能保證事物中的每個操作連續執行
9. redis用於數據量較小的高性能操作和運算上; memcache用於在動態系統中減少數據庫負載,提升性能
八 緩存其他數據
Session
session_set_save_handle
參考:https://blog.csdn.net/m_nanle_xiaobudiu/article/details/79274156