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