您的位置:首页 > 数据库 > Memcache

Memcached原理介绍

2020-01-12 21:42 246 查看

前言:Memcached是一套数据缓存系统或软件,用于在动态系统中,缓存数据库数据没减少数据库的访问压力,达到提升系统性能的目的。
Memcached在企业应用的场景中一般是用来作为数据库的cache服务使用,memcached是通过预分配内存来获取数据的,因此它比数据库mysql直接操作磁盘快,可以提供直接读取。
Memcached 也经常作为集群架构节点应用服务器之间Session数据共享的存储。

sync:可以将buff里面的缓存写入到磁盘

  • Memcached是什么?。
    Memcached是一个开源的、高性能的,具有分布式内存对象的缓存系统,从名称上看Mem就是内存的意思,而Cache就是缓存的意思。它通过在事先规划好的内存空间中缓存数据库中的数据,以达到减少数据库的高并发访问,从而达到提升数据库的访问性能,加速动态应用服务的能力。

  • Memcached最初由LiveJournal的Brad Fitzpatrick在2003年开发完成。Memcache是整个项目的名称,而Memcached是服务器端的主程序名。Memcached服务一般被用来保存网站中经常被读取对象或数据,就像我们的客户端浏览器也会把经常访问的网页缓存起来一样, 通过内存缓存来存取对象或数据要比磁盘存取快很多,因为磁盘是机械的介质,因此,在当今的IT企业中,memcached 的应用范围很广。|

结构图

Memcached服务在应用中的工作流程.

  • Memcached是一种内存缓存, 在工作中经常用来缓存数据库中的数据,数据被缓存在事先预分配的memcached管理的内存中,可以通过API的方式存取内存中缓存的这些数据,Memcached服务内存中缓存的数据就像一张巨大的 HASH表,每条数据都是以key-value对的形式存在。

  • Memcached通过缓存经常被读取的数据库中的数据,当程序需要访问后端数据库获取数据时会优先访问Memcached内存缓存,如果缓存中有数据就直接返回前端服务应用,如果没有数据(没有命中)在转发给后端的数据库服务器,程序服务取到Memcached内存缓存中没有的对应的数据后,除了返回给用户数据外,还会把数据在内存中进行缓存,等待下次被访问,从而大大的减轻数据库的压力,提高整个网站架构的响应速度,提升了用户休验。

  • 当程序更新、删除数据库中已有的数据时:会同时发送请求通知Memeached已经缓存过的同一个ID内容的旧数据失效,从而保证Memcache中的数据和数据库中的数据一致。

  • 如果是在高并发场合,除了通知Memcached过期的缓存失效外,还会通过相关机制,使得在用户访问新数据前,通过程序预先把更新的数据推送到memcached中缓存起来,这样可以减少数据库的访问压力,提升memcached中缓存的命中率。。

图示

上图利用Memcached来减少数据库压力的的具体工作流程描述如下:。

  • 1)程序首先检查前端应用服务请求的数据是否在Memcached缓存中存在,如果存在,
    直接把请求的数据返回,不再请求后端数据库。。
  • 2)如果请求的数据不在Memcached缓存中,请求将被转发去查询数据库服务,把从数
    据库中取到的数据返回前端,同时把新取到的数据新缓存一份 到Memcached缓存中。。
  • 3)当程序更新、删除数据库已有数据的同时,也会更新Memcached中的旧数据,从而
    保证Memcache中缓存的数据和数据库中的数据-致,这个一致性非常重要。。
  • 4)当分配给Memcached内存空间用完之后,Memcached自身会使用LRU(Least Recently Used,最近最少使用)加到期失效策略,失效的数据首先被替换掉,然后是最近未使用的数据被替换掉。。

Memcached服务在大型站点中的应用

  • 几乎所有的网站,当访问量增大时,在整个网站集群架构中最先出现瓶颈的一定是数
    据库角色的服务器以及存储角色的服务器,在工作中我们是尽量把用户的请求往前推,即当用户请求数据时,越是在靠近用户的一端把数据返回就越好。
  • 那么,为了缓解数据库的高并发访问压力,我们可以在数据库层配置数据读写分离及读数据库做负载均衡,但是更有效更简单的策略是,部署Memcache服务作为-一个缓存区域,把部分数据库的信息保存在内存中,这样前端的服务能够迅速的读取到原本在数据库中才能读取到的数据。那么,最重要的就是如何通过memcached服务分担数据库系统的压力,由于单台Memcache的内存容量的有限的,并且单台也是单点,因此,memcached 也有负载均衡及分布式应用的场景

[分布式应用1]
在应用服务器上通过程序及URL_HASH,抑制性哈希算法算法去访问Memcache服务,
所有Memcached服务器的地址池可以简单的配在每个程序的配置文件里。。
[分布式应用2]
门户如百度,会通过一个中间件代理负责请求后端的Cache服务。。
[分布式应用3]
可以用常见的LVS,haproxy 做Cache的负载均衡,和普通应用服务相比,这里的重
点是轮询算法,-般会选择url_ hash,及一致性哈希算法。。

数据库优化思路

show full processlist 查看
说明: LIKE’%杜冷丁%’这样的语句特别多,导致数据库负载很高,LIKE ’%杜冷丁%’这样的语句对于MySQL数据
优化方案思路:↓
1)从业务.上实现用户后登录再搜索,这样减少搜索次数,从而减轻数据库服务的压力↓
2)如果有大量频繁的搜索,-般是由爬虫在爬你的网站,分析WEB IP封掉之(AWSTATS)。↓
3)配置多个主从同步,程序实现读写分离(最好让LIKE’%杜冷丁%’这样的查询去从库查),减轻主库读写压力。
4)在数据库前端加上memcached缓存服务器。↓
5) LIKE’%杜冷丁%’的语句,一般在mysq1里很难优化,可以通过搜索服务Sphinx实现搜索。

Memcached的特性

  • Memcached作为高并发、高性能的缓存服务,具有如下特征:。
    协议简单
    1)Memcached的协议实现比较简单,使用的是基于文本行的协议,能通过telnet直接操
    2)作Memcached服务存取数据。。
    基于libevent的事件处理。
    简单的说,libevent 是一套利用C开发的程序库,它将BSD系统的kqueue,Linux 系
    统的epoll等事件处理功能封装成一个接口,确保即使服务器端的连接数增加也能发挥很好的性能。I
    3)Memcached就是利用这个库进行异步事件处理

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

■ Memcached软件工作原理。

  • Memcached是一套C/S模式架构的软件,在服务器端启动服务守护进程,可以为
    memcached服务器指定监听的IP地址端口号并发访问连接数以及分配多少内存来处理客户端的请求的参数
  • Memcached软件是由C语言来实现的,全部代码仅有2000多行,采用的是异步I/O,
    其实现方式是基于事件的单进程和单线程的。使用libevent作为事件通知机制,多个服务器端可以协同工作,但这些服务器端之间是没有任何通信联系,每个服务器端只对自己的数据进行管理。应用程序端通过指定缓存服务器的IP地址和端口,就可以连接memcached服务互相通信。。
    需要被缓存的数据以key/value对的形式保存在服务器端预分配的内存区中,每个被
    缓存的数据都有唯- r的标识key,操作Memcached中的数据通过这个唯一标识的 key进行。缓存到Memcached中的数据仅放置在Memcached服务预分配的内存中,而非存储在memcached上的磁盘上,因此存取速度非常快。
  • 由于Memcached服务自身没有对缓存的数据进行持久性存储的设计,因此,在服务器端的memcached服务进程重启之后,存储在内存中的这些数据就会丢失。且当内存中缓存的数据容量达到启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。Memcached软件开发早,当初仅为缓存而设计的,因此在设计之初并没有过多考虑数据的永久性问题。因此,如果使用memcached作为缓存数据服务,要考虑数据丢失后带来的问题,例如:是否可以重新生成数据,还有,在高并发场合数据丢失会不会导致网站架构雪崩
    -为了满足数据可以持久性的保留的需求,sina 网基于memcached服务开发了一款
    NoSQL软件,名字MemcacheDb,可以实现在缓存的基础上增加了持久缓存的特性。

■ Memcached内存管理机制

  • Memcached利用Slab Allocation机制来分配和管理内存。传统的内存管理方式是: 使用完通过malloc分配的内存后通过free来回收内存。这种方式容易产生内存碎片并降低操作系统对内存的管理效率。Slab Allocation机制不存在这样的问题,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,这些内存块不会释放,可以重复利用。
  • Memcached服务器端保存着一个 空闲的内存块列表,当有数据存入时根据接收到的数据大小,分配一个能存下这个数据的最小内存块。这种方式有时会造成内存浪费,例如:将200字节的一个数据存入300字节的一个内存块中,会有100 字节被浪费掉,不能被使用。
  • 避免浪费内存的办法是:
  • 1)预先计算出应用存入的数据大小,或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀,这样就可以减少内存的浪费。
    2)在启动时指定“-f” 参数,能在某种程度上控制内存组之间的大小差异。
    在应用中使用Memcached时,通常可以不重新设置这个参数,使用默认值1.25进行部署。

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 在内存耗尽时,会返回一个报错信息。
  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
宇智波丶木木 发布了50 篇原创文章 · 获赞 3 · 访问量 640 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: