ol0 2020-05-02
高并发访问数据库的痛点:死锁
磁盘IO之痛
多客户端共享缓存
Net+Memory>>IO
读写性能完美 1s:读取可以1w次
简单集群搭建Cluster
开源
没有提供主从赋值功能,也没有提供容灾等功能,所以所有的代码都只是考虑性能最佳(Redis)
学习成本非常低,入门非常容易
丰富的成功案例
Socket 服务器端
数据:键值对存储
内存处理的算法
集群搭建原理
客户端实现集群的原理

1、下载安装Memcached服务端
下载完成后解压到桌面,如下截图

两种安装方式,a:双击memcached.exe安装。b:安装到Windows服务中。这里,我们推荐使用第二种安装方式。

确认下服务是否安装并启动

telnet链接到Memcached服务,并查看其stats统计项

2、测试Mamcached的读写操作(set和get方法)
创建一个控制台应用程序,添加应用,并编写如下代码

/// <summary>
/// 测试MemCahed
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" };
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
// 获得客户端实例
MemcachedClient mc = new MemcachedClient();
mc.EnableCompression = false;
Console.WriteLine("------------测 试-----------");
mc.Set("test", "my value"); //存储数据到缓存服务器,这里将字符串"my value"缓存,key 是"test"
if (mc.KeyExists("test")) //测试缓存存在key为test的项目
{
Console.WriteLine("test is Exists");
Console.WriteLine(mc.Get("test").ToString()); //在缓存中获取key为test的项目
}
else
{
Console.WriteLine("test not Exists");
}
Console.ReadLine();
mc.Delete("test"); //移除缓存中key为test的项目
if (mc.KeyExists("test"))
{
Console.WriteLine("test is Exists");
Console.WriteLine(mc.Get("test").ToString());
}
else
{
Console.WriteLine("test not Exists");
}
Console.ReadLine();
SockIOPool.GetInstance().Shutdown(); //关闭池, 关闭sockets
}启动调试,显示结果如下。

3、封装MemcachedHelper类
public class MemcachedHelper
{
private static readonly MemcachedClient mc = null;
/// <summary>
/// 构造函数,默认连接127.0.0.1:11211
/// </summary>
static MemcacheHelper()
{
//最好放在配置文件中
string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" };
//初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30;
pool.Failover = true;
pool.Nagle = false;
pool.Initialize();
// 获得客户端实例
mc = new MemcachedClient();
mc.EnableCompression = false;
}
/// <summary>
/// 存储数据
/// </summary>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <returns></returns>
public static bool Set(string key, object value)
{
return mc.Set(key, value);
}
/// <summary>
/// 存储数据并指定过期时间
/// </summary>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="time">过期时间,注意默认最大30天</param>
/// <returns></returns>
public static bool Set(string key, object value, DateTime time)
{
return mc.Set(key, value, time);
}
/// <summary>
/// 根据键获取数据
/// </summary>
/// <param name="key">键</param>
/// <returns></returns>
public static object Get(string key)
{
return mc.Get(key);
}
/// <summary>
/// 根据键删除数据
/// </summary>
/// <param name="key">键</param>
/// <returns></returns>
public static bool Delete(string key)
{
if (mc.KeyExists(key))
{
return mc.Delete(key);
}
return false;
}
}至此已全部完成。
作者:Jeremy.Wu
出处:https://www.cnblogs.com/jeremywucnblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。