Memcached 缓存个体,对象,泛型,表
最近,为提高数据查询速度,想做点缓存,通过网上了解,觉得,最好使用的就是Memcached;下面简单给大家介绍下Memcached;
下面是两位大牛关于Memcached的介绍;大家可以看看
http://zhoufoxcn.blog.51cto.com/792419/528212
http://leepiao.blog.163.com/blog/static/48503130201104103344851/
如下是我的总结:
Memcached是一个命令行窗口程序,可以在命令行窗口中启动也可以封装在系统服务中启动。在启动Memcached时需要提供一些必须的参数,指定Memcached运行时监听的端口和最大使用的内存大小等。如果缓存的数据大小超过指定内存,那么Memcached就会按照LRU(Least Recently Used)算法自动“删除”不使用的缓存(标记为失效),新增的缓存数据就可以使用这些标记为失效的数据所占用的内存,这样就不用担心Memcached超出所指定内存的问题。此外,为了提高性能,在缓存数据过期后Memcached并不是从物理内存中删除缓存的数据,仅仅在取出改数据的时候检查它是否已经过了有效期。
目前有多种平台的Memcached版本,比如Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac
OS X及Windows平台,在Windows平台上还有32位和64位版本。
Memcached有一套协议,利用这套协议可以对Memcached进行数据存取和查看Memcached的状态,很多程序语言都依据这套协议来操作Memcached,比如PHP、Java、C、C++及C#等。
获取了对应平台的Memcached版本就可以运行Memcached了。在这里仅以Windows平台上的32位Memcached为例
1 把memcached文件夹放在指定路径,我选择了C盘根目录
2 使用管理员身份(切记)在命令行按照memcached;
memcached.exe -d install
3
在客户端还可以通过telnet来查看和操作Memcached,前提是服务器端和客户端都支持Telnet协议,在Windows7和Windows2008中默认都不支持,需要在控制面板中安装和启用。
首先打开控制面板,然后点击“打开或关闭Windows功能”,如下图所示:
点击“打开或关闭Windows功能”之后会看到当前系统启用的功能的状态,根据当前机器选择打开Telnet服务器端或者客户端功能,如下图所示:
经过上面的操作之后就可以在客服端远程查看Memcached的状态或者操作Memcached了。下面的命令就是连接到Memcached:
telnet localhost 11121
连接之后会出现一个命令行窗口,在这个命令行窗口中输入"stats"就可以看到当前Memcached的状态,如下就是刚刚启动的Memcached的状态数据:
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
通过这个数据我们就可以了解Memcached的状态了。
这些数据所代表的意义如下:
pid:32u,服务器进程ID。
uptime:32u, 服务器运行时间,单位秒。
time :32u, 服务器当前的UNIX时间。
version :string, 服务器的版本号。
curr_items :32u, 服务器当前存储的内容数量
Current number of items stored by the server
total_items :32u, 服务器启动以来存储过的内容总数。
bytes :64u, 服务器当前存储内容所占用的字节数。
curr_connections :32u, 连接数量。
total_connections :32u, 服务器运行以来接受的连接总数。
connection_structures:32u, 服务器分配的连接结构的数量。
cmd_get :32u, 取回请求总数。
cmd_set :32u, 存储请求总数。
get_hits :32u, 请求成功的总次数。
get_misses :32u, 请求失败的总次数。
bytes_read :64u, 服务器从网络读取到的总字节数。
bytes_written :64u, 服务器向网络发送的总字节数。
limit_maxbytes :32u, 服务器在存储时被允许使用的字节总数。
上面的描述中32u和64u表示32位和64位无符号整数,string表示是string类型数据。
在.NET中应用Memcached
下面是一个Enyim Memcached的例子:
缓存单体;对象,泛型;表都可以
需要引用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", "单体测试");
MessageBox.Show("key1:单体测试");
//Person demo = new Person { UserId = 1, UserName = "李刚" };
//client.Set("demo", demo);
//client.Get("demo");
//Console.WriteLine("———————–Memcached Set 设置值————————–");
//client.Set("key1", "value1");
//Console.WriteLine(client.Get("key1"));
//Console.WriteLine("———————–Memcached Add 设置值————————–");
//client.Add("key2", "value2");
//Console.WriteLine(client.Get("key2"));
//client.Set("key2", "value1 value2");
//Console.WriteLine(client.Get("key2"));
//Console.WriteLine("———————–Memcached Replace 设置值————————–");
//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 删除数据————————–");
//client.Add("key4", "value4");
//Console.WriteLine("key4==>" + client.Get("key4"));
//client.Delete("key4");
//if (!client.KeyExists("key4"))
//{
// Console.WriteLine("key4 已将删除");
//}
//Console.WriteLine("———————–Memcached 数据过期————————–");
//client.Add("key5", "value5", DateTime.Now.AddMilliseconds(5000));
//Console.WriteLine(client.Get("key5"));
//System.Threading.Thread.Sleep(6000);
//Console.WriteLine("过期: " + 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:对象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("泛型集合测试1");
arraylist.Add("泛型集合测试2");
arraylist.Add("泛型集合测试3");
MemcachedClient client = new MemcachedClient();
client.EnableCompression = false;
client.Set("key3", arraylist);
MessageBox.Show("key3:泛型集合测试1,泛型集合测试2,泛型集合测试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单个缓存值限制为1M(1000000bytes),超过这个限制的时候会出如下错误。
ValueError: Values may not be more than 1000000 bytes in length; received
2000000 bytes
memcache的keys限制为250 bytes,超过这个长度会报错。
ValueError: Keys may not be more than 250 bytes in length, received 14670 bytes
memcache的时间设置没限制,但服务器会自动清理缓存,官方好像说过最长为1个月时间(3600*24*30)。
2.6.Memcache::add
2.5.1.说明
bool Memcache::add ( string $key , mixed $var [, int $flag [, int $expire ]]
) 添加一个要缓存的数据如果作为这个缓存的数据的键在服务器上还不存在的情况下,
2.5.2.参数
key 缓存数据的键 其长度不能超过250个字符
var 值,整型将直接存储,其他类型将被序列化存储 ,其值最大为1M
flag 是否使用 zlib 压缩
,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压缩。(没有具体的测试数据进行压缩的最小值是多少)
expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 2592000(30
天)
2.5.3.返回值
成功返回 TRUE,失败返回 FALSE,如果这个键已经存在,其他方面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.说明
bool Memcache::replace ( string $key , mixed $var [, int $flag [, int $expire
]] )
替换一个指定 已存在key 的的缓存变量内容
2.6.2.参数
key 缓存数据的键, 其长度不能超过250个字符
var 值,整型将直接存储,其他类型将被序列化存储,其值最大为1M
flag 是否使用 zlib 压缩
,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压缩。(没有具体的测试数据进行压缩的最小值是多少)
expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 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.说明
bool Memcache::set ( string $key , mixed $var [, int $flag [, int $expire ]]
) 设置一个指定 key 的缓存变量内容
2.7.2.参数
key 缓存数据的键, 其长度不能超过250个字符
var 值,整型将直接存储,其他类型将被序列化存储,其值最大为1M
flag 是否使用 zlib 压缩
,当flag=MEMCACHE_COMPRESSED的时侯,数据很小的时候不会采用zlib压缩,只有数据达到一定大小才对数据进行zlib压缩。(没有具体的测试数据进行压缩的最小值是多少)
expire 过期时间,0 为永不过期,可使用 unix 时间戳格式或距离当前时间的秒数,设为秒数时不能大于 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.说明
string Memcache::get ( string $key [, int $flags ] )
array Memcache::get ( array $keys [, array $flags ] )
获取某个 key 的变量缓存值
2.8.2.参数
key 缓存值的键
flags 如果是传址某个变量,获取缓存值被set或是add的flag结果将被存于该变量
2.8.3.返回值
返回缓存的指定 key 的变量内容或者是在失败或该变量的值不存在时返回 FALSE
如果传出的key的数组中的key都不存在,返回的结果是一个空数组,反之则返回key与缓存值相关联的关联数组
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‘, ‘another_key‘));
//如果some_key,another_key不存在 $var =
array();
//如果some_key,another_key存在
$var = array(‘some_key‘=‘缓存值‘,
‘another_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.说明
bool Memcache::delete ( string $key [, int $timeout ] )
删除某一个变量的缓存
2.9.2.参数
key 缓存的键 键值不能为null和‘’,当它等于前面两个值的时候php会有警告错误。
timeout 删除这项的时间,如果它等于0,这项将被立刻删除反之如果它等于30秒,那么这项被删除在30秒内
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);
?>