簡單利用Memcached進行快取層設計

2021-09-22 07:35:50 字數 1366 閱讀 8508

正在考慮web應用快取層的設計,參考了不少資料,估計還是需要用到相對成熟應用廣泛的分布式快取memcached。在.net平台上早就有相對成熟的memcached客戶端產品,如beitmemcached和enyimmemcached,業餘時間看了一下原始碼,自己分析並呼叫一下並不困難。這裡簡單介紹一下利用memcached的乙個簡單的快取層設計,示例**基於enyimmemcached,下面以貼**為主。

分析asp.net web caching的快取類,我們大致可以抽象出如下幾個介面方法:

contract
看命名就知道,增刪改查是也。根據個人使用快取的經驗,修改操作通常是不需要的,如果確實需要修改快取資料,直接刪除然後新增就是改了。

還有,你可能會問,這裡為什麼要定義兩個介面?原因主要是考慮到讀操作(查詢)是經常使用的,而寫操作(增刪改)相對較少,所以也把它們設計成讀寫分離的方式。

這裡就需要呼叫memcached客戶端封裝好的呼叫方法,實現增刪改查等方法。

implement
基類裡初始化乙個memcachedclient示例client,這個client的方法裡封裝了較多的函式。檢視原始碼可以知道,它們本質上都是向memcached服務端傳送相關指令(run command),然後解析返回的二進位制資料,如果您熟悉memcached所使用的協議,理解起來應該會相當簡單。本文示例只使用了客戶端提供的幾個方法。

同時要注意,在實現具體快取服務的時候,cachewriterservice有兩個建構函式,其中帶引數的是為快取顯式指定過期時間。這個引數在實際應用中通常需要配置,顯然是比較靈活一些的。

備註:在介面中有乙個函式release,本來的目標是清空所有的快取資料,但是客戶端沒有直接提供對應的函式,如果您有好的方法,請不吝賜教。

貼一下字串、時間、單個類和集合的增刪改查示例**:

crud
在我的簡單測試中,對常見基礎資料型別如(字串、陣列、數字和時間)、集合(列表和字典)都有良好的表現,對datatable和dataset同樣表現不俗,但是不太建議直接快取這兩種重粒度的型別。

在顯式指定過期時間的示例中,指定過期時間是一分鐘,但是memcached實際過期時間有時候好像會多於一分鐘,估計是系統內部的延遲。

在本地計算機上進行10萬次迴圈新增快取的過程中,發現系統記憶體果然增加的非常厲害。然後查詢效能並沒有顯著下降,也許和我的單機測試環境有關,所以我認為測試結果並沒有說服力,要知道,memcached的優勢是它的分布式快取實現。

有人發現如何保證快取系統的鍵唯一也非常令人頭疼。同樣的快取框架,不同專案不同開發者如何保證自己程式新增的快取鍵唯一呢?有一種簡單方法就是通過拼接字串成為有意義的主鍵,比如按照專案名、命名空間、類名、資料庫中的主鍵組合構成主鍵等等。當然了,在查詢的時候也要自己封裝特定格式的字串主鍵。個人感覺確實是乙個行之有效的方法。

Shellsploit注入器簡單利用

shellsploit讓您為各種作業系統生成自定義的shellcode,後門,注入器。讓我們通過編碼器對每個位元組進行混淆。github 依賴安裝 root sudo pip install capstone root sudo pip install readline not necessary ...

簡單利用java反射 理解註解的作用

在新版框架中 都加入了 註解大大減少了xml配置的臃腫。新建註解 retention retentionpolicy.runtime public inte ce newhelloword通過反射 實現方法呼叫前後 註解的功能。public class parser system.out.print...

談談PHP反序列基礎和簡單利用

序列化其實就是將資料轉化成一種可逆的資料結構,自然,逆向的過程就叫做反序列化。php 將資料序列化和反序列化會用到兩個函式 serialize將物件格式化成有序的字串 unserialize將字串還原成原來的物件 序列化的目的是方便資料的傳輸和儲存,在php中,序列化和反序列化一般用做快取,比如se...