设为首页 收藏本站
查看: 1339|回复: 0

[经验分享] Memcached (一)介绍

[复制链接]

尚未签到

发表于 2018-12-25 07:48:34 | 显示全部楼层 |阅读模式
  简要概述:
  Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据(不做编码),如字符串、对象等。
  为什么是直接数据?因为数据在网络中传输是要经过流式化的,数据传递到对方那里,它如何知道这是什么类型的数据呢,所以就需要在原有数据之外在增加其他数据来修饰数据。所以直接数据就是不加任何修饰的数据。
  比如在读写分离一主多从的模式下,为了加速查询从服务器通常开启缓存,特别是会发生多表连接查询的时候。但是由于多个从服务器前端有一个调度器来进行负载均,所以每次同一个请求未必发送到同一个从服务器上,这样缓存就用不了了。为了解决这个问题,就引入了公共缓存,也就是Memached
  Memached是键值数据库,键就是其实就是搜索条件的HASH码,值就是数据。查找过程就是对比HASH码,所以只要HASH码不冲突,那么它的查找时间无论你有多少HASH码时间都是一样的,也就O1的查找速度。
  Memecached是一个开发工具,它不是一个代码加速器,也不是数据库中间件。为什么它不是数据库中间件呢,因为中间件是你请求它,如果它没有数据,它会替你去向后查找,而Memached则不是,所以这就是为什么说Memcached的功能一半依赖于客户端的开发,一半依赖于服务器。
  

  它的特点如下:

  •   简单的KEY/VALUE存储
  •   功能实现一半依赖于客户端,一半依赖于服务器
  •   各个Memcached服务器之间没有联系
  •   O1的执行效率
  •   过期数据处理,默认情况下采用懒惰模式,因为内存数据库实际上就是对内存的操作,每增加一个数据就要发起系统调用去申请内存,减少一个数据也要发起系统调用去回收内存,所以如果频繁的这种操作会影响性能。
      
  

  Linux中内核使用Glibc库中的malloc()来实现内存分配,使用free()来实现内存释放,所以C\C++程序员可以手动管理内存,这是优势也是劣势,如果是一个经验少的程序员,会经常忘记申请或者释放内存,那么这个程序性能就很低下。所以Memached使用了内存管理器中的slap allocator分配器来实现内存申请和回收。你一启动Memached就要指定分配多大内存空间,无论用还是不用,然后使用slap allocator分配器来对这一段内存做分割,也就是切成小块,这些小块的大小不一样,主要就是为了适应不同大小的数据,也就是尽量避免内存的反复申请和释放。假设申请了一堆1K2K的和4K的内存,如果来了一个3K的数据呢?它会使用最接近且大于它的内存块,也就是4K的,那剩余的1K也就浪费了,这是无法避免的。它不会使用2K+1K的内存块,因为数据不能再分割了,不是说技术上不允许而是从性能上来说的。所以内存页到底分配多大,用户可以自己设定分配因子。
  

  内存术语:
  Page:内存页,也就是让slab用于切割的内存空间。默认的页面大小为1M,然后slab对这些页面做切割。
  Chunkslab把页切割后的就叫做Chunk,用于缓存记录的空间。
  Slab class:同一个种大小的chunk的被称为slabclass
  Memcached协议有两种,文本格式和二进制格式。
  如果1Memcached不够用,可以增加,但是因为Memcached之间没有任何联系,所以你前端就需要有一个调度器或者负载均衡器,这样有带来一个问题就是缓存命中率的事情,你的缓存在哪里下次也要访问哪里。所以加负载均衡不是问题,而是命令率是重要的事情。为了保证命中率,就有了几个算法:
  HASH取余:最简单的办法根据HASH值对后端服务器数量取余。不过这种方式有一个致命的缺点就是增减服务器,那么余将会改变,有可能导致所有缓存都全局失效。
  一致性HASH:也就是一个虚拟的环,232次方。根据服务器名称计算HASH值,然后用这个HASH值对232次方取余,其结果一定是在232次方之内,所以这就是服务器的位置,假设你有3个服务器,落在了这个虚拟环的3个不同位置,用户请求来了,换句话说用户请求的KEY,计算KEY的哈希值,然后也对232次方取余,这样也有一个结果,也会落到这个环上,然后根据顺时针原则去找服务器。这种算法对于服务器的增减所带来的影响比较小。但是缺点是不均衡。尤其是当节点比较少的时候,每个节点在环的位置上不一样有些彼此离得近有些却远,离得远的显然处理的请求会更多。所以可以使用虚拟节点来增加节点数量,来减少不均衡的请求。
  我们之前提到Memcached的功能一半是在客户端上,一半是在服务器上,所以上面说的均衡算法是在客户端上实现的或者是在Memcached前端的负载均衡器上实现的。
  





运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-655457-1-1.html 上篇帖子: memcached 安装小结 下篇帖子: memcached的基本安装与使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表