博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MemCache在.NET中使用Memcached.ClientLibrary详解 转发 https://www.cnblogs.com/li150dan/p/9529112.html...
阅读量:4312 次
发布时间:2019-06-06

本文共 4106 字,大约阅读时间需要 13 分钟。

本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法

首先下载客户端的3个dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll
然后新建一个简单控制台应用程序如下:
public class MemcacheHelper    {        //实例化Client        public MemcachedClient MClient;        public MemcacheHelper(string poolName)        {            string[] MemcacheServiceList = { "127.0.0.1:11211", "192.168.100.103:11211" };            //初始化连接池            SockIOPool pool = SockIOPool.GetInstance(poolName);            //设置服务器列表            pool.SetServers(MemcacheServiceList);            //各服务器之间负载均衡的设置比例            pool.SetWeights(new int[] { 10, 1 });            //初始化时创建连接数            pool.InitConnections = 3;            //最小连接数            pool.MinConnections = 3;            //最大连接数            pool.MaxConnections = 5;            //连接的最大空闲时间,下面设置为6个小时(单位ms),超过这个设置时间,连接会被释放掉            pool.MaxIdle = 1000 * 60 * 60 * 6;            //socket连接的超时时间,下面设置表示不超时(单位ms),即一直保持链接状态            pool.SocketConnectTimeout = 0;            //通讯的超时时间,下面设置为3秒(单位ms),.Net版本没有实现            pool.SocketTimeout = 1000 * 3;            //维护线程的间隔激活时间,下面设置为30秒(单位s),设置为0时表示不启用维护线程            pool.MaintenanceSleep = 30;            //设置SocktIO池的故障标志            pool.Failover = true;            //是否对TCP/IP通讯使用nalgle算法,.net版本没有实现            pool.Nagle = false;            //socket单次任务的最大时间(单位ms),超过这个时间socket会被强行中端掉,当前任务失败。            pool.MaxBusy = 1000 * 10;            // 初始化一些值并与MemcachedServer段建立连接            pool.Initialize();            MClient= new MemcachedClient();            //是否启用压缩数据:如果启用了压缩,数据压缩长于门槛的数据将被储存在压缩的形式            MClient.EnableCompression = false;            //压缩设置,超过指定大小的都压缩             //MClient.CompressionThreshold = 1024 * 1024;               //指定客户端访问的SockIO池            MClient.PoolName = poolName;        }    }    public class Program    {        public static void Main(string[] args)        {                   //参数设置 string SockIOPoolName = "demo";             MemcacheHelper helper = new MemcacheHelper(SockIOPoolName);            //存入key为demoKey,value为Hello World的一个缓存,并设置过期时间            helper.MClient.Add("demoKey", "Hello World", DateTime.Now.AddSeconds(10));                     //读出key为demoKey的缓存值            var demovalue = helper.MClient.Get("demoKey");            //输出            Console.WriteLine("缓存的值:" + demovalue);            Console.ReadKey();                   }    }

一、memcached分布式缓存的设置与应用

string[] MemcacheServiceList = { "127.0.0.1:11211", "192.168.100.103:11211" };   //初始化连接池   SockIOPool pool = SockIOPool.GetInstance(poolName);   //设置服务器列表   pool.SetServers(MemcacheServiceList);   //各服务器之间负载均衡的设置比例   pool.SetWeights(new int[] { 10, 1 });

1、在127.0.0.1,与192.168.100.103两台机器上装memcached服务端。

2、pool.SetWeights这里的10跟1意思是,负载均衡比例,假如11000条数据,大致数据分布为:127.0.0.1分布10000条数据左右。另外一台为10000条左右。

3、memcached服务端并不具备负载均衡的能力,而是memcachedClient实现的,具体存取数据实现的核心是采用一致性Hash算法,把key-value分布到某一台服务器中里边。

二、memcached的数据压缩机制

 
//是否启用压缩数据:如果启用了压缩,数据压缩长于门槛的数据将被储存在压缩的形式  MClient.EnableCompression = false;  //压缩设置,超过指定大小的都压缩   //MClient.CompressionThreshold = 1024 * 1024;
 

1、这个处理是在MemcachedClient对象中,设置这个EnableCompression属性,是否使用压缩的意思,如果启用啦压缩功能 ,则ICSharpCode.SharpZipLib类库会在数据超过预设大小时,进行数据压缩处理。 

2、CompressionThreshold这个属性是压缩的阀值,默认是15K,如果超过设定的阀值则使用memcached的通讯协议,存数据时给每个数据项分配一个16为的flag表示,用作记录是否有压缩,如果有压缩则提取数据是进行解压。如果没有超过阀值则不压缩,直接存储。

三、怎么使用客户端多个SocketIO池 

//初始化池  SockIOPool pool = SockIOPool.GetInstance(poolName);  //指定客户端访问的SockIO池  MClient.PoolName = poolName;

使用SocketIoPool的场景,假如你的系统中用到A,B两台机器memcached的缓存数据,而A,B是不相关的,没有数据互通共享,那么这个时候你就可以根据设置poolName来处理读写那台机器。而不用多处,重复配置客户端的各种参数。

四、memcached的故障转移处理 

//设置SocktIO池的故障标志  pool.Failover = true;

memcached的鼓掌转移是一套正常节点发生故障变为死节点时的处理机制。

1、开启故障转移:如果发生socket异常,则该节点被添加到存放死节点属性的_hostDead中,新请求被映射到dead server,检测尝试连接死节点的时间间隔属性_hostDeadDuration(默认设置为100ms),如果没有达到设定的间隔时间则key会被映射到可用的server处理,如果达到了时间间隔,则尝试重新链接,连接成功将此节点从_hostDead中去除,连接失败则间隔时间翻倍存放,下次重新连接时间会被拉长。 

2、不开启故障转移:新的请求都会被映射到dead server上,尝试重新建立socket链接,如果连接失败,返回null或者操作失败。

五、key-value中的key与value

1、key在服务端的长度限制为250个字符,建议使用较短的key但不要重复。 

2、value的大小限制为1mb,如果大拉,可以使用压缩,如果还大,那可能拆分到多个key中。

转载于:https://www.cnblogs.com/Jeely/p/10785338.html

你可能感兴趣的文章
springboot + shiro学习(配置SecurityManager,Realm)
查看>>
http://desk.zol.com.cn/1600x900/
查看>>
Linux基础之命令练习Day3-文件管理:cat,tar,gzip,vim,ln
查看>>
iOS中使用nil NULL NSNULL的区别
查看>>
Hdu1754-线段树-单点更新
查看>>
在python中使用正则表达式(一)
查看>>
asp.net mvc 4.0的部署
查看>>
WordPress资源站点推荐
查看>>
Python性能鸡汤
查看>>
android Manifest.xml选项
查看>>
Cookie/Session机制具体解释
查看>>
ATMEGA16 IOport相关汇总
查看>>
有意思的cmd命令
查看>>
js正則表達式语法
查看>>
JVM-垃圾回收
查看>>
ubuntu-14.04.1-desktop上安装配置JDK1.8的环境变量
查看>>
VS2013 添加已有文件夹
查看>>
摄影扫盲
查看>>
POJ 2388 - Who's in the Middle
查看>>
python 计时程序运行时间
查看>>