Memcached 缓存个体,对象,泛型,表
轉(zhuǎn)自 :http://www.cnblogs.com/panshengqiang/p/3605599.html
?
?下面是兩位大牛關(guān)于Memcached的介紹;大家可以看看
?
http://zhoufoxcn.blog.51cto.com/792419/528212
?
http://leepiao.blog.163.com/blog/static/48503130201104103344851/
?如下是我的總結(jié):
Memcached是一個(gè)命令行窗口程序,可以在命令行窗口中啟動(dòng)也可以封裝在系統(tǒng)服務(wù)中啟動(dòng)。在啟動(dòng)Memcached時(shí)需要提供一些必須的參數(shù),指定Memcached運(yùn)行時(shí)監(jiān)聽(tīng)的端口和最大使用的內(nèi)存大小等。如果緩存的數(shù)據(jù)大小超過(guò)指定內(nèi)存,那么Memcached就會(huì)按照LRU(Least Recently Used)算法自動(dòng)“刪除”不使用的緩存(標(biāo)記為失效),新增的緩存數(shù)據(jù)就可以使用這些標(biāo)記為失效的數(shù)據(jù)所占用的內(nèi)存,這樣就不用擔(dān)心Memcached超出所指定內(nèi)存的問(wèn)題。此外,為了提高性能,在緩存數(shù)據(jù)過(guò)期后Memcached并不是從物理內(nèi)存中刪除緩存的數(shù)據(jù),僅僅在取出改數(shù)據(jù)的時(shí)候檢查它是否已經(jīng)過(guò)了有效期。
目前有多種平臺(tái)的Memcached版本,比如Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X及Windows平臺(tái),在Windows平臺(tái)上還有32位和64位版本。
Memcached有一套協(xié)議,利用這套協(xié)議可以對(duì)Memcached進(jìn)行數(shù)據(jù)存取和查看Memcached的狀態(tài),很多程序語(yǔ)言都依據(jù)這套協(xié)議來(lái)操作Memcached,比如PHP、Java、C、C++及C#等。
獲取了對(duì)應(yīng)平臺(tái)的Memcached版本就可以運(yùn)行Memcached了。在這里僅以Windows平臺(tái)上的32位Memcached為例
?
1 把memcached文件夾放在指定路徑,我選擇了C盤根目錄
2 使用管理員身份(切記)在命令行按照memcached;
?? memcached.exe -d install
3
在客戶端還可以通過(guò)telnet來(lái)查看和操作Memcached,前提是服務(wù)器端和客戶端都支持Telnet協(xié)議,在Windows7和Windows2008中默認(rèn)都不支持,需要在控制面板中安裝和啟用。
首先打開(kāi)控制面板,然后點(diǎn)擊“打開(kāi)或關(guān)閉Windows功能”,如下圖所示:
?
?
點(diǎn)擊“打開(kāi)或關(guān)閉Windows功能”之后會(huì)看到當(dāng)前系統(tǒng)啟用的功能的狀態(tài),根據(jù)當(dāng)前機(jī)器選擇打開(kāi)Telnet服務(wù)器端或者客戶端功能,如下圖所示:
?
?
?
經(jīng)過(guò)上面的操作之后就可以在客服端遠(yuǎn)程查看Memcached的狀態(tài)或者操作Memcached了。下面的命令就是連接到Memcached:
telnet localhost 11121
連接之后會(huì)出現(xiàn)一個(gè)命令行窗口,在這個(gè)命令行窗口中輸入"stats"就可以看到當(dāng)前Memcached的狀態(tài),如下就是剛剛啟動(dòng)的Memcached的狀態(tài)數(shù)據(jù):
STAT pid 852
STAT uptime 1399
STAT time 1300979378
STAT version 1.2.5
STAT pointer_size 32
STAT curr_items 0
STAT total_items 0
STAT bytes 0
STAT curr_connections 3
STAT total_connections 5
STAT connection_structures 4
STAT cmd_get 0
STAT cmd_set 0
STAT get_hits 0
STAT get_misses 0
STAT evictions 0
STAT bytes_read 23
STAT bytes_written 415
STAT limit_maxbytes 67108864
STAT threads 1
END
通過(guò)這個(gè)數(shù)據(jù)我們就可以了解Memcached的狀態(tài)了。
這些數(shù)據(jù)所代表的意義如下:
pid:32u,服務(wù)器進(jìn)程ID。?
uptime:32u, 服務(wù)器運(yùn)行時(shí)間,單位秒。?
time :32u, 服務(wù)器當(dāng)前的UNIX時(shí)間。
version :string, 服務(wù)器的版本號(hào)。?
curr_items :32u, 服務(wù)器當(dāng)前存儲(chǔ)的內(nèi)容數(shù)量 Current number of items stored by the server?
total_items :32u, 服務(wù)器啟動(dòng)以來(lái)存儲(chǔ)過(guò)的內(nèi)容總數(shù)。
bytes :64u, 服務(wù)器當(dāng)前存儲(chǔ)內(nèi)容所占用的字節(jié)數(shù)。
curr_connections :32u, 連接數(shù)量。?
total_connections :32u, 服務(wù)器運(yùn)行以來(lái)接受的連接總數(shù)。
connection_structures:32u, 服務(wù)器分配的連接結(jié)構(gòu)的數(shù)量。?
cmd_get :32u, 取回請(qǐng)求總數(shù)。?
cmd_set :32u, 存儲(chǔ)請(qǐng)求總數(shù)。?
get_hits :32u, 請(qǐng)求成功的總次數(shù)。
get_misses :32u, 請(qǐng)求失敗的總次數(shù)。
bytes_read :64u, 服務(wù)器從網(wǎng)絡(luò)讀取到的總字節(jié)數(shù)。
bytes_written :64u, 服務(wù)器向網(wǎng)絡(luò)發(fā)送的總字節(jié)數(shù)。
limit_maxbytes :32u, 服務(wù)器在存儲(chǔ)時(shí)被允許使用的字節(jié)總數(shù)。
上面的描述中32u和64u表示32位和64位無(wú)符號(hào)整數(shù),string表示是string類型數(shù)據(jù)。
?
?
在.NET中應(yīng)用Memcached
?
下面是一個(gè)Enyim Memcached的例子:
緩存單體;對(duì)象,泛型;表都可以
需要引用dll?Memcached.ClientLibrary
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Memcached.ClientLibrary;
using System.Collections;
namespace WindowsFormsApplication1
{
??? public partial class Form1 : Form
??? {
?
??????? public Form1()
??????? {
??????????? InitializeComponent();
??????????? SockIOPool pool = SockIOPool.GetInstance();
??????????? string[] servers = { "127.0.0.1:11211" };
??????????? pool.SetServers(servers);
??????????? pool.MinConnections = 3;
??????????? pool.MaxConnections = 5;
??????????? pool.InitConnections = 3;
??????????? pool.SocketConnectTimeout = 5000;
???? ???????pool.Initialize();
??????? }
?
??????? private void button1_Click(object sender, EventArgs e)
??????? {
?
??????????? MemcachedClient client = new MemcachedClient();
??????????? client.EnableCompression = false;
??????????? client.Set("key1", "單體測(cè)試");
??????????? MessageBox.Show("key1:單體測(cè)試");
??????????? //Person demo = new Person { UserId = 1, UserName = "李剛" };
??????????? //client.Set("demo", demo);
??????????? //client.Get("demo");
?
??????????? //Console.WriteLine("———————–Memcached Set 設(shè)置值————————–");
??????????? //client.Set("key1", "value1");
??????????? //Console.WriteLine(client.Get("key1"));
??????????? //Console.WriteLine("———————–Memcached Add 設(shè)置值————————–");
??????????? //client.Add("key2", "value2");
??????????? //Console.WriteLine(client.Get("key2"));
??????????? //client.Set("key2", "value1 value2");
??????????? //Console.WriteLine(client.Get("key2"));
??????????? //Console.WriteLine("———————–Memcached Replace 設(shè)置值————————–");
??????????? //client.Replace("key2", "value3");
??????????? //Console.WriteLine(client.Get("key2"));
?
??????????? //Console.WriteLine("———————–Memcached 鍵值是否存在————————–");
??????????? //if (client.KeyExists("key2"))
??????????? //{
??????????? //??? Console.WriteLine("鍵key2 存在");
??????????? //}
??????????? //if (client.KeyExists("hechen") == false)
??????????? //{
??????????? //??? Console.WriteLine("鍵hechen 不存在");
??????????? //}
?
??????????? //Console.WriteLine("———————–Memcached 刪除數(shù)據(jù)————————–");
??????????? //client.Add("key4", "value4");
??????????? //Console.WriteLine("key4==>" + client.Get("key4"));
??????????? //client.Delete("key4");
??????????? //if (!client.KeyExists("key4"))
??????????? //{
??????????? //??? Console.WriteLine("key4 已將刪除");
??????????? //}
?
??????????? //Console.WriteLine("———————–Memcached 數(shù)據(jù)過(guò)期————————–");
??????????? //client.Add("key5", "value5", DateTime.Now.AddMilliseconds(5000));
??????????? //Console.WriteLine(client.Get("key5"));
??????????? //System.Threading.Thread.Sleep(6000);
??????????? //Console.WriteLine("過(guò)期: " + client.Get("key5"));
??????? }
?
??????? private void button2_Click(object sender, EventArgs e)
??????? {
??????????? MemcachedClient client = new MemcachedClient();
??????????? txt01.Text = client.Get("key1").ToString();
??????? }
?
??????? private void button4_Click(object sender, EventArgs e)
??????? {
??????????? Person person = new Person { UserId = 1, UserName = "李剛" };
??????????? MemcachedClient client = new MemcachedClient();
??????????? client.EnableCompression = false;
??????????? client.Set("key2", person);
??????????? MessageBox.Show("key2:對(duì)象PersonUserId = 1, UserName =李剛");
??????? }
?
??????? private void button3_Click(object sender, EventArgs e)
??????? {
??????????? MemcachedClient client = new MemcachedClient();
??????????? object demo = client.Get("key2");
??????????? Person cc = demo as Person;
??????????? txt01.Text = cc.UserId.ToString() + ";" + cc.UserName.ToString();
??????? }
?
??????? private void button6_Click(object sender, EventArgs e)
??????? {
??????????? ArrayList arraylist = new ArrayList();
??????????? arraylist.Add("泛型集合測(cè)試1");
??????????? arraylist.Add("泛型集合測(cè)試2");
??????????? arraylist.Add("泛型集合測(cè)試3");
??????????? MemcachedClient client = new MemcachedClient();
??????????? client.EnableCompression = false;
??????????? client.Set("key3", arraylist);
??????????? MessageBox.Show("key3:泛型集合測(cè)試1,泛型集合測(cè)試2,泛型集合測(cè)試3");
??????? }
?
??????? private void button5_Click(object sender, EventArgs e)
??????? {
??????????? MemcachedClient client = new MemcachedClient();
??????????? object demo = client.Get("key3");
??????????? ArrayList arraylist = demo as ArrayList;
??????????? int count = arraylist.Count;
??????????? txt01.Text = arraylist[0].ToString() + ";" + arraylist[1].ToString() + ";" + arraylist[2].ToString() + ";";
??????? }
?
?? ?????private void button8_Click(object sender, EventArgs e)
??????? {
??????????? DataTable dt = new DataTable();
??????????? string str = "";
??????????? dt.Columns.Add("id");
??????????? dt.Columns.Add("name");
??????????? DataRow dr = dt.NewRow();
??????????? for (int i = 0; i < 3; i++)
??????????? {
??????????????? dr = dt.NewRow();
??????????????? dr["id"] = "00" + i.ToString();
??????????????? dr["name"] = "姓名" + i.ToString();
??????????????? dt.Rows.Add(dr);
??????????????? str += dr["id"] + "," + dr["name"] + ";";
??????????? }
?
??????????? MemcachedClient client = new MemcachedClient();
??????????? client.EnableCompression = false;
??????????? client.Set("key4", dt);
??????????? MessageBox.Show("key4:" + str);
?
??????? }
?
??????? private void button7_Click(object sender, EventArgs e)
??????? {
??????????? MemcachedClient client = new MemcachedClient();
??????????? object demo = client.Get("key4");
??????????? DataTable dt = demo as DataTable;
??????????? int count = dt.Rows.Count;
??????????? txt01.Text = dt.Rows[0][0].ToString() + "," + dt.Rows[0][1].ToString() + ";" + dt.Rows[1][0].ToString() + "," + dt.Rows[1][1].ToString() + ";" + dt.Rows[2][0].ToString() + "," + dt.Rows[2][1].ToString() + ";";
??????? }
?
??????
??? }
}
?
?
memcache 的限制??
memcache單個(gè)緩存值限制為1M(1000000bytes),超過(guò)這個(gè)限制的時(shí)候會(huì)出如下錯(cuò)誤。
ValueError: Values may not be more than 1000000 bytes in length; received 2000000 bytes
memcache的keys限制為250 bytes,超過(guò)這個(gè)長(zhǎng)度會(huì)報(bào)錯(cuò)。
ValueError: Keys may not be more than 250 bytes in length, received 14670 bytes
memcache的時(shí)間設(shè)置沒(méi)限制,但服務(wù)器會(huì)自動(dòng)清理緩存,官方好像說(shuō)過(guò)最長(zhǎng)為1個(gè)月時(shí)間(3600*24*30)。
2.6.Memcache::add
2.5.1.說(shuō)明
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]]
) 添加一個(gè)要緩存的數(shù)據(jù)如果作為這個(gè)緩存的數(shù)據(jù)的鍵在服務(wù)器上還不存在的情況下,
2.5.2.參數(shù)
key 緩存數(shù)據(jù)的鍵 其長(zhǎng)度不能超過(guò)250個(gè)字符
var 值,整型將直接存儲(chǔ),其他類型將被序列化存儲(chǔ) ,其值最大為1M
flag 是否使用 zlib 壓縮
,當(dāng)flag=MEMCACHE_COMPRESSED的時(shí)侯,數(shù)據(jù)很小的時(shí)候不會(huì)采用zlib壓縮,只有數(shù)據(jù)達(dá)到一定大小才對(duì)數(shù)據(jù)進(jìn)行zlib壓縮。(沒(méi)有具體的測(cè)試數(shù)據(jù)進(jìn)行壓縮的最小值是多少)
expire 過(guò)期時(shí)間,0 為永不過(guò)期,可使用 unix 時(shí)間戳格式或距離當(dāng)前時(shí)間的秒數(shù),設(shè)為秒數(shù)時(shí)不能大于 2592000(30
天)
2.5.3.返回值
成功返回 TRUE,失敗返回 FALSE,如果這個(gè)鍵已經(jīng)存在,其他方面memcache:;add()的行為與memcache::set相似
2.5.4.范例
<?
$memcache_obj = memcache_connect("localhost", 11211);
/* procedural API */
memcache_add($memcache_obj, ‘var_key‘, ‘test variable‘, FALSE, 30);
/* OO API */
$memcache_obj-add(‘var_key‘, ‘test variable‘, FALSE, 30);
?>
2.6.Memcache::replace
2.6.1.說(shuō)明
bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire
]] )
替換一個(gè)指定 已存在key 的的緩存變量?jī)?nèi)容
2.6.2.參數(shù)
key 緩存數(shù)據(jù)的鍵, 其長(zhǎng)度不能超過(guò)250個(gè)字符
var 值,整型將直接存儲(chǔ),其他類型將被序列化存儲(chǔ),其值最大為1M
flag 是否使用 zlib 壓縮
,當(dāng)flag=MEMCACHE_COMPRESSED的時(shí)侯,數(shù)據(jù)很小的時(shí)候不會(huì)采用zlib壓縮,只有數(shù)據(jù)達(dá)到一定大小才對(duì)數(shù)據(jù)進(jìn)行zlib壓縮。(沒(méi)有具體的測(cè)試數(shù)據(jù)進(jìn)行壓縮的最小值是多少)
expire 過(guò)期時(shí)間,0 為永不過(guò)期,可使用 unix 時(shí)間戳格式或距離當(dāng)前時(shí)間的秒數(shù),設(shè)為秒數(shù)時(shí)不能大于 2592000(30
天)
2.6.3.返回值
成功返回 TRUE,失敗返回 FALSE。
2.6.4.范例
<?php
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* procedural API */
memcache_replace($memcache_obj, "test_key", "some variable", FALSE, 30);
/* OO API */
$memcache_obj-replace("test_key", "some variable", FALSE, 30);
?>
2.7.Memcache::set
2.7.1.說(shuō)明
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]]
) 設(shè)置一個(gè)指定 key 的緩存變量?jī)?nèi)容
2.7.2.參數(shù)
key 緩存數(shù)據(jù)的鍵, 其長(zhǎng)度不能超過(guò)250個(gè)字符
var 值,整型將直接存儲(chǔ),其他類型將被序列化存儲(chǔ),其值最大為1M
flag 是否使用 zlib 壓縮
,當(dāng)flag=MEMCACHE_COMPRESSED的時(shí)侯,數(shù)據(jù)很小的時(shí)候不會(huì)采用zlib壓縮,只有數(shù)據(jù)達(dá)到一定大小才對(duì)數(shù)據(jù)進(jìn)行zlib壓縮。(沒(méi)有具體的測(cè)試數(shù)據(jù)進(jìn)行壓縮的最小值是多少)
expire 過(guò)期時(shí)間,0 為永不過(guò)期,可使用 unix 時(shí)間戳格式或距離當(dāng)前時(shí)間的秒數(shù),設(shè)為秒數(shù)時(shí)不能大于 2592000(30
天)
2.7.3.返回值
成功返回 TRUE,失敗返回 FALSE。
2.7.4.范例
<?php
/* procedural API */
/* connect to memcached server */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/*
set value of item with key ‘var_key‘
using 0 as flag value, compression is not used
expire time is 30 second
*/
memcache_set($memcache_obj, ‘var_key‘, ‘some variable‘, 0, 30);
echo memcache_get($memcache_obj, ‘var_key‘);
/* OO API */
$memcache_obj = new Memcache;
/* connect to memcached server */
$memcache_obj-connect(‘memcache_host‘, 11211);
/*
set value of item with key ‘var_key‘, using on-the-fly compression
expire time is 50 seconds
*/
$memcache_obj-set(‘var_key‘, ‘some really big variable‘, MEMCACHE_COMPRESSED, 50);
echo $memcache_obj-get(‘var_key‘);
?>
2.8.Memcache::get
2.8.1.說(shuō)明
string Memcache::get ( string $key [, int $flags ] )
array Memcache::get ( array $keys [, array $flags ] )
獲取某個(gè) key 的變量緩存值
2.8.2.參數(shù)
key 緩存值的鍵
flags 如果是傳址某個(gè)變量,獲取緩存值被set或是add的flag結(jié)果將被存于該變量
2.8.3.返回值
返回緩存的指定 key 的變量?jī)?nèi)容或者是在失敗或該變量的值不存在時(shí)返回 FALSE
如果傳出的key的數(shù)組中的key都不存在,返回的結(jié)果是一個(gè)空數(shù)組,反之則返回key與緩存值相關(guān)聯(lián)的關(guān)聯(lián)數(shù)組
2.8.4.范例
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
$var = memcache_get($memcache_obj, ‘some_key‘);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj-connect(‘memcache_host‘, 11211);
$var = $memcache_obj-get(‘some_key‘);
/*
You also can use array of keys as a parameter.
If such item wasn‘t found at the server, the result
array simply will not include such key.
*/
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
$var = memcache_get($memcache_obj, Array(‘some_key‘, ‘a(chǎn)nother_key‘));
//如果some_key,another_key不存在 $var = array();
//如果some_key,another_key存在???? $var = array(‘some_key‘=‘緩存值‘, ‘a(chǎn)nother_key‘=‘緩存值‘);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj-connect(‘memcache_host‘, 11211);
$var = $memcache_obj-get(Array(‘some_key‘, ‘second_key‘));
?>
2.9.Memcache::delete
2.9.1.說(shuō)明
bool Memcache::delete ( string $key [, int $timeout ] )
刪除某一個(gè)變量的緩存
2.9.2.參數(shù)
key???? 緩存的鍵 鍵值不能為null和‘’,當(dāng)它等于前面兩個(gè)值的時(shí)候php會(huì)有警告錯(cuò)誤。
timeout 刪除這項(xiàng)的時(shí)間,如果它等于0,這項(xiàng)將被立刻刪除反之如果它等于30秒,那么這項(xiàng)被刪除在30秒內(nèi)
2.9.3.返回值
成功返回 TRUE,失敗返回 FALSE。
2.9.4.范例
<?php
/* procedural API */
$memcache_obj = memcache_connect(‘memcache_host‘, 11211);
/* after 10 seconds item will be deleted by the server */
memcache_delete($memcache_obj, ‘key_to_delete‘, 10);
/* OO API */
$memcache_obj = new Memcache;
$memcache_obj-connect(‘memcache_host‘, 11211);
$memcache_obj-delete(‘key_to_delete‘, 10);
?>
轉(zhuǎn)載于:https://www.cnblogs.com/lijiasnong/p/4934381.html
總結(jié)
以上是生活随笔為你收集整理的Memcached 缓存个体,对象,泛型,表的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jQuery表单对象属性过滤选择器
- 下一篇: Java对象初始化