Memcached (一)介绍

简要概述:

Memcached是一款开源、高性能、分布式内存对象缓存系统,可应用各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用结果的直接数据(不做编码),如字符串、对象等。

为什么是直接数据?因为数据在网络中传输是要经过流式化的,数据传递到对方那里,它如何知道这是什么类型的数据呢,所以就需要在原有数据之外在增加其他数据来修饰数据。所以直接数据就是不加任何修饰的数据。

比如在读写分离一主多从的模式下,为了加速查询从服务器通常开启缓存,特别是会发生多表连接查询的时候。但是由于多个从服务器前端有一个调度器来进行负载均,所以每次同一个请求未必发送到同一个从服务器上,这样缓存就用不了了。为了解决这个问题,就引入了公共缓存,也就是Memached

Memached是键值数据库,键就是其实就是搜索条件的HASH码,值就是数据。查找过程就是对比HASH码,所以只要HASH码不冲突,那么它的查找时间无论你有多少HASH码时间都是一样的,也就O1的查找速度。

Memecached是一个开发工具,它不是一个代码加速器,也不是数据库中间件。为什么它不是数据库中间件呢,因为中间件是你请求它,如果它没有数据,它会替你去向后查找,而Memached则不是,所以这就是为什么说Memcached的功能一半依赖于客户端的开发,一半依赖于服务器。

它的特点如下:

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

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

内存术语:

Page:内存页,也就是让slab用于切割的内存空间。默认的页面大小为1M,然后slab对这些页面做切割。

Chunk:slab把页切割后的就叫做Chunk,用于缓存记录的空间。

Slab class:同一个种大小的chunk的被称为slabclass

Memcached协议有两种,文本格式和二进制格式。

如果1台Memcached不够用,可以增加,但是因为Memcached之间没有任何联系,所以你前端就需要有一个调度器或者负载均衡器,这样有带来一个问题就是缓存命中率的事情,你的缓存在哪里下次也要访问哪里。所以加负载均衡不是问题,而是命令率是重要的事情。为了保证命中率,就有了几个算法:

HASH取余:最简单的办法根据HASH值对后端服务器数量取余。不过这种方式有一个致命的缺点就是增减服务器,那么余将会改变,有可能导致所有缓存都全局失效。

一致性HASH:也就是一个虚拟的环,2的32次方。根据服务器名称计算HASH值,然后用这个HASH值对2的32次方取余,其结果一定是在2的32次方之内,所以这就是服务器的位置,假设你有3个服务器,落在了这个虚拟环的3个不同位置,用户请求来了,换句话说用户请求的KEY,计算KEY的哈希值,然后也对2的32次方取余,这样也有一个结果,也会落到这个环上,然后根据顺时针原则去找服务器。这种算法对于服务器的增减所带来的影响比较小。但是缺点是不均衡。尤其是当节点比较少的时候,每个节点在环的位置上不一样有些彼此离得近有些却远,离得远的显然处理的请求会更多。所以可以使用虚拟节点来增加节点数量,来减少不均衡的请求。

我们之前提到Memcached的功能一半是在客户端上,一半是在服务器上,所以上面说的均衡算法是在客户端上实现的或者是在Memcached前端的负载均衡器上实现的。

时间: 2024-08-08 13:01:05

Memcached (一)介绍的相关文章

Memcached简单介绍

Memcached简单介绍 简介:Memcached是一个自由开源的,高性能,分布式内存对象缓存系统.========================================================================目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性.========================================================================特点:协议简单:基

memcached详细介绍,安装,高可用,分布式案例,监控

memcached 是一套内存缓存系统或者软件,用于动态应用系统中缓存数据库数据,减少数据库访问压力,达到性能提升目的 1,一般在企业中用于数据库的cache 2,作为集群架构节点应用服务器之间session数据共享的存储 memcached 是通过预分配指定内存空间来存储数据,java ,php 应用并发超不过1000  单台mysql200-300 已经很大了 memcached(不能持久化),redis(可持久化缓存)     后端数据库的缓存,动态数据.博文,bbs nginx ,squ

.NET平台上的Memcached客户端介绍

早上接到一个任务,需要对Linux服务器的Memcached的update操作进行性能测试,我发现我是一个典型的“手里拿着锤子,就把所有问题都当成钉子”的人.我第一个念头就是,上Memcached的官网找.NET的客户端.最后在Codeplex上找到了一个叫Memcached Providers的客户端程序,很小,218K,里面就3个DLL,一个是Memcached Providers本身的DLL,还有一个是Enyim.Caching,Enyim.Caching也是一个.NET平台上的Memca

memcached简单介绍及在django中的使用

什么是memcached? Memcached是一个高性能的分布式的内存对象缓存系统,全世界有不少公司采用这个缓存项目来构建大负载的网站,来分担数据库的压力.Memcached是通过在内存里维护一个统一的巨大的hash表,memcached能存储各种各样的数据,包括图像.视频.文件.以及数据库检索的结果等,当然因为memcached中的数据是保存在内存中的,应该没有人会把视频.图片等数据保存在memcached中.其实,memcached的原理简单的说就是将数据调用到内存中,然后从内存中读取,从

Memcached 缓存个体,对象,泛型,表

转自 :http://www.cnblogs.com/panshengqiang/p/3605599.html 下面是两位大牛关于Memcached的介绍:大家可以看看 http://zhoufoxcn.blog.51cto.com/792419/528212 http://leepiao.blog.163.com/blog/static/48503130201104103344851/ 如下是我的总结: Memcached是一个命令行窗口程序,可以在命令行窗口中启动也可以封装在系统服务中启动.

在Linux x86_64环境下编译memcached

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信.但是它并不提供冗余(例如,复制其hashmap条目):当某个服务器S停止运行或崩溃了,所有存放在S上的键/值对都将丢失. 说简单一点memcach

关于 Memcached 的一些使用

关于Memcached的一些用法, Memcached 在Windows下的版本费了很大劲,才找到.win32,win64都有.本来想自己build的,但是Cygwin下载包也是费老劲了,下不下来. 在Linux上可以使用rpm/yum直接安装,很方面,如果喜欢自己build的话,那么官网就有源码,也很方便:http://memcached.org/ 也可以在github上找到:https://github.com/memcached/memcached 不过自己build的话Memcached

Memcached的原理与应用

1.Memcached的介绍 Memcached是一套开源.分布式.高性能的内存对象缓存系统,通常用于在减少web应用对数据库的访问而提升整体性能.Memcached是基于内存的"key-value(键值)"的缓存服务器,并且key是经过HASH编码的,使得其查找速度非常迅速,不会因为数据过多而出现查询过慢的问题. Memcached在多数场景下作为数据库前端的公共cache使用,因为它比数据库少了很多SQL的解析.磁盘操作等开销,而且使用内存来管理数据,可以提供比数据库更好的性能.除

memcached使用文档

使用memcached进行内存缓存 通常的网页缓存方式有动态缓存和静态缓存等几种,在ASP.NET中已经可以实现对页面局部进行缓 存,而使用memcached的缓存比ASP.NET的局部缓存更加灵活,可以缓存任意的对象,不管是否在页面上输出.而memcached最大的优点是 可以分布式的部署,这对于大规模应用来说也是必不可少的要求. LiveJournal.com使用了memcached在前端进行缓存,取得了良好的效果,而像wikipedia,sourceforge等也采用了或即将采用memca

Memcached哈希性能优化(八)——总结报告

转自:http://m.blog.csdn.net/blog/hzwfz1989/39120005 Memcached哈希性能优化报告 一. Memcached分析 这两个月一直在memcached优化和找工作之间忙着,一边复习一边优化改代码还真是个让人觉得难以忘记的夏天.做这个项目确实收获了很多,不管是对Linux的系统的认识,还是对memcached的认识都比以前更近一步,另外后面由于添加分块hash,替换LRU算法和更改hash算法对源代码进行修改,一不小心就把原来的代码的测试改跪了,用g