热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

Key/Value之王Memcached初探:一、掀起Memcached的盖头来

在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的HttpRuntime.Cache虽然已经可以实现对页面局部进行缓存,但还是不够灵活,此时Memcached或许是你想要的。

一、Memcached是何方神圣?

Memcached

  在数据驱动的Web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载。缓存是解决这个问题的好办法。但是ASP.NET中的HttpRuntime.Cache虽然已经可以实现对页面局部进行缓存,但还是不够灵活,此时Memcached或许是你想要的。

  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。经过多年的发展,目前已经有很多知名的互联网应用使用到了Memcached,比如:Wikipedia、Flickr、Youtube、Wordpress等等。

二、为什么要使用Memcached?

memcached   

  上图展示了Memcached的一般性用途:分布式缓存。当浏览器首次请求访问数据时,应用服务器会先从数据库服务器中取得返回给用户,并将其以Key/Value键值对的形式存入Memcached服务器中。当用户第二次访问上次请求的数据时,应用服务器通过在Memcached服务器中查找是否有缓存,如果有则直接从Memcached中读取。由于Memcached服务器是部署在网站机房内网中的,而且数据时存储在服务器的内存空间中的,所以访问速度比数据库的磁盘IO要快一些,也就提高了服务响应速度,并且在高峰时间减轻了数据库服务器的负载压力。

  (1)Memcached作为高速运行的分布式缓存服务器,具有以下的特点:

  • 协议简单:使用简单的基于文本行的协议,没有使用复杂的XML协议。因此,通过telnet也能在memcached上保存数据、取得数据;
  • 基于libevent的事件处理:memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能;
libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。

libeventhttp://www.monkey.org/~provos/libevent/

  • 内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中;

由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题

NoSQL中比较优秀的一款产品:Redis,比较好地解决了数据持久化的这个问题,重启Redis不会导致数据丢失。

  • 不互相通信的分布式:尽管是“分布式”缓存服务器,但服务器端并没有分布式功能,这完全取决于客户端的实现。我们会很惊奇的发现memcached的集群非常easy,简单得甚至只需要在客户端的配置文件中添加服务器IP与端口号;换句话说,我们的应用程序只需要将数据请求给memcached客户端,在memcached客户端中会通过一个分布式算法(一致性Hash算法)从memcached服务器列表中计算一个memcached服务器的地址(如果是读请求,则根据Key在分布式算法中得到缓存有该Key的memcached服务器信息),然后客户端将数据(Key/Value对)传递给计算出来的memcached服务器(如果是读请求,则从计算出来的memcached服务器中读取含有指定Key的数据);

memcachedcluster  

PS:正因为memcached缓存服务器之间互不通信,因而集群规模可以轻易地扩容,具有良好的伸缩性

  (2)Memcached与Redis的对比

  ①没有必要过多的关心性能,因为二者的性能都已经足够高了。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。(比如瓶颈可能会在网卡)

  ②如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。

  ③如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。

  因此,我们可以得出一个结论:在简单的Key/Value应用场景(例如缓存),Memcached拥有更高的读写性能;而在数据持久化和数据同步场景,Redis拥有更加强大的功能和更为丰富的数据类型;

三、Memcached的安装与简单操作

  Memcached的安装比较简单,而且支持多平台,包括:最经典的Linux、FreeBSD、Solaris (memcached 1.2.5以上版本)、Mac OS X以及我们最熟悉的Windows。这里我们使用我们日常最熟悉的Windows平台来安装Memcached服务,并进行简单的配置和操作。

  (1)下载Memcached For Windows

  URL:http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zip

  其对应的源码地址:http://code.jellycan.com/files/memcached-1.2.6-win32-src.zip

  (2)在虚拟机中安装Windows Server 2003 Enterprise Edition(非必要步凑,也可以在本机进行),取名为:MemcachedServer。另外,还要给虚拟机中的Windows Server设置好IP地址,确保宿主机和虚拟机能够互相ping通。

  (3)将下载的Memcached包拷贝到Windows中的一个指定文件夹中,例如我的Windows Server中的C:/MemcachedServer/

  (4)①在Windows中安装Memcached服务:memcached.exe -d install(那么,对应卸载命令为:memcached.exe -d uninstall

    ②安装完成后即可在Windows服务列表中查看到Memcached Server的服务,一般来说我们要将其设为开机启动项:在属性中设置启动类型为自动即可

    ③安装好服务之后,就可以启动Memcached服务了,这里有两种方式来启动:一是直接在Windows服务列表里选中Memcached服务点击启动;二是在命令行中输入:memcached -d start(对应的停止服务命令为:memcached -d stop

  (5)检测Memcached服务是否成功启动:

  ①使用telnet命令连接到登录台:telnet 服务器IP地址 11211(11211是默认的Memcached服务端口号),我这里输入:telnet 192.168.80.10 11211(192.168.80.10是我的Windows Server虚拟机的IP地址)

  ②打印当前Memcache服务器状态:stats

  可以看到,通过stats命令列出了一系列的Memcached服务状态信息,那么这些信息又代表什么意思呢?我们可以通过下图来知道:

  (6)初步学习Memcached的数据读写命令操作:

    ①添加或更改命令:set KeyName 额外信息 存活时间 存储字节数 [回车] 具体存储的数据块

 

    这里额外信息为0,代表无;存活时间为0,代表永久;而具体的数据块也就是我们所说的Key/Value中的Value;  

PS:这里也可以使用add KeyName 额外信息 存活时间 存储字节数 [回车] 具体存储的数据块。不过set显然更为强大,它会判断keyname是否存在,不存在则新增,存在则修改;

    ②读取命令:get KeyName,这里我们刚刚添加了一个key1的数据,所以我们使用:get key1便获取了key1这个key的缓存数据信息;

    ③更新命令:replace KeyName 额外信息 存活时间 存储字节数 [回车] 具体存储的数据块

    ④删除命令:delete KeyName

四、学习小结

  本篇我们初步了解了什么是Memcached,下载并安装了Memcached,并且将其设为Windows自启动服务,通过telnet连接到Memcached登录台使用命令进行数据读写操作。总体来说,Memcached是一个高性能的Key/Value缓存系统,通过构建Memcached集群,能够适应大型网站的分布式缓存服务需要。下一篇,我们将在.Net中连接并操作Memcached,最后以一个综合案例来体现Memcached作为分布式缓存的重要作用。

  最后,如果亲觉得我的文章不错或者对你有用,麻烦帮我点个“推荐”,让我更有动力继续写下去,谢谢!



推荐阅读
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 在分布式系统中,当多个服务器共同提供服务时,如何高效地将请求路由到正确的服务器是一个关键问题。传统的方法如简单哈希取模在服务器数量变化时会导致大量数据迁移。本文探讨了一致性哈希算法如何有效解决这一问题,确保系统的稳定性和高效性。 ... [详细]
  • 成为一名高效的Java架构师不仅需要掌握高级Java编程技巧,还需深入理解JVM的工作原理及其优化方法。此外,对池技术(包括对象池、连接池和线程池)的应用、多线程处理、集合对象的内部机制、以及常用的数据结构和算法的精通也是必不可少的。同时,熟悉Linux操作系统、TCP/IP协议栈、HTTP协议等基础知识,对于构建高效稳定的系统同样重要。 ... [详细]
  • 本文深入探讨了分布式文件系统的核心概念及其在现代数据存储解决方案中的应用,特别是针对大规模数据处理的需求。文章不仅介绍了多种流行的分布式文件系统和NoSQL数据库,还提供了选择合适系统的指导原则。 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • 本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ... [详细]
  • 深入解析Spring Cloud微服务架构与分布式系统实战
    本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 本文详细介绍了使用ZooKeeper构建高可用集群的方法,包括必要的软件环境准备、配置文件调整及集群启动等关键步骤。通常,一个ZooKeeper集群由奇数个节点组成,以确保Leader选举的有效性。 ... [详细]
  • 本文探讨了随着并发需求的增长,MySQL数据库架构如何从简单的单一实例发展到复杂的分布式系统,以及每一步演进背后的原理和技术解决方案。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 本文档汇总了Python编程的基础与高级面试题目,涵盖语言特性、数据结构、算法以及Web开发等多个方面,旨在帮助开发者全面掌握Python核心知识。 ... [详细]
author-avatar
手机用户2502932937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有