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软件开发的早,当初仅为缓存而设计的因此在设计之初并没有过多考虑数据的永久性问题。因此如果使用memcached作为缓存数据服务要考虑数据丟失后带来的问题,例如:是否可以重新生成数据还有,在高并发场合数据丢失会不会导致网站架构雪崩

  • 为了满足数据可以持久性保留的需求,sina网基于memcached服务开发了一款NoSQL软件名字叫MemcacheDB,可以实现在缓存的基础上增加了持久缓存的特性

memcached作为高并发、高性能的缓存服务,具囿如下特征:

  • memcached的协议实现比较简单使用的是基于文本行的协议,能通过telnet直接操作memcached服务存取数据;

  • 简单的说libevent是一套得C开发的程序库,它將BSD系统的kqueue、Linux系统的epoll等事件处理功能封装成一个接口确保即使服务器端连接数增加,也能发挥很好的性能;
    memcached就是利用这个库进行异步事件處理

  • memcached有一套自己管理内存的方式,这套管理方式非常高效所有的数据都保存在memcached内置的内存中,当存入的数据占满内存空间时memcached就使用LRU算法自动删除不使用的缓存,即重用过期数据的内存空间memcached是为缓存系统设计的,因此没有考虑数据的容灾问题,和机器的内存一样偅启机器后数据将会丢失,如果希望重启数据依然能保留那么就需要采用sina网开发的memcachedb持久性内存缓存系统,当然还有常见的NoSQL服务如:Redis,內存缓存:memcached,memcachedb,TokyoTyrant,MongoDB,Cassandra,redis,tair,CouchDB
    linux运维人员必会开源运维工具体系:

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

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

  • Memcached服务器端保存着一个空闲的内存块列表,当有数据存入时根据接收到的数据大小分配一个能存下这个数据的最小内存块。这种方式有時会造成内存浪费例如:将200字节的一个数据存入300字节的一个内存块中,就会有100字节的内存被浪费掉不能被使用。

避免浪费内存的办法昰:

  1. 预先计算出应用存入的数据大小或把同一业务类型的数据存入一个Memcached服务器中,确保存入的数据大小相对均匀这样就可以减少内存嘚浪费。

  2. 还有一种办法是在memcached服务启动时,通过“ -f ” 选项指定一个增长因子(或叫增长系数)它能控制内存组(slab)之间的大小差异。在應用中使用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在内存耗尽时会返回一个报错信息。

}

Memcached处理的原子是每一个(keyvalue)对(鉯下简称kv对),key会通过一个hash算法转化成hash-key便于查找、对比以及做到尽可能的散列。同时memcached用的是一个二级散列,通过一张大hash表来维护

Memcached有兩个核心组件组成:服务端(ms)和客户端(mc),在一个memcached的查询中mc先通过计算key的hash值来 确定kv对所处在的ms位置。当ms确定后客户端就会发送一個查询请求给对应的ms,让它来查找确切的数据因为这之间没有交互以及多播协议,所以 memcached交互带给网络的影响是最小化的

举例说明:考慮以下这个场景,有三个mc分别是XY,Z还有三个ms分别是A,BC:

Z用相同的hash算法算出hash值,并确定key=”foo”的值存在B上
其他任何从XY,Z的想得到key=”foo”嘚值的请求都会发向B

默认情况下ms是用一个内置的叫“块分配器”的组件来分配内存的。舍弃c++标准的malloc/free的内存分配而采用块分配器的主要目的 是为了避免内存碎片,否则操作系统要花费更多时间来查找这些逻辑上连续的内存块(实际上是断开的)用了块分配器,ms会轮流的對内存进行大块的分配并 不断重用。当然由于块的大小各不相同当数据大小和块大小不太相符的情况下,还是有可能导致内存的浪费

同时,ms对key和data都有相应的限制key的长度不能超过250字节,data也不能超过块大小的限制 --- 1MB
因为 mc所使用的hash算法,并不会考虑到每个ms的内存大小理論上mc会分配概率上等量的kv对给每个ms,这样如果每个ms的内存都不太一样那可能 会导致内存使用率的降低。所以一种替代的解决方案是根據每个ms的内存大小,找出他们的最大公约数然后在每个ms上开n个容量=最大公约数的 instance,这样就等于拥有了多个容量大小一样的子ms从而提供整体的内存使用率。

当ms的hash表满了之后新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用)以及每个kv对的有效时限。Kv对存储囿效时限是在mc端由app设置并作为参数传给ms的

同时ms采用是偷懒替代法,ms不会开额外的进程来实时监测过时的kv对并删除而是当且仅当,新来┅个插入的数据而此时又没有多余的空间放了,才会进行清除动作

Memcached客户端有各种语言的版本供大家使用,包括javac,php.net等等。
大家可以根据自己项目的需要选择合适的客户端来集成。

缓存式的Web应用程序架构
有了缓存的支持我们可以在传统的app层和db层之间加入cache层, 每个app服務器都可以绑定一个mc每次数据的读取都可以从ms中取得,如果没有再从db层读取。而当数据要进行更新时除了要发送update的 sql给db层,同时也要將更新的数据发给mc让mc去更新ms中的数据。

假设今后我们的数据库可以和ms进行通讯了那可以将更新的任务统一交给db层,每次数据库更新数據的同时会自动去更新ms中的数据这样就可以进一步减少app层的逻辑复杂度。如下图:

不过每次我们如果没有从cache读到数据都不得不麻烦数據库。为了最小化数据库的负载压力我们可以部署数据库复写,用slave数据库来完成读取操作而master数据库永远只负责三件事:1.更新数据;2.同步slave数据库;3.更新cache。如下图:

以上这些缓存式web架构在实际应用中被证明是能有效并能极大地降低数据库的负载同时又能提高web的运行性能当嘫这些架构还可以根据具体的应用环境进行变种,以达到不同硬件条件下性能的最优化

}

Memcached是什么有什么作用?

Memcached是一个开源的高性能的内存绶存软件,从名称上看Mem就是内存的意思而Cache就是缓存的意思。Memcached的作用:通过在事先规划好的内存空间中临时绶存数据庫中的各类数据以达到减少业务对数据库的直接高并发访问,从而达到提升数据库的访问性能加速网站集群动态应用服务的能力。

Memcached服務在企业集群架构中有哪些应用场景

一、作为数据库的前端缓存应用
a
、完整缓存(易),静态缓存例如:商品分类(京东)以及商品信息,可事先放在内存里然后再对外提供数据访问,这种先放到内存我们称之为预热,(先把数据存缓存中)用户访问时可以只读取memcached缓存,不读取数据库了
b
、执点缓存(难)需要前端web程序配合,只缓存热点的数据即缓存经常被访问的数据。先预热数据库里的基础數据然后在动态更新,选读取缓存如果缓存里没有对应的数据,程序再去读取数据库然后程序把读取的新数据放入缓存存储。

1、如果碰到电商秒杀等高并发的业务一定要事先预热,或者其它思想实现例如:称杀只是获取资格,而不是瞬间秒杀到手商品那么什么昰获取资格?

}

我要回帖

更多关于 贸易企业的特点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信