设为首页 收藏本站
查看: 1402|回复: 0

[经验分享] MemCached配置与缓存知识概述

[复制链接]

尚未签到

发表于 2015-8-31 13:21:21 | 显示全部楼层 |阅读模式
  先看看百度百科里面对缓存的介绍:

  缓存(Cache memory)是硬盘控制器上的一块内存芯片,具有极快的存取速度,它是硬盘内部存储和外界接口之间的缓冲器。由于硬盘的内部数据传输速度和外界介面传输速度不同,缓存在其中起到一个缓冲的作用。缓存的大小与速度是直接关系到硬盘的传输速度的重要因素,能够大幅度地提高硬盘整体性能。当硬盘存取零碎数据时需要不断地在硬盘与内存之间交换数据,有大缓存,则可以将那些零碎数据暂存在缓存中,减小系统的负荷,也提高了数据的传输速度。

  这个是介绍了电脑的硬盘缓存..当然,电脑里面包括很多种缓存,不是本文重点.我们主要关注这段话的几个关键点:速度,性能,减小系统的负荷,这就是缓存的优点.
  ASP.NET缓存概述:

  通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。 例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。 同样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。
  在这些情况下,为了帮助您提高应用程序的性能,ASP.NET 使用两种基本的缓存机制来提供缓存功能。 第一种机制是应用程序缓存,它允许您缓存所生成的数据,如 DataSet 对象或自定义报表业务对象。 第二种机制是页输出缓存,它保存页处理输出,并在用户再次请求该页时,重用所保存的输出,而不是再次处理该页。(摘自MSDN)

  缓存适用范围:

  1.频繁访问的数据
  原因:提高性能.应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。
  2.需要大量处理时间来创建的数据
  原因:提高性能.如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。

  ASP.NET缓存应用:

  ASP.NET中通过Cache来管理应用程序缓存,也提供了对页面的缓存.
  1,页面输出缓存:缓存整个页面,用户请求时不通过页面处理的生命周期,直接从内存中读取.主要用于一些不经常修改的页面,或者需要大量处理编译的页面有用.
  2,页面部分输出缓存:缓存部分页面,也就是缓存用户控件(.ascx).
  3,应用程序缓存:提供一种编程的方式来实现缓存,通过键值对的形式将任意数据存放到内存中,应用程序缓存是易丢失的,使用应用程序缓存的模式是,确定在访问某一项时该项是否存在于缓存中,如果存在,则使用。如果该项不存在,则可以重新创建该项,然后将其放回缓存中。这一模式可确保缓存中始终有最新的数据。
  4,缓存依赖:Net 2.0引入的自定义缓存依赖项,特别是基于MS-SQL Server的SqlCacheDependency特性,使得我们可以避免“数据过期”的问题,它能够根据数据库中相应数据的变化,通知缓存,并移除那些过期的数据,可以参考我的一篇博文配置缓存依赖ASP.NET 下SQLServer2005 缓存依赖

  缓存有它的优势和劣势,在使用时候应该视情况而用,在项目前期应预留缓存接口,在项目后期应该做性能优化加上缓存.


  下面进入本文主题Memcached
  对于一个新的应用我们开发者主要关心,它是什么,它能做什么,它有什么优势和劣势.怎么用..
  Memcached是什么

  Memcached是高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。

  Memcached能做什么

  通过在内存里维护一个统一的巨大的hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。

  Memcached的优势和劣势

  Memcache非常快,Memcached使用了libevent(如果可以的话,在linux下使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数(因此,针对多样的客户端,对象可以处在多样的状态), 使用自己的页块分配器和哈希表, 因此虚拟内存不会产生碎片并且虚拟内存分配的时间复杂度可以保证为O(1).。
  Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问, 因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。当然Memcached也可以用在本地,但是相对于asp.net Cache那太不划算了.
  现在比较常用的Mysql数据库,mysql默认开启了查询缓存,当数据表更新时,查询缓存会被更新,如果频繁的发生这种更新会导致查询缓存效率非常低下.如果mysql数据库量不大,可以使用mysql查询缓存,否则Memcached更合适.
  还有一种共享内存方式,多个进程或者线程共享同一个缓存.虽然效率提高了不少,但是毕竟只能局限在一台机子上.
  因为Memcached也是内存管理,所以也易丢失,理论Memcached可以达到并发的最大连接数是是200,这个数值应该可以调整,也取决于机器的配置.因为Memcached是分布式的,所以它的最大瓶颈在于网络连接.

  Memcached怎么使用
  1,windows下安装Memcached

  Memcached当前版本是1.2.6 下载地址
  服务的启动:
  1, 将memcached-1.2.1-win32.zip解决到指定的地方,如e:\memcached
  2 命令行输入 'e:\memcached\memcached.exe -d install'
3 命令行输入 'E:\memcached\memcached.exe -d start' ,该命令启动 Memcached,默认监听端口为 11211

  2,Ubuntu 下安装Memcached

  启动终端,在终端下输入
  sudo apt-get install memcached
  现在安装成功后启动服务,
  memcached -d -u root
  具体的命令请参考下面的说明


  常用设置:
-p <num>          监听的端口
-l <ip_addr>      连接的IP地址, 默认是本机
-d start          启动memcached服务
-d restart        重起memcached服务
-d stop|shutdown  关闭正在运行的memcached服务
-d install        安装memcached服务
-d uninstall      卸载memcached服务
-u <username>     以<username>的身份运行 (仅在以root运行的时候有效)
-m <num>          最大内存使用,单位MB。默认64MB
-M                内存耗尽时返回错误,而不是删除项
-c <num>          最大同时连接数,默认是1024
-f <factor>       块大小增长因子,默认是1.25
-n <bytes>        最小分配空间,key+value+flags默认是48
-h                显示帮助

  .NET客户端工具有好多种,我用的是http://sourceforge.net/projects/memcacheddotnet/
  运行以下代码测试一下.




static void Main(string[] args)
       {
           string[] serverlist = { "192.168.0.129:11211" };
           //初始化池
           SockIOPool sock = SockIOPool.GetInstance();
           sock.SetServers(serverlist);
           sock.InitConnections = 3;
           sock.MinConnections = 3;
           sock.MaxConnections = 5;
           sock.SocketConnectTimeout = 1000;
           sock.SocketTimeout = 3000;
           sock.MaintenanceSleep = 30;
           sock.Failover = true;
           sock.Nagle = false;
           sock.Initialize();
           //获取客户端实例
           MemcachedClient memcached = new MemcachedClient();
           memcached.EnableCompression = false;
           Console.WriteLine("-------Memcached测试-------");
           memcached.Set("key1", "Value1");
           if (memcached.KeyExists("key1"))
           {
               Console.WriteLine("存在key1..");
               Console.WriteLine(memcached.Get("key1").ToString());
           }
           else
           {
               Console.WriteLine("不存在key1键");
           }
           Console.Read();
           SockIOPool.GetInstance().Shutdown();  //关闭池, 关闭sockets
}

  我在虚拟机里面装的Ubuntu,IP是192.168.0.192.运行成功以后代码之后说明Memcached配置成功.
  后续再详细介绍.net下操作Memcached…

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106837-1-1.html 上篇帖子: [原]Memcached源码剖析系列之内存存储机制(一) 下篇帖子: 在Java中使用Memcached(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表