C# MemcachedHelper 帮助类 控制台程序

本文详细介绍了如何在C#项目中配置和使用Memcached客户端,包括app.config文件设置、连接参数调整及常见错误处理。提供了丰富的代码示例,如单例模式的客户端实例创建、数据存取方法实现,以及不同类型数据的存取测试。

 

参考资料链接:

https://www.bbsmax.com/A/pRdBaBbD5n/

https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Usage

https://github.com/enyim/EnyimMemcached/wiki/MemcachedClient-Configuration

Memcached 可视化界面 TreeSoft   TreeNMS 。由于他是使用java语言写的,所以当我们存入C#的值进去,会被序列化成对象,无法查看他的值。

1、Redis和Memcached的配置不能同时存在app.config中 否者会报错,找不到 RedisConfig

2、App.config

<?xml version="1.0"?>
<configuration>

  <!--   Memcached  start -->
  <configSections>
    <sectionGroup name="enyim.com">
      <section name="memcached" type="Enyim.Caching.Configuration.MemcachedClientSection,Enyim.Caching"/>
      <section name="RedisConfig" type="TY_RealTimeDBInterface.RedisConfigInfo, TY_RealTimeDBInterface"/>
    </sectionGroup>
  </configSections>
  <enyim.com>
    <memcached protocol="Text">
      <servers>
        <add address="127.0.0.2" port="11211"/>
      </servers>
      <!--  minPoolSize:打开到每个Memcached服务器的最小连接数。默认值为10  -->
      <!--maxPoolSize:可以打开到每个Memcached服务器的最大连接数。默认值为20。-->
      <!--connectionTimeout:客户端等待建立与内存缓存服务器的连接的时间。如果超时,则当前操作将失败,并且该节点将被标记为无响应。默认值为00:00:10。
          deadTimeout:客户端等待检查无响应节点状态的时间。默认值为00:00:10。
          queueTimeout:当池到达时,客户端等待获取套接字的时间maxPoolSize。如果超时,则当前操作将失败,并且该节点将被标记为无响应。默认值为00:00:00.100(100毫秒)。2.8+的新功能-->
      <socketPool minPoolSize="10" maxPoolSize="1000" connectionTimeout="00:00:10" deadTimeout="00:02:00"/>
    </memcached>
  </enyim.com>
    <!-- end -->
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
</configuration>

3、 使用Nuget 添加相关的包:EnyimMemcached 

 

MemcachedHelper:

using Enyim.Caching;
using System;
using System.Collections.Generic;
using System.Linq;
using Enyim.Caching.Memcached;
using System.Text;

namespace TestMemcached
{
   
    /// <summary>
    /// MemcachedClient 帮组类 对外提供接口方法
    /// </summary>
    public class MemcachedHelper
    {
        private static MemcachedClient MemClient;
        static readonly object padlock = new object();

        //线程安全的单例模式
        public static MemcachedClient getInstance()
        {
            if (MemClient == null)
            {
                lock (padlock)
                {
                    if (MemClient == null)
                    {
                        try
                        {
                            MemClient = new MemcachedClient();//app.config中存在默认配置部分 ,所以不需要去找IP和Port
                          //  MemClient = new MemcachedClient("enyim.com/memcached");
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
            }
            return MemClient;
        }

        /// <summary>
        /// 删除指定缓存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static bool Remove(string key)
        {
            MemcachedClient mc = getInstance();

            return mc.Remove(key);
        }

        /// <summary>
        /// 清空缓存服务器上的缓存
        /// </summary>
        public static void FlushCache()
        {
            MemcachedClient mc = getInstance();
            mc.FlushAll();
        }
          #region 存取值 
        /// <summary>
        /// 获取缓存值
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object Get(string key)
        {
            if (key == null || key.Trim() == "") return null;
            MemcachedClient mc = getInstance();
           
            return mc.Get(key);
        }

        public static bool Set(string key, object value)
        {
            if (key == null || key.Trim() == "") return false;
            MemcachedClient mc = getInstance();
            var data = mc.Get(key);
            
            if (data == null)
                return mc.Store(StoreMode.Add, key, value);
            else
                return mc.Store(StoreMode.Replace, key, value);
        }
        public static bool Set<T>(string key, T value)
        {
            if (key == null || key.Trim() == "") return false;
            MemcachedClient mc = getInstance();
            var data = mc.Get(key);
            if (data == null)
               //如果返回false 可以查看我的另外一篇文章 专门讲解了这个错误  坑
                return mc.Store(StoreMode.Add, key, value, new TimeSpan(0, 5, 0));
            else
                return mc.Store(StoreMode.Replace, key, value);
        }
        public static bool Set<T>(string key, T value,TimeSpan timeSpan)
        {
            if (key == null || key.Trim() == "") return false;
            MemcachedClient mc = getInstance();
            var data = mc.Get(key);
            if (data == null)
                return mc.Store(StoreMode.Add, key, value, timeSpan);
            else
                return mc.Store(StoreMode.Replace, key, value);
        }

        /// <summary>
        /// 通过key 来得到一个对象(前类型)
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        public static T Get<T>(string key)
        {
           
            MemcachedClient mc = getInstance();
            return mc.Get<T>(key);
        }
        #endregion

    }
}

3、在 Programma中获取值。我测试了多种数据类型的存取。供参考

namespace TestMemcached
{
    class Program
    {
        static void Main(string[] args)
        {
            // 程序调用 groupName用来区分不同的服务或应用场景
            // MemcachedHelper.SetValue( "1","sun", "ting", DateTime.Now.AddMinutes(5));
            //var restr = MemcachedHelper.GetValue("1", "sun");
            // var obj = MemcachedHelper.GetValue<Product>(groupName, "p001");


            // MemcachedHelper.Set( "1","sun");
            var restr = MemcachedHelper.Get("1");

            // User u = new User();
            // u.name = "sun";
            // u.sex = "gril";
            //string str =  Newtonsoft.Json.JsonConvert.SerializeObject(u);
            // bool isok=   MemcachedHelper.Set("user",str);
            // string restr = MemcachedHelper.Get("user").ToString();
            // User user =Newtonsoft.Json.JsonConvert.DeserializeObject<User>(restr);
            // Console.WriteLine(user);

            List<string> list = new List<string>();
            list.Add("as1");
            list.Add("as2");
            list.Add("as3");
            //List<int> list = new List<int>();
            //list.Add(1);
            //list.Add(1);
            //list.Add(1);
            //list.Add(1);


            //bool isok = MemcachedHelper.Set<List<string>>("list", list);
            //List<string> list2 = MemcachedHelper.Get<List<string>>("list");
            //Console.WriteLine(list2);


            //var s = MemcachedHelper.Get("list");
            //List<string> list2 = new List<string>(s.ToString().Split(','));
            //Console.WriteLine(list2);

            //User u = new User();
            //u.name = "sun";
            //u.sex = "gril";
            //bool isok = MemcachedHelper.Set<User>("user",u);
            //User us=  MemcachedHelper.Get<User>("user");
            //Console.WriteLine(us);
            //float[] a = new float[] { 2,1,4};
            //bool isok2=  MemcachedHelper.Set<float[]>("a",a);
            //var aa=     MemcachedHelper.Get<float[]>("a");
            //Console.WriteLine(aa);

            User u = new User();
            u.name = "sun";
            u.sex = "gril";
            List<User> users = new List<User>();
            users.Add(u);
            users.Add(u);

            //bool isok3 = MemcachedHelper.Set<List<User>>("users", users);
            //List<User> list3 = MemcachedHelper.Get<List<User>>("users");
            //Console.WriteLine(list3);
            bool isok3 = MemcachedHelper.Set("users", users);
            List<User> list3 = MemcachedHelper.Get<List<User>>("users");

            bool isok4 = MemcachedHelper.Set("qw", 1234434);
            bool isok5=  MemcachedHelper.Set("as4", "sun4");
            Console.WriteLine(list3);
        }


    }
    [Serializable]
    class User
    {
        public string name;
        public string sex;

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值