1. Memcached在.NET中的客户端
对于Memcached的在.NET中的客户端有很多,比较常用的有:
a) EmyimMemcached
可在nuget上下载获取
b) NETmemcached client library
下载地址:https://sourceforge.net/projects/memcacheddotnet/
在本文中主要以.NET memcachedclient libarary为示例,学习下memcached在客户端的一些基本操作。
2. Memcached 在.net中的基本操作
下载memcached clinet library 后会得到四个dll,在项目中添加这几个dll的引用。废话不多说,直接上代码吧(注意代码中的注释):
using Memcached.ClientLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace MemcachedDemo
{
[Serializable]
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main(string[] args)
{
/*Memcached服务器列表,这里服务器可配置多台,实现"分布式缓存"
这里的192.168.1.107是我开的虚拟机的ip地址,Memcached服务安装在此虚拟机中
11211是memcached默认的端口
*/
string[] serverHostes = new string[] { "192.168.1.107:11211" };
//初始化sockio池
string poolName = "Pool1";
//SockIOPool是一个基于Socket的连接池,Memcached其实就是一个Socket的服务器端,它不停地接收Memcached客户端发来的读写请求命令。
SockIOPool pool = SockIOPool.GetInstance(poolName);
//添加服务器列表
pool.SetServers(serverHostes);
//设置连接池初始数
pool.InitConnections = 3;
//设置连接池最小连接数
pool.MinConnections = 3;
//设置连接池最大连接数
pool.MaxConnections = 6;
//设置连接的socket超时时间(毫秒)
pool.SocketConnectTimeout = 1000;
//设置socket超时时间(毫秒)
pool.SocketTimeout = 3000;
//设置维护线程运行时的睡眠时间
pool.MaintenanceSleep = 30;
//设置sockIO池的故障标志
pool.Failover = true;
//是否启用nagle算法
pool.Nagle = false;
//初始化sockIO池
pool.Initialize();
//创建memcached客户端实例
MemcachedClient client = new MemcachedClient();
//指定客户端访问的SockIO池,此处必须要指定之前已经初始化的SockIO池,以PoolName对应
client.PoolName = poolName;
//是否启用数据压缩(当值超过一定范围长度时,数据将会以压缩后的形式存诸)
client.EnableCompression = false;
//memcached客户端的基本操作(set/add/replace/get/delete)
//set,运行完后可通过telent方式查看memcached的状态,curr_items会+1
client.Set("stringkey1", "张三");
string value1 = client.Get("stringkey1") + "";//张三
//set修改,如key之前存在于缓存中,则将该键对应的值修改,如不存在则新增key-value值,此处对stringkey1进行修改
//stats命令查看,curr_item并没有增加
client.Set("stringkey1", "李四");
string value2 = client.Get("stringkey1") + "";//李四
//add
//如果key之前存在于缓存中,则add操作不会新增key也不会修改key对应的value,如果不存则新增key-value
client.Add("stringkey1", "王五");
string value3 = client.Get("stringkey1") + "";//李四
client.Add("stringkey2", "赵六");
string value4 = client.Get("stringkey2") + "";//赵六
//replace
//如果key之前存在于缓存中,则replace操作会修改该key对应的value,如不存则不做任务操作
client.Replace("stringkey2", "陈七");
string value5 = client.Get("stringkey2") + "";//陈七
//delete
client.Delete("stringkey2");//删除key以及对应的value
bool isExist = client.KeyExists("stringkey2");//false
//设置超时
//如缓存对象,该对象必须要标心为可序列化
Person person = new Person { Name = "张三", Age = 23 };
//设置过期时间为3秒
client.Add("objectKey1", person, DateTime.Now.AddMilliseconds(3000));
Person rtnPerson = client.Get("objectKey1") as Person;
//主线程休眠3秒
Thread.Sleep(3000);
bool isExistPerson = client.KeyExists("objectKey1");//false,3秒后该缓存会被清除
//刷新
client.FlushAll();
bool isExistKey = client.KeyExists("stringkey1");//false,全部的key-value被清理
}
}
}
注意:
在Memcached中,数据是以Key/Value对的形式进行存储,Key的长度是有限制的,Memcached服务端内部限制Key为250字符,Value的限制大小为1MB,如果value超过了1MB,可以使用压缩了,使用压缩后如果小于1Mb还是可以存储到该Key中。但如果即使压缩后还是超过1Mb,那可能会拆分到多个Key中去了
3. Memcached分布式缓存
Memcached四个主要特征中,有一项 “通信分布式”,但这种分布式功能并不是实现在服务端,而是取决于客户端的实现,大家注意没,对于SockIOPool,可以添加一个服务器列表,而这些服务器列表即为Memcached的服务器集群。
a) 服务器集群环境准备
在本机上新开了两虚拟机:Memcached1(192.168.1.106)和Memcached2(192.168.1.107)。
两台虚拟机都须安装memcached服务端。
主机必须能够ping通两台虚拟机(主机与虚拟机防火墙关闭;虚拟机的网络适配式为桥接模式)
通过telnet和stats命令查看106和107 memcacahed服务的状态
b) 修改第二章节示例代码(新增服务器列表),如下:
//memcached服务器列表,集群(两台虚拟机)
string[] serverHostes = new string[] { "192.168.1.106:11211", "192.168.1.107:11211" };
string poolName = "Pool1";
SockIOPool pool = SockIOPool.GetInstance(poolName);
//添加服务器列表
pool.SetServers(serverHostes);
//socketio池设置
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 6;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
//池初始
pool.Initialize();
MemcachedClient client = new MemcachedClient();
client.PoolName = poolName;
client.EnableCompression = false;
//刷新memcached缓存
client.FlushAll();
//以下键值将存放在106或者107服务器上,具体哪个键值存放在哪个服务器上由客户端的算法决定的
for (int i = 0; i < 100; i++)
{
client.Set("stringkey" + i, "value" + i);
client.Set("stringkey" + i, "value" + i);
client.Set("stringkey" + i, "value" + i);
}
通过telnet 106和107两个虚拟机,通过get方式查看这些值分别存放在哪个memcached服务器上。
4. Memcached数据访问模型
直接引用网上的两组图来说明这个模型
a) 添加新的键值对数据
b) 获取已存在的键值对数据
参考:
Edison Chou , Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作(http://www.cnblogs.com/edisonchou/p/3855969.html)