[Memcached系列]专题二:Memcached For .NET

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)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值