日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

缓存应用--Memcached分布式缓存简介(二)

發(fā)布時(shí)間:2023/12/1 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 缓存应用--Memcached分布式缓存简介(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1 命令行查看狀態(tài)

? 很多時(shí)候我們需要去查看Memcached 的使用狀態(tài),比如Memcached 的運(yùn)行時(shí)間,使用狀態(tài)等等。在Windows系統(tǒng)中我們可以使用telnet 命令來(lái)查看Memcached 的相關(guān)運(yùn)行情況。

??開(kāi)始—>運(yùn)行àcmd 運(yùn)行得到如下:

?

輸入telnet命令: telnet 服務(wù)地址 端口?

?

Memcached 的默認(rèn)端口號(hào)是11211
?? ? ?輸入stats 命令: 在這里屏幕是空白,看不到輸入的內(nèi)容,回車之后可以看到Memcached的運(yùn)行相關(guān)信息。?

?

Pid: Memcached 服務(wù)器中的進(jìn)程編號(hào)

?? Uptime:Memcached服務(wù)器啟動(dòng)之后所經(jīng)歷的時(shí)間,單位秒

?? Time: 當(dāng)前系統(tǒng)時(shí)間,單位秒

??Version: Memcached 的版本號(hào)

??pointer_size:服務(wù)器所在主機(jī)操作系統(tǒng)的指針大小,一般為32或64

??curr_items:表示當(dāng)前緩存中存放的所有緩存對(duì)象的數(shù)量

??total_items:表示從memcached服務(wù)啟動(dòng)到當(dāng)前時(shí)間,系統(tǒng)存儲(chǔ)過(guò)的所有對(duì)象的數(shù)量,包括已經(jīng)刪除的對(duì)象

??bytes:表示系統(tǒng)存儲(chǔ)緩存對(duì)象所使用的存儲(chǔ)空間,單位為字節(jié)

??curr_connections:表示當(dāng)前系統(tǒng)打開(kāi)的連接數(shù)

??total_connections:表示從memcached服務(wù)啟動(dòng)到當(dāng)前時(shí)間,系統(tǒng)打開(kāi)過(guò)的連接的總數(shù)

??cmd_get: 查詢緩存的次數(shù),即使不成功也算一次

??cmd_set: 保存數(shù)據(jù)的次數(shù),當(dāng)然這里只保存成功的次數(shù)

??get_hits:表示獲取數(shù)據(jù)成功的次數(shù)。

??get_misses:表示獲取數(shù)據(jù)失敗的次數(shù)。

??evictions:為了給新的數(shù)據(jù)項(xiàng)目釋放空間,從緩存移除的緩存對(duì)象的數(shù)目。比如超過(guò)緩存大小時(shí)根據(jù)LRU算法移除的對(duì)象,以及過(guò)期的對(duì)象

??bytes_read:memcached服務(wù)器從網(wǎng)絡(luò)讀取的總的字節(jié)數(shù)

??bytes_written:memcached服務(wù)器發(fā)送到網(wǎng)絡(luò)的總的字節(jié)數(shù)

??limit_maxbytes:memcached服務(wù)緩存允許使用的最大字節(jié)數(shù)

??threads:被請(qǐng)求的工作線程的總數(shù)量

緩存命中率 = get_hits / cmd_get * 100%?;?

2 Memcached 存儲(chǔ)機(jī)制

? ?? ??關(guān)于Memcached的存儲(chǔ)機(jī)制,在網(wǎng)上搜了一下講解基本上都是千篇一律的。

memcached默認(rèn)情況下采用了名為Slab Allocator的機(jī)制分配、管理內(nèi)存。在之前的版本中,Memcached存儲(chǔ)會(huì)導(dǎo)致很多內(nèi)存碎片,從而加重了操作系統(tǒng)對(duì)內(nèi)存管理的負(fù)擔(dān)。Slab Allocator的基本原理是按照預(yù)先規(guī)定的大小,將分配的內(nèi)存分割成特定長(zhǎng)度的塊, 以完全解決內(nèi)存碎片問(wèn)題。

借用一張圖說(shuō)明一下:?

?????

Slab Allocation 將分配的內(nèi)存分割成各種尺寸的chunk (塊),并把大小相同尺寸的chunk分為一組,就如上圖一樣:分割了 88b,112b,144b等尺寸。其實(shí)Slab Allocation還有重復(fù)利用內(nèi)存的功能,也就是說(shuō)分配的內(nèi)存不會(huì)釋放,而是重復(fù)利用。

當(dāng)存儲(chǔ)數(shù)據(jù)的時(shí)候,它會(huì)自動(dòng)去查找最為匹配的chunk,然后將數(shù)據(jù)存儲(chǔ)到其中。比如我存儲(chǔ)數(shù)據(jù)的大小為110B,那么它會(huì)存儲(chǔ)到112B的chunk中。

? ???上面的問(wèn)題來(lái)了,我存儲(chǔ)只需要110B,但是我存儲(chǔ)到112B的chunk中。如下圖(借用):?

?

?? ?那么在110b的存儲(chǔ)中會(huì)浪費(fèi)2B的內(nèi)存空間
至于如何完全解決這個(gè)內(nèi)存空間浪費(fèi)的問(wèn)題,還沒(méi)有很好的方案,不過(guò)Memcached的 增長(zhǎng)因子(Growth Factor)能夠適當(dāng)解決此問(wèn)題。目前Memcached的默認(rèn)增長(zhǎng)因子 ? ? ?是1.25,也就是說(shuō)會(huì)以原有的最大值基礎(chǔ)上乘以1.25 來(lái)分配空間。?

3 Memcached 對(duì)內(nèi)存資源的有效利用

之前已經(jīng)提到過(guò)了,Memcached 會(huì)重復(fù)利用已經(jīng)分配的內(nèi)存,也就是說(shuō)不會(huì)去刪除已有的數(shù)據(jù)而且釋放內(nèi)存空間,而是數(shù)據(jù)過(guò)期之后,用戶將數(shù)據(jù)不可見(jiàn)。

???????? Memcached 還是用了一種Lazy Expiration (延遲過(guò)期[姑且這樣翻譯]) 技術(shù),就是Memcached不會(huì)去監(jiān)視服務(wù)器上的數(shù)據(jù)是否過(guò)期,而是等待get的時(shí)候檢查時(shí)間戳是否過(guò)期,減少M(fèi)emcached在監(jiān)控?cái)?shù)據(jù)上所用到的時(shí)間。

Memcached 不會(huì)去釋放已經(jīng)使用的內(nèi)存空間,但是如果分配的內(nèi)存空間已經(jīng)滿了,而Memcached 是如何去保證內(nèi)存空間的重復(fù)使用呢!Memcached 是用了 Least Recently Used(LRU) 機(jī)制來(lái)協(xié)調(diào)內(nèi)存空間的使用。LRU 意思就是最少最近使用,當(dāng)此處內(nèi)存空間數(shù)據(jù)最長(zhǎng)時(shí)間沒(méi)有使用,而且使用次數(shù)很少,在存儲(chǔ)新的數(shù)據(jù)的同時(shí)就會(huì)覆蓋此處空間。?

4 Memcached 客戶端使用簡(jiǎn)單封裝

本文很多都是理論上的分析,這些大多也是從網(wǎng)絡(luò)上看來(lái)的,根據(jù)自己的理解和實(shí)際的應(yīng)用做了一些總結(jié)。有時(shí)候我們使用Memcached的客戶端時(shí)并不是那么的友好,這里對(duì)其做了一下簡(jiǎn)單的封裝,抽象出來(lái)了一個(gè)接口:

1?usingSystem;
2?usingSystem.Collections.Generic;
3?usingSystem.Linq;
4?usingSystem.Text;
5?usingSystem.Collections;
6?
7?namespaceMemcachedTest
8?{
9?publicinterfaceICache
10?{
11?boolContainKey(stringargKey);
12?
13?boolAdd(stringargKey,objectargValue);
14?
15?boolAdd(stringargKey,?objectargValue,?DateTime?argDateExpiration);
16?
17?boolAdd<T>(stringargKey,?T?entity)?whereT?:?class;
18?
19?boolAdd<T>(stringargKey,?T?entity,?DateTime?argDateExpiration)?whereT?:?class;
20?
21?boolSet(stringargKey,?objectargValue);
22?
23?boolSet(stringargKey,?objectargValue,?DateTime?argDateExpiration);
24?
25?boolSet<T>(stringargKey,?T?entity)?whereT?:?class;
26?
27?boolSet<T>(stringargKey,?T?entity,?DateTime?argDateExpiration)?whereT?:?class;
28?
29?boolReplace(stringargKey,objectargValue);
30?
31?boolReplace(stringargKey,objectargValue,DateTime?argDateExpiration);
32?
33?boolReplace<T>(stringargKey,?T?entity)?whereT?:?class;
34?
35?boolReplace<T>(stringargKey,?T?entity,?DateTime?argDateExpiration)?whereT?:?class;
36?
37?objectGet(stringargKey);
38?
39?T?Get<T>(stringargKey);
40?
41?boolRemove(stringargKey);
42?
43?boolRemove(stringargKey,?DateTime?argDateExpiration);
44?
45?boolRemove();
46?
47?boolRemove(ArrayList?servers);
48?
49?}

50?}?

下面這段代碼對(duì)上面的接口進(jìn)行了實(shí)現(xiàn),里面的代碼大多數(shù)人應(yīng)該能夠看懂,是比較簡(jiǎn)單的代碼封裝,如果能夠了解本人上一篇的簡(jiǎn)單應(yīng)用,對(duì)于這個(gè)封裝的理解應(yīng)該沒(méi)有難度。實(shí)現(xiàn)代碼如下:

1?usingSystem;
2?usingSystem.Collections.Generic;
3?usingSystem.Linq;
4?usingSystem.Text;
5?usingMemcached.ClientLibrary;
6?usingSystem.Collections;
7?
8?namespaceMemcachedTest
9?{
10?publicclassMemcache:ICache
11?{
12?privateMemcachedClient?client;
13?privatestaticMemcache?memcache;
14?
15?///<summary>
16?///構(gòu)造方法
17?///</summary>
18?protectedMemcache()
19?{
20?SockIOPool?pool?=SockIOPool.GetInstance();
21?string[]?servers?={?"127.0.0.1:11211"};
22?pool.SetServers(servers);
23?pool.MinConnections?=3;
24?pool.MaxConnections?=5;
25?pool.InitConnections?=3;
26?pool.SocketConnectTimeout?=5000;
27?pool.Initialize();
28?this.client?=newMemcachedClient();
29?client.EnableCompression?=false;
30?}
31?
32?publicstaticMemcache?Instance()
33?{
34?if(memcache?==null)
35?{
36?memcache?=newMemcache();
37?}
38?returnmemcache;
39?}
40?
41?
42?///<summary>
43?///判斷是否包含某個(gè)鍵
44?///</summary>
45?///<param?name="argKey">鍵值</param>
46?///<returns></returns>
47?publicboolContainKey(stringargKey)
48?{
49?returnclient.KeyExists(argKey);
50?}
51?
52?///<summary>
53?///添加緩存數(shù)據(jù)
54?///</summary>
55?///<param?name="argKey">鍵值</param>
56?///<param?name="argValue">存儲(chǔ)值</param>
57?///<returns></returns>
58?publicboolAdd(stringargKey,?objectargValue)
59?{
60?returnclient.Add(argKey,argValue);
61?}
62?
63?///<summary>
64?///添加緩存數(shù)據(jù)
65?///</summary>
66?///<param?name="argKey">鍵值</param>
67?///<param?name="argValue">存儲(chǔ)值</param>
68?///<param?name="argDateExpiration">過(guò)期時(shí)間</param>
69?///<returns></returns>
70?publicboolAdd(stringargKey,?objectargValue,?DateTime?argDateExpiration)
71?{
72?returnclient.Add(argKey,?argValue,?argDateExpiration);
73?}
74?
75?///<summary>
76?///添加緩存數(shù)據(jù)
77?///</summary>
78?///<typeparam?name="T">存儲(chǔ)對(duì)象類型</typeparam>
79?///<param?name="argKey">鍵值</param>
80?///<param?name="entity">存儲(chǔ)值</param>
81?///<returns></returns>
82?publicboolAdd<T>(stringargKey,?T?entity)?whereT?:?class
83?{
84?returnclient.Add(argKey,?entity);
85?}
86?
87?///<summary>
88?///添加緩存數(shù)據(jù)
89?///</summary>
90?///<typeparam?name="T">存儲(chǔ)對(duì)象類型</typeparam>
91?///<param?name="argKey">鍵值</param>
92?///<param?name="entity">存儲(chǔ)值</param>
93?///<param?name="argDateExpiration">過(guò)期時(shí)間</param>
94?///<returns></returns>
95?publicboolAdd<T>(stringargKey,?T?entity,?DateTime?argDateExpiration)?whereT?:?class
96?{
97?returnclient.Add(argKey,?entity,?argDateExpiration);
98?}
99?
100?///<summary>
101?///添加緩存數(shù)據(jù),如果存在則替換原有數(shù)據(jù)
102?///</summary>
103?///<param?name="argKey">鍵值</param>
104?///<param?name="argValue">存儲(chǔ)值</param>
105?///<returns></returns>
106?publicboolSet(stringargKey,?objectargValue)
107?{
108?if(ContainKey(argKey))
109?{
110?returnfalse;
111?}
112?returnclient.Set(argKey,?argValue);
113?}
114?
115?///<summary>
116?///添加緩存數(shù)據(jù),如果存在則替換原有數(shù)據(jù)
117?///</summary>
118?///<param?name="argKey">鍵值</param>
119?///<param?name="argValue">存儲(chǔ)值</param>
120?///<param?name="argDateExpiration">過(guò)期時(shí)間</param>
121?///<returns></returns>
122?publicboolSet(stringargKey,?objectargValue,?DateTime?argDateExpiration)
123?{
124?if(ContainKey(argKey))
125?{
126?returnfalse;
127?}
128?returnclient.Set(argKey,?argValue,?argDateExpiration);
129?}
130?
131?///<summary>
132?///添加緩存數(shù)據(jù),如果存在則替換原有數(shù)據(jù)
133?///</summary>
134?///<typeparam?name="T">存儲(chǔ)對(duì)象類型</typeparam>
135?///<param?name="argKey">鍵值</param>
136?///<param?name="entity">存儲(chǔ)值</param>
137?///<returns></returns>
138?publicboolSet<T>(stringargKey,?T?entity)?whereT?:?class
139?{
140?if(ContainKey(argKey))
141?{
142?returnfalse;
143?}
144?returnclient.Set(argKey,?entity);
145?}
146?
147?///<summary>
148?///添加緩存數(shù)據(jù),如果存在則替換原有數(shù)據(jù)
149?///</summary>
150?///<typeparam?name="T">存儲(chǔ)對(duì)象類型</typeparam>
151?///<param?name="argKey">鍵值</param>
152?///<param?name="entity">存儲(chǔ)值</param>
153?///<param?name="argDateExpiration">過(guò)期時(shí)間</param>
154?///<returns></returns>
155?publicboolSet<T>(stringargKey,?T?entity,?DateTime?argDateExpiration)?whereT?:?class
156?{
157?if(ContainKey(argKey))
158?{
159?returnfalse;
160?}
161?returnclient.Set(argKey,?entity,?argDateExpiration);
162?}
163?
164?
165?///<summary>
166?///替換原有緩存
167?///</summary>
168?///<param?name="argKey">鍵值</param>
169?///<param?name="argValue">存儲(chǔ)值</param>
170?///<returns></returns>
171?publicboolReplace(stringargKey,?objectargValue)
172?{
173?returnclient.Replace(argKey,argValue);
174?}
175?
176?///<summary>
177?///替換原有緩存
178?///</summary>
179?///<param?name="argKey">鍵值</param>
180?///<param?name="argValue">存儲(chǔ)值</param>
181?///<param?name="argDateExpiration">過(guò)期時(shí)間</param>
182?///<returns></returns>
183?publicboolReplace(stringargKey,?objectargValue,?DateTime?argDateExpiration)
184?{
185?returnclient.Replace(argKey,argValue,argDateExpiration);
186?}
187?
188?publicboolReplace<T>(stringargKey,?T?entity)?whereT?:?class
189?{
190?returnclient.Replace(argKey,entity);
191?}
192?
193?publicboolReplace<T>(stringargKey,?T?entity,?DateTime?argDateExpiration)?whereT?:?class
194?{
195?returnclient.Replace(argKey,?entity,argDateExpiration);
196?}
197?
198?publicobjectGet(stringargKey)
199?{
200?returnclient.Get(argKey);
201?}
202?
203?publicT?Get<T>(stringargKey)
204?{
205?T?entity=default(T);
206?entity?=(T)client.Get(argKey);
207?returnentity;
208?}
209?
210?publicboolRemove(stringargKey)
211?{
212?returnclient.Delete(argKey);
213?}
214?
215?publicboolRemove(stringargKey,?DateTime?argDateExpiration)
216?{
217?returnclient.Delete(argKey,argDateExpiration);
218?}
219?
220?publicboolRemove()
221?{
222?returnclient.FlushAll();
223?}
224?
225?publicboolRemove(ArrayList?servers)
226?{
227?returnclient.FlushAll(servers);
228?}
229?}

230?}?

上面的代碼沒(méi)有注釋,因?yàn)樘峤徊涣诉@么長(zhǎng)的代碼,去掉了注釋。代碼大家可以看懂的,這里不做過(guò)多的講解。?

? 學(xué)習(xí)例子源碼下載?

轉(zhuǎn)載于:https://www.cnblogs.com/aaa6818162/archive/2011/04/20/2022305.html

總結(jié)

以上是生活随笔為你收集整理的缓存应用--Memcached分布式缓存简介(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。