当前位置:坤哥网-kungge- memcached学习笔记之在.net中使用memcached

memcached学习笔记之在.net中使用memcached

2017/11/19 21:31:42 kungge阅读(542) 评论(0)


很多语言都实现了memcached客户端,有Perl、PHP、Python、Java、Ruby、C#、C/C++等。.net也有不少第三方库。


.NET memcached client library


在.net中访问memcached服务器可以引用库:.NET memcached client library,该项目地址:https://sourceforge.net/projects/memcacheddotnet/

4e2ff6c6-0331-4216-a0f7-adcf6e8a41ee.png

点击下载解压:

39362052-a402-4041-87f3-073b84b89987.png

进入到这个文件夹memcacheddotnet_clientlib-1.1.5\memcacheddotnet\trunk\clientlib\src\clientlib\bin\2.0\Release:

c1afd8d6-993f-4274-94f1-406f19734ec7.png

将Memcached.ClientLibrary.dll引入项目中,写一段代码测试下:

// Memcached服务器列表,多台服务器以逗号分隔,如:"192.168.2.133:11211","192.168.2.134:11211"
string[] serverList = { "192.168.2.133:11211" };
// 初始化SocketIO池
string poolName = "MyPool";
SockIOPool sockIOPool = SockIOPool.GetInstance(poolName);
// 添加服务器列表
sockIOPool.SetServers(serverList);
// 设置连接池初始数目
sockIOPool.InitConnections = 3;
// 设置连接池最小连接数目
sockIOPool.MinConnections = 3;
// 设置连接池最大连接数目
sockIOPool.MaxConnections = 5;
// 设置连接的套接字超时时间(单位:毫秒)
sockIOPool.SocketConnectTimeout = 1000;
// 设置套接字超时时间(单位:毫秒)
sockIOPool.SocketTimeout = 3000;
// 设置维护线程运行的睡眠时间:如果设置为0,那么维护线程将不会启动
sockIOPool.MaintenanceSleep = 30;
// 设置SockIO池的故障标志
sockIOPool.Failover = true;
// 是否用nagle算法启动
sockIOPool.Nagle = false;
// 正式初始化容器
sockIOPool.Initialize();

MemcachedClient memcachedClient = new MemcachedClient();
// 指定客户端访问的SockIO池
memcachedClient.PoolName = poolName;
// 是否启用压缩数据:如果启用了压缩,数据压缩长于门槛的数据将被储存在压缩的形式
memcachedClient.EnableCompression = false;

#region set测试
Console.WriteLine("**************set测试开始**************\r\n");

//set命令将value(值)存储在指定的key(键)中,若key不存在则是新增,存在则更新值。
memcachedClient.Set("testkey1","kungge");
Console.WriteLine($"tesetkey1={memcachedClient.Get("testkey1")}");

memcachedClient.Set("testkey1", "kungge666");
Console.WriteLine($"tesetkey1={memcachedClient.Get("testkey1")}");

memcachedClient.Set("testkey11", "kungge888",DateTime.Now.AddSeconds(3));//设置过期
Console.WriteLine($"testkey11={memcachedClient.Get("testkey11")}");
Thread.Sleep(4000);
Console.WriteLine($"testkey11={memcachedClient.Get("testkey11")}");

Console.WriteLine("\r\n**************set测试结束**************\r\n");
#endregion

#region add测试
Console.WriteLine("**************add测试开始**************\r\n");

//add命令将value(值)存储在指定的key(键)中,若key已经存在,不会更新数据,原来的value保持不变
memcachedClient.Add("testkey1", "kungge555");
Console.WriteLine($"tesetkey1={memcachedClient.Get("testkey1")}");
memcachedClient.Add("testkey2", "kungge111");
Console.WriteLine($"testkey2={memcachedClient.Get("testkey2")}");

Console.WriteLine("\r\n**************add测试结束**************\r\n");
#endregion

#region replace测试
Console.WriteLine("**************replace测试开始**************\r\n");

//replace命令替换已存在key(键)的value(值),若key不存在则替换失败
memcachedClient.Replace("testkey1", "kungge222");
Console.WriteLine($"tesetkey1={memcachedClient.Get("testkey1")}");
memcachedClient.Add("testkey3", "kungge333");
Console.WriteLine($"testkey3={memcachedClient.Get("testkey3")}");

Console.WriteLine("\r\n**************replace测试结束**************\r\n");
#endregion

#region delete测试
Console.WriteLine("**************delete测试开始**************\r\n");

//delete命令删除已存在额key(键),删除成功输出DELETED,删除失败或语法错误
Console.WriteLine($"tesetkey1={memcachedClient.Get("testkey1")}");
memcachedClient.Delete("testkey3");
Console.WriteLine($"testkey3={memcachedClient.Get("testkey3")}");

Console.WriteLine("\r\n**************delete测试结束**************\r\n");
#endregion

// 关闭SockIO池
sockIOPool.Shutdown();

输出:

f614fd9b-1139-4f5a-b29f-814f74684b52.png


ServiceStack.Caching.Memcached


这个组件让使用.net操作memcached更方便,而且一直在更新,在项目中推荐使用。

通过Nuget包管理器下载安装:

6959375b-3d4f-4813-ae3d-30cc5ca9b4af.png

或者通过命令形式安装:

Install-Package ServiceStack.Caching.Memcached -Version 4.5.14

使用类似于memcacheddotnet_clientlib,但是Add、Set、Replace、Get都支持泛型,下面以Set和Get演示使用:

static void Main(string[] args)
{
  string[] hosts = { "192.168.2.133:11211"};
  MemcachedClientCache memClientCache=new MemcachedClientCache(hosts);

  #region set
  memClientCache.Set("sscmKey1","nice");
  memClientCache.Set("sscmKey2", "good",new TimeSpan(2, 0, 0));

  memClientCache.Set<Order>("sscmKey3",new Order() { Id=1001,Amount=3500});

  var order = memClientCache.Get<Order>("sscmKey3");
  Console.WriteLine($"sscmKey1={ memClientCache.Get("sscmKey1")} sscmKey2={ memClientCache.Get("sscmKey2")} sscmKey3={order.Id}:{order.Amount}");

  #endregion

   Console.ReadKey();
}

在实际项目开发中,一般会将memcached封装成一个类,方便统一调用,如下一种封装方式:

public class MemcachedHelper
{
    private static readonly MemcachedClientCache memClientCache;

    static MemcachedHelper()
    {
        var memcacheHosts =new string[] {  "192.168.2.133:11211", "192.168.2.135:11211" };//具体从配置文件中取
        memClientCache = new MemcachedClientCache(memcacheHosts);
    }

    public static void Set(string key, object value, TimeSpan expirseIn)
    {
        if (value != null)
            memClientCache.Set(key, value, expirseIn);
    }

    public static void Set(string key, object value, DateTime expirseIn)
    {
        if (value != null)
            memClientCache.Set(key, value, expirseIn);
    }

    public static T Get<T>(string key)
    {
        return memClientCache.Get<T>(key);
    }

    public static bool Remove(string key)
    {
        return memClientCache.Remove(key);
    }
}

调用:

static void Main(string[] args)
{
   MemcachedHelper.Set("sscmKey1", "nice");
    MemcachedHelper.Set("sscmKey2", "good", new TimeSpan(2, 0, 0));

    MemcachedHelper.Set<Order>("sscmKey3", new Order() { Id = 1001, Amount = 3500 },new TimeSpan(2,0,0));

    var order = MemcachedHelper.Get<Order>("sscmKey3");
    Console.WriteLine($"sscmKey1={ MemcachedHelper.Get("sscmKey1")} sscmKey2={ MemcachedHelper.Get("sscmKey2")} sscmKey3={order.Id}:{order.Amount}");

    Console.ReadKey();
}


(完)


标签: Memcached学习
分类: NoSQL

发表评论 没有账号,注册评论