热门标签 | 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作为分布式缓存的重要作用。

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



推荐阅读
  • 缓存 分布式锁 Redis
    分布式锁现在Redis基本上没家公司都在使用,只是各自使用的场景不以,但Redis最出名的还是做为缓存服务器,提搞服务器的的吞吐量,下面我们来围绕这个作为缓存做一个总结今天的目标其 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
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社区 版权所有