memcached全面剖析 3 memcached的删除机制和发展方向
8种缓存框架介绍

8种缓存框架介绍缓存框架是一种用于存储和管理缓存数据的软件工具或库。
它们用于提高应用程序的性能,减少数据库或其他远程资源的访问次数。
在本文中,我们将介绍8种流行的缓存框架,包括Redis、Memcached、Ehcache、Guava Cache、Caffeine、Hazelcast、Infinispan和Apache Geode。
1. Redis: Redis是一个基于内存的缓存框架,提供了丰富的数据结构和灵活的功能,包括缓存、消息队列和数据持久化。
Redis的性能出色,并且具有高可用性和扩展性。
2. Memcached: Memcached是另一个流行的基于内存的缓存框架,广泛用于提高Web应用程序的性能。
它具有简单的架构和易于使用的API。
Memcached可以在多台服务器上进行水平扩展,以提供更高的负载能力。
3. Ehcache: Ehcache是一个Java缓存框架,可以用于将缓存添加到应用程序中。
它具有简单易用的API,并提供了多种缓存策略,如LRU (最近最少使用)和FIFO(先进先出)。
Ehcache还支持磁盘持久化和分布式缓存。
4. Guava Cache: Guava Cache是Google开发的一个轻量级缓存库,可以在本地JVM中实现缓存功能。
它具有内存敏感的淘汰策略和异步加载机制,可以优化资源利用和应用程序响应时间。
5. Caffeine: Caffeine是另一个基于本地内存的缓存库,由Google开发。
它被设计为高性能、无锁的缓存框架,并且具有比Guava Cache更高的吞吐量和更低的延迟。
6. Hazelcast: Hazelcast是一个分布式缓存框架和数据网格,可以在多个服务器上共享缓存数据。
它提供了分布式数据结构和分布式计算功能,并支持高可用性和容错性。
7. Infinispan: Infinispan是另一个开源的分布式缓存框架,用于构建高性能和高可靠性的应用程序。
Memcached知识大讲解

Memcached知识大讲解memcached是什么?web应用数据保存在RDBMS中(绝大多数是mysql).从数据库读取数据,随着访问量增大,出现数据库负担很重,反应很慢的问题。
memcached就是解决此问题而生。
他将数据缓存到内存中,提高读写数据的能力。
memcached有何特点?两点:第一,分布式;第二, 缓存。
如何理解分布式memcached是分布式内存缓存服务器,但服务器端是不互相通信的。
简而言之,他的分布式取决于客户端的实现。
那么,如何解决如下问题,有三台memcached 服务器,如何将key=>value类型的数据存放到memcached中?方法有两种:余数计算法和圆点计数法(官方名称,一致性算法).先看余数计算法.先将memcached服务器标号1,2,3.计算key的hash值。
然后初以服务器数量3,得到的余数(如2),则将数据放到2上。
此法优点方法简单,易于分散数据。
但问题是,如果增加了一台memcached服务器,key的hash值除以的余数就变了,势必要重组整个缓存数据,代价不小。
所以,看下圆点解决之道。
圆点法是基于Consistent Hashing的思想。
简单的说,先得出memcached服务器的哈希值,配置到一个0-2的32次方的圆上。
然后同样计算出key的哈希值,映射到相同的圆上。
从映射的位置开始顺时针查找,将数据保存到找到的第一个服务器上。
这样在增加新的memcached服务器的时候,可以最大限度的减少键的重组。
php中Consistent Hashing的实现memcache客户端的实现:1 在php.ini中添加memcache.hash_strategy = consistentmemcached客户端的实现:1 $mc = new Memcached();$mc->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION _CONSISTENT);3 $mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true);php客户端memcached vs memcache怎样区别,也没彻底明白。
memcached原理

memcached原理Memcached是一种分布式内存对象缓存系统,常常被用于动态Web 应用中减轻数据库负载。
它将数据存储在内存中,并通过哈希算法对其进行管理,应用程序可以直接从内存中读取缓存数据,达到加速访问的目的。
Memcached的运行原理:它使用一个客户端-服务端的架构模型,其中客户端与服务器之间通过TCP/IP协议进行通信。
使用者需要将需要存储的key-value对发送到Memcached服务器,然后服务器将这些数据存储在内存中,当调用者需要获取相应的数据时,直接从内存中读取。
如果数据不存在,Memcached将返回一个空响应。
Memcached的特点:1.高速缓存:Memcached是内存中的缓存系统,访问速度非常快;2.内存管理:Memcached使用LRU算法释放内存中不在使用的数据;3.可扩展:Memcached可以非常容易的扩展。
为什么要使用Memcached?1.加速访问:Memcached非常适合访问频繁但数据变化不步的情况,通过加速访问可以提高网站的响应速度。
2.降低数据库压力:将一部分数据放入Memcached缓存中,当这些数据正在使用时,可以减轻数据库的负载,提高数据库的性能。
3.可扩展性:通过横向扩展,可以使Memcached轻松适应大量数据的存储要求,同时保持高速缓存的性能。
如何使用Memcached?1.安装配置:将Memcached服务器安装在适当的机器上,并根据需要进行相应的配置。
2.使用客户端:可以使用各种语言的客户端库来使用Memcached,包括PHP,Python,Java等。
3.使用API调用:通过API直接从客户端调用Memcached提供的方法来获取需要的数据。
总之,Memcached是一个非常实用的高速缓存系统,可以用于加速Web应用程序的访问,并降低数据库的负载。
它的运行原理简单易懂,安装和配置也非常容易,是一个非常值得使用的缓存系统。
memcached 手册

memcached 手册Memcached是一个高性能的开源内存对象缓存系统,被广泛地应用于提升网站和应用程序性能。
该手册将介绍Memcached的基本概念、安装配置、常用命令以及最佳实践等关键内容,旨在帮助读者快速了解和使用Memcached。
一、Memcached概述Memcached可以看作是一个分布式的缓存系统,它将数据缓存在内存中,并提供了简单的键值对存取接口。
相比于传统的关系型数据库,Memcached具有更快的读写速度和更高的并发能力,因为它直接操作内存而避免了磁盘I/O。
此外,Memcached采用了多台服务器的分布式架构,能够提供横向扩展的能力。
二、安装与配置1.下载和安装:Memcached可以从官方网站或其他镜像站点下载安装包,并根据相应平台的指引进行安装。
安装完成后,可以通过运行"memcached"命令来启动Memcached服务。
2.配置文件:Memcached的默认配置文件是"memcached.conf",可以通过修改该文件中的参数来调整Memcached的行为。
主要的配置项包括监听端口、最大连接数、内存容量等。
三、常用命令1.存储数据:用"set"命令可以将键值对存入Memcached中,例如:"set key 0 3600 5"表示存储一个key为"key",值为"0",并设置过期时间为3600秒。
如果要存储的值超出了内存容量限制,旧的数据将会被替换。
2.获取数据:用"get"命令可以从Memcached中获取指定键对应的值,例如:"get key"可以获取到之前存储的值。
如果该键不存在,返回结果将是"END"。
3.删除数据:用"delete"命令可以从Memcached中删除指定键对应的值,例如:"delete key"可以删除之前存储的值。
Memcached源码剖析笔记

Memcached源码剖析笔记XguruMemcached是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于通过减轻数据库负载来使动态Web应用程序提速。
目录1.背景 (3)2.memcached的安装 (4)3.memcached的配置 (5)4.memcached的使用 (6)4.1.存储命令 (7)4.2.读取命令 (8)4.3.删除命令 (8)4.4.高级命令 (9)4.5.其他命令 (10)5.Memcached内部工作机制 (11)5.1.Memcached基本的数据结构 (11)5.2.基本设计概念和处理流程 (12)5.3.内部Hash机制 (15)5.3.1.Hash函数及冲突解决 (15)5.3.2.HashTable主要函数 (15)5.4.slab内存处理机制 (17)5.4.1.slab主要函数 (17)5.4.2.slab机制中所采用的LRU算法 (19)5.5.控制item各种函数 (20)5.6.守护进程机制 (22)5.7.Socket处理机制 (23)15.7.1.Unix域协议 (23)5.7.2.TCP/UDP协议 (24)5.8.多线程处理机制 (25)5.9.事件处理机制 (25)6.未完善之处 (27)7.参考文献 (28)21.背景Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached基于一个存储键/值对的hashmap。
Memcached是一个自由、源码开放、高性能、分布式内存对象缓存系统,目的在于通过减轻数据库负载来使动态Web应用程序提速。
Memcached是一个在内存中对任意的数据(比如字符串,对象等)所使用的key-value 存储。
数据可以来自数据库调用,API调用,或者页面渲染的结果。
MemCache详细解读

MemCache详细解读MemCache是什么MemCache是⼀个⾃由、源码开放、⾼性能、分布式的分布式内存对象缓存系统,⽤于动态Web应⽤以减轻数据库的负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从⽽提⾼了⽹站访问的速度。
MemCaChe是⼀个存储键值对的HashMap,在内存中对任意的数据(⽐如字符串、对象等)所使⽤的key-value存储,数据可以来⾃数据库调⽤、API调⽤,或者页⾯渲染的结果。
MemCache设计理念就是⼩⽽强⼤,它简单的设计促进了快速部署、易于开发并解决⾯对⼤规模的数据缓存的许多难题,⽽所开放的API使得MemCache能⽤于Java、C/C++/C#、Perl、Python、PHP、Ruby等⼤部分流⾏的程序语⾔。
另外,说⼀下MemCache和MemCached的区别:1、MemCache是项⽬的名称2、MemCached是MemCache服务器端可以执⾏⽂件的名称MemCache访问模型为了加深理解,我模仿着原阿⾥技术专家李智慧⽼师《⼤型⽹站技术架构核⼼原理与案例分析》⼀书MemCache部分,⾃⼰画了⼀张图:特别澄清⼀个问题,MemCache虽然被称为"分布式缓存",但是MemCache本⾝完全不具备分布式的功能,MemCache集群之间不会相互通信(与之形成对⽐的,⽐如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),所谓的"分布式",完全依赖于客户端程序的实现,就像上⾯这张图的流程⼀样。
同时基于这张图,理⼀下MemCache⼀次写缓存的流程:1、应⽤程序输⼊需要写缓存的数据2、API将Key输⼊路由算法模块,路由算法根据Key和MemCache集群服务器列表得到⼀台服务器编号3、由服务器编号得到MemCache及其的ip地址和端⼝号4、API调⽤通信模块和指定编号的服务器通信,将数据写⼊该服务器,完成⼀次分布式缓存的写操作读缓存和写缓存⼀样,只要使⽤相同的路由算法和服务器列表,只要应⽤程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。
memcached内存管理与删除机制及服务器实现 -回复

memcached内存管理与删除机制及服务器实现-回复memcached是一款高性能的分布式内存对象缓存系统,常用于动态网站的加速和负载均衡。
作为一种缓存系统,它的内存管理和删除机制对于系统的性能和稳定性非常重要。
本文将一步一步回答有关memcached的内存管理与删除机制及服务器实现的内容。
一、memcached的内存管理机制1. 内存分配memcached使用一个内存池来管理内存,即在启动时分配一块可用于缓存的大内存块,然后根据需要将其划分为多个固定大小的内存块,这样可以提高内存使用效率。
在内存分配时,memcached使用slab分配器来实现。
slab分配器将内存块按照不同大小的chunk(或者称为slab class)分成多个组,每个组里的chunk大小都会是这个组的最小chunk大小的倍数。
这种分配方式可以降低内存碎片,提高内存利用率。
2. 内存回收memcached使用了简单的LRU算法(最近最少使用算法)来进行内存回收。
当内存达到上限时,会根据数据的使用频率来决定哪些数据应该被淘汰。
LRU算法会在内存不足时,将最近最少被访问的数据从缓存中删除,以腾出内存供新数据使用。
3. LRU算法和内存回收LRU算法是一种常用的缓存淘汰算法,它根据数据的访问时间来判断哪些数据是冷数据(很久没有被访问的数据),从而可以将这些冷数据淘汰出缓存。
在memcached中,LRU算法的具体实现是通过维护一个LRU队列来实现的,最前面的元素代表最近最少访问的数据,最后面的元素代表最近最频繁访问的数据。
当内存不足时,memcached会从LRU队列末尾开始淘汰数据,直到满足内存需求为止。
二、memcached的删除机制1. 手动删除memcached提供了delete命令来手动删除指定的键值对。
使用delete 命令可以通过键来删除对应的缓存数据。
2. 过期删除memcached支持设置键值对的过期时间,当数据的过期时间到达时,memcached会自动删除对应的数据。
Memcached

stats reset:清空统计数据
stats slabs:显示各个slab的信息,包括chunk的大小、数目、使用情况等
stats items:显示各个slab中item的数目和存储时长(最后一次访问距离现在的秒数)
quit:退出
4.3.4、重启
# kill `cat /tmp/memcached.pid`
evictions Number of valid items removed from cache to free memory for new items (为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items))
bytes_written Total number of bytes sent by this server to network (服务器向网络发送的总字节数)
limit_maxbytes Number of bytes this server is allowed to use for storage. (服务器在存储时被允许使用的字节总数)
4.3.2、基本测试
# telete 127.0.0.1 12000
# telnet 127.0.0.1 12000
set test 0 0 6 向test当中存储数据
123456 输入的key为test存入数据
STORED 返回set结果
get test 获取数据
connection_structures Number of connection structures allocated by the server (服务器分配的连接结构的数量)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
memcached全面剖析–3.memcached的删除机制和发展方向下面是《memcached全面剖析》的第三部分。
发表日:2008/7/16作者:前坂徹(Toru Maesaka)原文链接:http://gihyo.jp/dev/feature/01/memcached/0003memcached是缓存,所以数据不会永久保存在服务器上,这是向系统中引入memcached的前提。
本次介绍memcached的数据删除机制,以及memcached的最新发展方向——二进制协议(Binary Protocol)和外部引擎支持。
memcached在数据删除方面有效利用资源数据不会真正从memcached中消失上次介绍过,memcached不会释放已分配的内存。
记录超时后,客户端就无法再看见该记录(invisible,透明),其存储空间即可重复使用。
Lazy Expirationmemcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,检查记录是否过期。
这种技术被称为lazy(惰性)expiration。
因此,memcached不会在过期监视上耗费CPU时间。
LRU:从缓存中有效删除数据的原理memcached会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为Least Recently Used(LRU)机制来分配空间。
顾名思义,这是删除“最近最少使用”的记录的机制。
因此,当memcached的内存空间不足时(无法从slab class获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。
从缓存的实用角度来看,该模型十分理想。
不过,有些情况下LRU机制反倒会造成麻烦。
memcached启动时通过“-M”参数可以禁止LRU,如下所示:$ memcached -M -m 1024启动时必须注意的是,小写的“-m”选项是用来指定最大内存大小的。
不指定具体数值则使用默认值64MB。
指定“-M”参数启动后,内存用尽时memcached会返回错误。
话说回来,memcached毕竟不是存储器,而是缓存,所以推荐使用LRU。
memcached的最新发展方向memcached的roadmap上有两个大的目标。
一个是二进制协议的策划和实现,另一个是外部引擎的加载功能。
关于二进制协议使用二进制协议的理由是它不需要文本协议的解析处理,使得原本高速的memcached的性能更上一层楼,还能减少文本协议的漏洞。
目前已大部分实现,开发用的代码库中已包含了该功能。
memcached的下载页面上有代码库的链接。
/memcached/download.bml二进制协议的格式协议的包为24字节的帧,其后面是键和无结构数据(Unstructured Data)。
实际的格式如下(引自协议文档):Byte/ 0 | 1 | 2 | 3 |/ | | | ||0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|+---------------+---------------+---------------+---------------+0/ HEADER // // // /+---------------+---------------+---------------+---------------+24/ COMMAND-SPECIFIC EXTRAS (as needed) /+/ (note length in th extras length header field) /+---------------+---------------+---------------+---------------+m/ Key (as needed) /+/ (note length in key length header field) /+---------------+---------------+---------------+---------------+n/ Value (as needed) /+/ (note length is total body length header field, minus /+/ sum of the extras and key length body fields) /+---------------+---------------+---------------+---------------+Total 24 bytes如上所示,包格式十分简单。
需要注意的是,占据了16字节的头部(HEADER)分为请求头(Request Header)和响应头(Response Header)两种。
头部中包含了表示包的有效性的Magic字节、命令种类、键长度、值长度等信息,格式如下:Request HeaderByte/ 0 | 1 | 2 | 3 |/ | | | ||0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|+---------------+---------------+---------------+---------------+0| Magic | Opcode | Key length |+---------------+---------------+---------------+---------------+4| Extras length | Data type | Reserved |+---------------+---------------+---------------+---------------+8| Total body length |+---------------+---------------+---------------+---------------+12| Opaque |+---------------+---------------+---------------+---------------+16| CAS || |+---------------+---------------+---------------+---------------+Response HeaderByte/ 0 | 1 | 2 | 3 |/ | | | ||0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|0 1 2 3 4 5 6 7|+---------------+---------------+---------------+---------------+0| Magic | Opcode | Key Length |+---------------+---------------+---------------+---------------+4| Extras length | Data type | Status |+---------------+---------------+---------------+---------------+8| Total body length |+---------------+---------------+---------------+---------------+12| Opaque |+---------------+---------------+---------------+---------------+16| CAS || |+---------------+---------------+---------------+---------------+如希望了解各个部分的详细内容,可以checkout出memcached的二进制协议的代码树,参考其中的docs文件夹中的protocol_binary.txt文档。
HEADER中引人注目的地方看到HEADER格式后我的感想是,键的上限太大了!现在的memcached规格中,键长度最大为250字节,但二进制协议中键的大小用2字节表示。
因此,理论上最大可使用65536字节(2<sup>16</sup>)长的键。
尽管250字节以上的键并不会太常用,二进制协议发布之后就可以使用巨大的键了。
二进制协议从下一版本1.3系列开始支持。
外部引擎支持我去年曾经试验性地将memcached的存储层改造成了可扩展的(pluggable)。
http://alpha.mixi.co.jp/blog/?p=129MySQL的Brian Aker看到这个改造之后,就将代码发到了memcached的邮件列表。
memcached的开发者也十分感兴趣,就放到了roadmap中。
现在由我和memcached的开发者Trond Norbye协同开发(规格设计、实现和测试)。
和国外协同开发时时差是个大问题,但抱着相同的愿景,最后终于可以将可扩展架构的原型公布了。
代码库可以从memcached的下载页面上访问。
外部引擎支持的必要性世界上有许多memcached的派生软件,其理由是希望永久保存数据、实现数据冗余等,即使牺牲一些性能也在所不惜。
我在开发memcached之前,在mixi的研发部也曾经考虑过重新发明memcached。
外部引擎的加载机制能封装memcached的网络功能、事件处理等复杂的处理。
因此,现阶段通过强制手段或重新设计等方式使memcached和存储引擎合作的困难就会烟消云散,尝试各种引擎就会变得轻而易举了。
简单API设计的成功的关键该项目中我们最重视的是API设计。
函数过多,会使引擎开发者感到麻烦;过于复杂,实现引擎的门槛就会过高。
因此,最初版本的接口函数只有13个。
具体内容限于篇幅,这里就省略了,仅说明一下引擎应当完成的操作:∙引擎信息(版本等)∙引擎初始化∙引擎关闭∙引擎的统计信息∙在容量方面,测试给定记录能否保存∙为item(记录)结构分配内存∙释放item(记录)的内存∙删除记录∙保存记录∙回收记录∙更新记录的时间戳∙数学运算处理∙数据的flush对详细规格有兴趣的读者,可以checkout engine项目的代码,阅读器中的engine.h。
重新审视现在的体系memcached支持外部存储的难点是,网络和事件处理相关的代码(核心服务器)与内存存储的代码紧密关联。
这种现象也称为tightly coupled(紧密耦合)。