1.Memcached是一套数据缓存系统或软件。

用于在动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升网站系统性能的目的;Memcached在企业应用场景中一般是用来作为数据库的cache服务使用;(但不是专门干这个,还可以干别的,主要是干这个,知道就好)

1)linux有特性,系统内存没有用完,利用这些内存就会缓存起来,所以剩余的内存为881

2)cache读缓存,磁盘数据读到缓存中;buffers写缓存,将数据写到缓存中,等到一定量的时候就写入磁盘中。

3)buffers同步到磁盘中,缓冲区的数据写入磁盘命令:sync,关机前多写几次

Memcached是通过预分配指定的内存空间来存取数据的,因此它比mysql这样数据库直接操作磁盘要快很多,可以提供比直接读取数据库更好的性能;还可作为集群节点session共享(会话保持)。

一般动态服务并发都不是很好,比如:.net 、java等。所以对于集群架构,数据库和存储都是容易出现瓶颈的。对于数据库就可以用memcache;对于存储可以是nginx。

软件 作用 缓存的数据
memcached,redis 后端数据库的缓存   动态的数据,例如:博文、bbs帖子
squid,nginx,varnish 前端web应用的缓存     静态数据缓存,例如图片、附件、js,css,html等

一般前端的CDN就是分布式缓存系统,同时节省网络带宽,

对于无论是memcached后端还是nginx等前端的缓存,如果我们做了修改,就会修改对应的存储或者数据库,但是我们访问的时候还是访问的缓存数据,这里就有一个数据一致性的问题。所以

1)对于后端memcached服务,在更新数据库的同时发送一个指标告知memcached数据过期了

2)一般存储类的图片等是不经常换的,如果有数据更新,都是起另外的别名进行操作即可。

memcached和redis的区别:

memcached是纯内存软件,重启就会丢失;redis是持久化软件,不仅存在内存中,而且也会存储到磁盘中。memcache是整个项目的名称。memcached是服务器端的主程序名。

2.关于memcached的会话缓存机制

例如php来说,将会话机制放到tmp中,是在php.ini进行配置,可以进行IP+端口,就可以改成从tmp到memchache的会话缓存

3.工作流程

内存是预先分配的,比如200M,是进行了初始化,读取是通过API的方式存取内存中缓存的这些数据,Memcached服务内存中缓存的数据就像一张巨大的HASH表,每条数据都是以key-value对的形式存在。

在读取会优先访问memchaced中的数据,没有命中,就会访问数据库,且给memcached一份。

当程序更新、删除数据库中已有的数据时,会同时发送请求通知memcached已经缓存过的同一个ID内容的旧数据失效,从而保证memcache中的数据和数据库中的数据一致。当然在高并发情况下,除了通知失效外,还会把数据推送到memcached中,下一个访问就直接memcached。

4.memcached服务在大型站点中的应用

几乎所有的网站,当访问量大的时候,在整个网站集群架构中最先出现瓶颈的一定是数据库角色的服务器以及存储角色的服务器,在工作中我们是尽量把用户的请求往前推,即越是在靠前用户端把数据返回就越好。

高并发访问的核心原则其实就一句化:“把所有的用户访问请求都尽量往前推”。

当然除了在前端加memcached以外,还要数据库层配置数据读写分离及读数据做负载均衡。对于单台memcache的内存容量是有限的,并且单台也是单点,因此,memcached也有负载均衡和应用场景。

分布式应用1

在应用服务器上通过程序及URL_HASH(固定在某一台服务器上)算法去访问Memcache服务,Memcached服务的地址池可以简单的配在程序的配置文件中

分布式应用2

门户如百度,会通过一个中间件代理负责请求后端的cache服务

分布式应用3

可以用常见的LVS,haproxy做Cache的负载均衡,和普通web应用服务相比,这里的重点是调用算法,Cache一般会选择url_hash及一致性hash算法。而web应用服务就是集群,对于不一样的放在NFS中,可以用轮询算法。如果memcache也用轮询算法,那么会慢的很多(个人理解,就算web应用都是不一样的,这样就现实,没用冗余性了,但是memcached是可以单点坏掉,直接请求数据库或者备用的memcached)

5.企业案例

如图所有,外部有爬虫,不停的自动输入查找内容,匹配的是如:like  '%杜冷门%'的语句,这样的导致服务器负载很高,查询很慢,无法优化。

在linux下使用uptime查看,发现负载很高

登陆数据库查看:show  processlist;show full processlist;

mysql -uroot -p'1111' -e "show full processlist"|grep -vi sleep

优化方案思路:

1)从业务上实现用户登陆后在搜索,这样减少搜索次数,减轻服务器压力

2)如果有大量频繁的搜索,一般是由爬虫在爬你的网站,分析web IP 封掉(部署awstats)

3)  配置主从同步,程序实现读写分离,减少主库压力

4)LIKE ‘'%杜冷门%'’ 这样的语句在mysql很难优化,可以通过搜索服务Sphinx实现搜索

5)在数据库前端加上memcached缓存服务器。

1)2)短期可解决     3)4)后期发展目标

6.Memcached的特性

libevent是一套利用C开发的程序库,支持大并发,memcached就是利用这个库进行异步事件处理。所以在安装的时候,需要先安装libenent,再安装memcached

memcached有一套自己管理内存的方式,这套管理方式非常高效,所有的数据都保存在Memcached内置的内存中,当存入的数据占满内存空间时,Memcached使用LRU算法自动删除不使用的缓存数据,即重用过期数据的内存空间。Memcached是为缓存系统设计的,因此,没有考虑数据的容灾问题,和机器的内存一样,重启机器数据将会丢失,如果希望重启数据依然保留,那么就需要sina网开发的memcachedb持久化内存缓存系统,当然还有redis、MongoDB等。

各个Memcached服务器之间互相不通信,都是独立的存取数据,不共享任何信息,通过客户端的设计,让Memcached具备分布式,能支持海量缓存和大规模应用。

7.Memcached软件工作原理

Memcached是一套C/S模式架构的软件,在服务器端启动服务守护进程,可以为memcached服务器指定监听的IP地址、端口号、并发访问连接数以及分配多少内存来处理客户端的请求的参数。

Memcached软件是由C语言开发的,全部代码仅有2000多行,采用的是异步I/O,其实现方法是基于事件的单进程和单线程的,使用libevent作为事件通知机制,多个服务器端可以协同工作,但这些服务器端之间是没有任何通信联系,每个服务器端只对自己的数据进行管理。应用程序端通过指定缓存服务器的IP地址和端口,就可以连接memcached服务相互通信。

需要被缓存的数据以Key/Value对的形式保存在服务器端预分配的内存区中,每个被缓存的数据都有唯一的标识key,操作Memcached中的数据通过这个唯一标识的key进行。缓存到Memcached中的数据仅放置在Memcached服务预分配的内存中,而非存储在memcached所在的磁盘上,速度很快。

由于Memcached服务自身没有对缓存的数据进行持久性存储的设计,因此,在服务器重启的时候,会丢失,而且如果容量达到设定的值,就会使用LRU算法删除过期的缓存数据。

当初就是为缓存而设计的,所以没有考虑永久性问题;

memcached支持各种客户端shell,php,java,python都可连接memecached.

8.Memcached内存管理机制

Memcached利用Slab Allocation 机制来分配和管理内存。传统的内存管理方式是:使用完通过malloc分配的内存后通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。Slab Allocation机制不存在这样的问题,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。

Memcached服务端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块,这种方式有时会造成内存浪费,避免浪费的方式:

1)把同一个业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀

2)指定 -f 参数  能再某种程度上控制这个差异,一般不设置,就用默认的1.25

9.Memcached的删除机制

Memcached不会释放已分配的内存空间(除非添加数据设定过期或内存缓存满了),再数据过期后,客户端不能通过key取出它的值,其存储空间被重新利用。

Memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/value对是否过期,而是再获取key值时查看记录的时间戳,检查key/value对空间是否过期,这种策略不会再过期检测上不浪费CPU资源。

Memcached在分配空间时,优先使用已经过期的key/value对空间,当分配的内存空间占满时,Memcached就会使用LRU算法来分配空间,删除最近最少使用的key/value对,将其空间分配给新的key/value对,在某些情况下,如果不想使用LRU算法,那么可以通过-M参数来启动Memcached,这样Memcached在内存耗尽时,会返回一个报错信息。

二、NOSQL之Memcached缓存服务实战精讲第一部的更多相关文章

  1. 三、NOSQL之Memcached缓存服务实战精讲第二部

    1.Memcached服务安装 Memcached的安装比较简单,很多平台都是支持Memcached,常见的有:Linux .Windows 服务端端:                cd /home ...

  2. openstack (3)---------部署memcached缓存服务,keystone服务

    一.memcached概念 Memcached 是一个开源的.高性能的分布式内存对象缓存系统.通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高网站访问速度,加速动态WEB应用.减轻数据库负载 ...

  3. Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲

    Java生鲜电商平台-SpringCloud微服务开发中的数据架构设计实战精讲 Java生鲜电商平台:   微服务是当前非常流行的技术框架,通过服务的小型化.原子化以及分布式架构的弹性伸缩和高可用性, ...

  4. [网站日志]当Memcached缓存服务挂掉时性能监视器中的表现

    我们用的Memcached缓存服务是阿里云OCS,今天晚上遇到了一次OCS挂掉的情况(计划中的升级),看一下性能监视器中的表现,也许对分析黑色1秒问题有帮助. 应用日志中错误: 2014-06-05 ...

  5. Keepalived原理与实战精讲--VRRP协议

    . 前言 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...

  6. (转)不看绝对后悔的Linux三剑客之sed实战精讲

    不看绝对后悔的Linux三剑客之sed实战精讲 原文:http://blog.51cto.com/hujiangtao/1923718 二.Linux三剑客之sed命令精讲 1,前言 我们都知道,在L ...

  7. (转)不看绝对后悔的Linux三剑客之grep实战精讲

    不看绝对后悔的Linux三剑客之grep实战精讲 原文:http://blog.51cto.com/hujiangtao/1923675 https://www.cnblogs.com/peida/a ...

  8. [转载]Memcached缓存服务的简单安装

    1.Linux下的安装方法 下载:wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x. ...

  9. (转)不看绝对后悔的Linux三剑客之awk实战精讲

    原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...

随机推荐

  1. python常用代码、问题汇总

    1.生成dataframe数据 5.读取带 ','分隔符的txt文件 4.DataFrame格式数据处理中报错 2.安装库时出现如下错误: 3.得到股票交易日数据 1.生成dataframe数据 im ...

  2. eclipse的重要快捷键

    1.快速修正:ctrl + 1 2.单词补全:alt + / 3.查看轮廓:ctrl + o 4.打开eclipse中工作区的资源: ctrl + shift + r 它可以打开当前eclipse的工 ...

  3. dmesg 显示开机信息。

    功能说明:显示开机信息. 语 法:dmesg [-cn][-s <缓冲区大小>] 补充说明:kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dme ...

  4. 二、在SAP中创建一个程序

    一.我们来到SE38 二.添加一个程序的名字,需要以Y或者Z开头,点击创建就可以了 三.我们输入hello Sap,然后选择可执行程序,然后保存 四.创建对象目录时,可以选择把这个加入到包中,或者选择 ...

  5. UVALive 4043 转化最佳完美匹配

    首先黑点和白点是组成一个二分图这毫无疑问 关键是题目中要求的所有黑白配的线不能交叉...一开始我也没想到这个怎么转化为二分图里面的算法. 后来看书才知道,如果两两交叉,则可以把两根线当四边形的对角线, ...

  6. 使用eclipse创建maven时遇到的问题

    转自https://www.cnblogs.com/hongmoshui/p/7994759.html   1.在eclipse中用maven创建项目,右键new>>Maven Proje ...

  7. RectTransform详解

    乾坤那个大挪移   ----------------------------------------------------------------- 我是分割线 ------------------ ...

  8. 基于Docker本地运行Kubernetes

    基于Docker本地运行Kubernetes 概览 下面的指引将高速你如何通过Docker创建一个单机.单节点的Kubernetes集群. 下图是最终的结果: 先决条件 \1. 你必须拥有一台安装有D ...

  9. 2020/2/1 PHP代码审计之任意文件读取及删除漏洞

    在开始学习之前先简单记录一下自己现在的思路吧..现在接触的基本都是无防护的漏洞也就是最简单的一些漏洞.我的想法就是以代审思路为主,之前一直在打CTF,白盒的思维我觉得和CTF这种黑盒有很大区别.自己的 ...

  10. mysql锁探究和实验

    如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂. 表锁和行锁 mysql最显 ...