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

被折叠的 条评论
为什么被折叠?



