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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。