分布式缓存——memcache原理

内容:1.什么是Memcached

2.MemCache和MemCached的区别

3.memcache访问模型

4.Memcached作为高速运行的分布式缓存服务器具有以下特点

5.Memcached的内存算法

6.Memcached的缓存策略

            7.分布式算法(Consistent Hashing)

            8. MemCache的特性和限制总结


1.什么是Memcached
        MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。

许多Web 应用程序都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大,访问的集中,就会出现REBMS的负担加重,数据库响应恶化,网站显示延迟等重大影响。Memcached是高性能的分布式内存缓存服务器。一般的使用目的是通过缓存数据库查询结果,减少数据库的访问次数,以提高动态Web 应用的速度、提高扩展性。


2.MemCache和MemCached的区别:

1、MemCache是项目的名称

2、MemCached是MemCache服务器端可以执行文件的名称

3.memcache访问模型

同时基于这张图,理一下MemCache一次写缓存的流程:

1、应用程序输入需要写缓存的数据

2、API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号

3、由服务器编号得到MemCache及其的ip地址和端口号

4、API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作

读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。

这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。

4.Memcached作为高速运行的分布式缓存服务器具有以下特点。

协议简单:memcached的服务器客户端通信并不使用复杂的MXL等格式,而是使用简单的基于文本的协议。

基于libevent的事件处理:libevent是个程序库,他将Linux 的epoll、BSD类操作系统的kqueue等时间处理功能封装成统一的接口。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。

内置内存存储方式:为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached,重启操作系统会导致全部数据消失。另外,内容容量达到指定的值之后memcached回自动删除不适用的缓存。

Memcached不互通信的分布式:memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。他的分布式主要是通过客户端实现的。

    5.Memcached的内存算法:
        Memcached利用slab allocation机制来分配和管理内存,它按照预先规定的大小,将分配的内存分割成特定长度的内存块,再把尺寸相同的内存块分成组,数据在存放时,根据键值 大小去匹配slab大小,找就近的slab存放,所以存在空间浪费现象。
      传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率。

Memcached根据收到的数据的大小,选择最合适数据大小的Slab (图2) memcached中保存着slab内空闲chunk的列表,根据该列表选择chunk,然后将数据缓存于其中。

6.Memcached的缓存策略:
      Memcached的缓存策略是LRU(最近最少使用)加上到期失效策略。当你在memcached内存储数据项时,你有可能会指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。

7.分布式算法(Consistent Hashing):

当向memcached集群存入/取出key/value时,memcached客户端程序根据一定的算法计算存入哪台服务器,然后再把key/value值存到此服务器中。也就是说,存取数据分二步走,第一步,选择服务器,第二步存取数据。

选择服务器算法有两种,一种是根据余数来计算分布,另一种是根据散列算法来计算分布。
    余数算法:
    先求得键的整数散列值,再除以服务器台数,根据余数确定存取服务器,这种方法计算简单,高效,但在memcached服务器增加或减少时,几乎所有的缓存都会失效。
    散列算法:
    先算出memcached服务器的散列值,并将其分布到0到2的32次方的圆上,然后用同样的方法算出存储数据的键的散列值并映射至圆上,最后从数据映射到的位置开始顺时针查找,将数据保存到查找到的第一个服务器上,如果超过2的32次方,依然找不到服务器,就将数据保存到第一台memcached服务器上。如果添加了一台memcached服务器,只在圆上增加服务器的逆时针方向的第一台服务器上的键会受到影响。




    8. MemCache的特性和限制总结:

上面已经对于MemCache做了一个比较详细的解读,这里再次总结MemCache的限制和特性:

1、MemCache中可以保存的item数据量是没有限制的,只要内存足够

2、MemCache单进程在32位机中最大使用内存为2G,这个之前的文章提了多次了,64位机则没有限制

3、Key最大为250个字节,超过该长度无法存储

4、单个item最大数据是1MB,超过1MB的数据不予存储

5、MemCache服务端是不安全的,比如已知某个MemCache节点,可以直接telnet过去,并通过flush_all让已经存在的键值对立即失效

6、不能够遍历MemCache中所有的item,因为这个操作的速度相对缓慢且会阻塞其他的操作

7、MemCache的高性能源自于两阶段哈希结构:第一阶段在客户端,通过Hash算法根据Key值算出一个节点;第二阶段在服务端,通过一个内部的Hash算法,查找真正的item并返回给客户端。从实现的角度看,MemCache是一个非阻塞的、基于事件的服务器程序

8、MemCache设置添加某一个Key值的时候,传入expiry为0表示这个Key值永久有效,这个Key值也会在30天之后失效,

时间: 2024-10-13 05:58:32

分布式缓存——memcache原理的相关文章

分布式缓存Memcache和Redis

引言 针对于现在计算机的CPU和网络设施,对应用程序来说,执行效率的瓶颈,已经不是代码的长度(实现同一个功能)和带宽了,而是,代码访问资源的过程,即:让我们的程序慢下来的罪魁祸首就是IO操作. 程序从硬盘上读取数据是一个非常花费时间的操作,因为我们现在所使用的硬盘是机械式的,你想机械的运行速度和电的速度,那是一个级别上的选手吗? 为了解决程序的瓶颈,人们提出了一种想法:使用空间换取时间.程序访问硬盘用的时间长,那就让数据放到内存中,让程序访问内存,这样不就节省了时间.这样确实剩下了我们程序获取数

php5.4之分布式缓存memcache(windows7下安装配置)

一.安装memcache memcached在windows7上的安装问题 现在安装包:http://www.jb51.net/softs/44843.html   memcache的安装包 错误: 通过cmd命令行进入到D:\webEve\memcached(下载后的解压目录) 运行 memcached.exe -d install 报错" failed to install service or service already installed" 解决方法: www.2cto.c

83-高性能,分布式缓存memcache简析

一. memcached简介 memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in      speeding up dynamic web applications by alleviating database load. (由 LiveJournal旗下的Danga Interactive研发) #高性能,分布

Memcached 分布式缓存实现原理

摘要 在高并发环境下,大量的读.写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生.无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数,最常见的有redis和memcached等,既然是分布式,那么他们是怎么实现分布式的呢?本文主要介绍分布式缓存服务mencached的分布式实现原理. 缓存本质 计算机体系缓存 什么是缓存,我们先看看计算机体系结构中的存储体系,根据冯·诺依曼计算机体系结构模型,计算机分为五大部分:运算器.控制器.存

分布式缓存Memcache

Memcached是分布式的,也就是说它不是本地的.它基于网络连接(当然它也可以使用localhost)方式完成服务,本身它是一个独立于应用的程序或守护进程(Daemon方式). Memcached使用libevent库实现网络连接服务.libevent是个程序库,它将Linux的epoll.BSD类操作系统的kqueue等事件处理功能封装成统一的接口.即使对服务器的连接数增加,也能发挥O(1)的性能. Memcached是“分布式”的内存对象缓存系统,那些不需要“分布”的,不需要共享的,或者干

分布式缓存Memcache学习笔记

Memcache的使用 使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让 Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取.那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的.我这里简单提出我的个人看法,未经实践,权当参考. 分布式应用 Memcache本来支持分布式,我们客户端稍加改造,更好的支持.我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User I

分布式缓存-Memcache定义

Memcache 是一款开源的高性能的分布式内存对象缓存系统,用于在应用中减少对数据库的访问,提高应用的访问速度,降低数据库负载. 为了在内存中提供高速的数据查找能力,Memcache使用Key-value的形式存储和访问数据,在内存中维护了一张巨大的HashTable,是的对数据的查找的时间复杂度降低到了O(1),保证了对数据的高速访问. 由于内存的大小是有限的,当内存中没有过多的空间来存储新的数据时,Memcache会使用LRU(Least Recently Used)算法,将最近最少未使用

springboot+mybatis+redis实现分布式缓存

大家都知道springboot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据,这些都涉及到分布式系统缓存的实现. 前面其实我已经介绍了springboot+mybatis+ehcache实现缓存数据,但是ehcache的设计并不适合做分布式缓存,所以今天用redis来实现分布式缓存. 原理什么的,我就不多说了,直接上代码. pom依赖 <dependency> <gr

分布式缓存--MVC+EF+Memcache

一.从单机到分布式 现在三台机器组成一个Web的应用集群,其中一台机器用户登录,然后其他另外两台机器如何共享登录状态? 解决方案: 1.AspNet进程外的Session . 2.用数据库存数等钱登录状态. 3.Memcache. 二.为什么用Memcache? 1.解决高并发访问数据库带来的死锁 2.多用户端共享缓存 三.Memcache原理 其实memcache是一种windows服务,客户端发来的请求,都会被Socket服务器端接受到.存数使用键值对存储的.客户端进行存储的时候,就是找最接