memcached高性能的分布式的内存对象缓存系统

memcached 是一个高性能的分布式的内存对象缓存系统。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存中维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,如图像,视频,文件以及数据库检索的结果等。简单地说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。默认启用11211端口,64M内存。



根据id查询某条新闻的三种方案:
1.每次都从数据库中查询
2.页面静态化,把每一条新闻生成一个静态的.html文件(虽然速度快了些,但是仍然是从磁盘文件获取,速度还是慢)
3.把数据放入Memcatched缓存中

对于大型网站来说主要考虑 并发性,对于中小型网站,平均日访问量不高的网站页面静态化已经足够。
网站数据读取速度:
数据库直接查询<页面静态化后的文件查询<内存查询,这里的充分是以空间(即内存)换时间


Memcatched的原理图:

安装步骤:
①下载memcached软件,安装memcached Server服务
②将memcached软件拷贝到某个目录
③安装  memcached –d install [卸载使用 memcached -d uninstall]
④启动 memcached 服务 memcached -d start [如果你的网站,需要的memcached 的内存大于64m,应当这样启动memcached –m 256m –d start][如果你希望换一个端口memcached -d -m 30 -l 127.0.0.1 -p 9000 -d start]
  控制面板  管理工具  服务
  (1)直接通过界面启动该服务
  (2)在控制台下启动 memcached –d start   [命令一览表]
⑤查看memcached 服务是否启动成功! 默认端口11211,netstat -anb

c#操作Memcached:
1. 将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll放到bin目录 
2. 引用Memcached.ClientLibrary.dll 
3. 类中引用using Memcached.ClientLibrary; 

    class Program
    {
        [STAThread]
        static void Main(string[] args)
        {
            string[] serverlist = { "192.168.1.7:11211","192.168.1.100:11211" };
            
            //初始化池
            SockIOPool pool = SockIOPool.GetInstance();
            //设置连接池可用的cache服务器列表,server的构成形式是IP:PORT(如:127.0.0.1:11211)
            pool.SetServers(serverlist);

            //初始连接数
            pool.InitConnections = 3;
            //最小连接数
            pool.MinConnections = 3;
            //最大连接数            
            pool.MaxConnections = 5;

            //设置的套接字超时时间
            pool.SocketConnectTimeout = 1000;
            //套接字的读取超时时间
            pool.SocketTimeout = 60;

            //设置维护线程运行的睡眠时间。如果设置为0,那么维护线程将不会启动,30就是每隔30秒醒来一次
            pool.MaintenanceSleep = 30;
            //获取或设置池的故障标志,如果这个标志被设置为true则socket连接失败,Memcached将试图从另一台服务器返回一个套接字(如果存在的话);如果设置为false,则得到一个套接字如果存在的话。否则返回NULL,如果它无法连接到请求的服务器。
            pool.Failover = true;

            //如果为false,对所有创建的套接字关闭Nagle的算法
            pool.Nagle = false;
            pool.Initialize();

            //获得客户端实例
            MemcachedClient mc = new MemcachedClient();
            //是否启用压缩
            mc.EnableCompression = false;
            Console.WriteLine("-------------------------测试-------------------------------------");
            
            //增加操作,如果键值存在则不能加入
            mc.Add("name", "xiaoming",DateTime.Now.AddSeconds(30));//字符串
            mc.Add("age", 23);//数字

            string[] strs = { "a", "b", "c" };            
            mc.Add("arr", strs);//加入数组

            mc.Add("gender", true);//布尔值

            Person person = new Person() { Name = "ac", Age = 33, Email = "pv@qq.com" };
            mc.Add("ren", person);//加入对象

            //修改操作
            mc.Set("name", "xm");

            //查询操作
            Console.WriteLine(mc.Get("name"));
            Console.WriteLine(mc.Get("age"));
            object obj = mc.Get("arr");
            Console.WriteLine(mc.Get("gender"));//返回True

            Person model = mc.Get("ren") as Person;
            Console.WriteLine(model.Name);
            //删除操作
            mc.Delete("name");
            //删除所有
            mc.FlushAll();

            Console.ReadKey();
        }

        private static void CheckKey(MemcachedClient mc)
        {
            if (mc.KeyExists("zengzhiwei"))
            {
                Console.WriteLine("zengzhiwei is Exists");
                Console.WriteLine(mc.Get("zengzhiwei").ToString());
            }
            else
            {
                mc.Add("liudehua", DateTime.Now);
                Console.WriteLine("zengzhiwei not Exists");
            }
        }
    }

    [Serializable]
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Email { get; set; }

        public void SayHello()
        {
            Console.WriteLine("大家好!");
        }
    }


Memcached的机制:
1.是c/s结构,使用简单文本通讯(memcached为服务器端,memcached的服务器客户端通信并不使用XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据)
2.基于libevent处理并发(libevent是一套跨平台的事件处理接口的封装,使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力)
3.是内存缓存(memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。)
4.基于客户端的分布式,各个memcached之间不通讯(memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现。)

Memcached的细节:
1. 生命周期是在add数据的时候指定的。
2.配置
缓存工具类
public static class CacheHelper
    {
        //单例模式保证进程内实例唯一
        private static readonly SockIOPool sockIoPool;
        public static SockIOPool CurrentPool
        {
            get
            {
                return sockIoPool;
            }
        }

        public static MemcachedClient memcacedClient { get; set; }
        static CacheHelper()
        {
            sockIoPool = SockIOPool.GetInstance();
            var appSetList = ConfigurationManager.AppSettings["MemcachedList"];
            var setArr = appSetList.Split(',');

            CurrentPool.SetServers(setArr);
            CurrentPool.Initialize();

            memcacedClient = new MemcachedClient();
            memcacedClient.EnableCompression = false;
        }

        /// <summary>
        /// 往分布式缓存中写内容
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static bool SetCache(string key, object value, DateTime dt)
        {
            if (!memcacedClient.KeyExists(key))
            {
                return memcacedClient.Add(key, value, dt);
            }
            else
            {
                return memcacedClient.Set(key, value, dt);
            }
        }

        /// <summary>
        /// 从分布式缓存中读取内容
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static object GetCache(string key)
        {
            if (!memcacedClient.KeyExists(key))
            {
                return null;
            }
            else
            {
                return memcacedClient.Get(key);
            }
        }

    }


Memcached的安全性:
windows下设置防火墙后,外界不能直接操作Memcached而是通过网站提供的对外接口访问

如何使用memcached?
1.如果是一个小网站,pv值不大,就不考虑使用memcached了
2.变化频繁, 一变化就要入库[比如股票,金融.](不适合memcached)
3.过大的数据不能放入到memcache(优酷网.受带宽的影响限制了访问速度,所以使用memcached没有意义)
4.变化频繁,查询频繁,但是不一定写入数据库(比如用户在线状态、在线人数..适合memcached)
5.变化不频繁,查询频繁,不管入不入库,都比较适合memcached。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值