memcached完全剖析(1-5)整理
- 格式:pdf
- 大小:756.85 KB
- 文档页数:81
使用Memcached进行对象缓存和内存优化随着互联网的迅猛发展,数据量快速增长,对于网站的访问速度和稳定性提出了更高的要求。
而在这个背景下,Memcached作为一款轻量级的缓存系统,得到了越来越多的应用。
一、什么是MemcachedMemcached是一款高性能的分布式内存缓存系统,主要用于减轻数据库负载压力,提高网站访问速度和稳定性。
它采用了键值对的存储方式,在内存中对数据进行存储和访问。
这样可以有效地降低数据库的访问频率,提高网站的响应速度。
Memcached最初由Brad Fitzpatrick开发,是一个开源项目。
它运行在一个分布式的环境中,客户端通过TCP/IP协议连接到Memcached服务器,将数据存储在内存中,可以快速地读取数据。
二、为什么要使用Memcached在一个传统的web应用中,当一个用户请求一个页面时,通常需要连接到数据库中查询数据,然后渲染网页。
但是随着访问量的增加,数据库会遇到性能瓶颈,导致访问速度变慢。
而Memcached作为一个分布式缓存系统,可以有效地解决数据库访问频率过高的问题,减轻数据库的负担。
同时,由于Memcached是一款基于内存的缓存系统,访问速度非常快,能够提供快速的读取服务。
因此,在高并发的情况下,使用Memcached可以提高网站的响应速度,提供更好的用户体验。
三、如何使用Memcached使用Memcached非常简单,只需要在代码中添加一些缓存相关的代码即可。
下面以PHP为例,介绍如何在代码中使用Memcached。
1. 安装和启动Memcached首先需要安装Memcached,并启动Memcached服务。
sudo apt-get install memcached2. 使用PHP扩展在PHP代码中,可以使用PHP扩展来连接到Memcached服务器并进行相关的操作。
我们可以使用Memcached类来进行操作,示例如下:<?php// 创建一个Memcached对象$mem = new Memcached();// 添加Memcached服务器$mem->addServer("localhost", 11211);// 存储数据$mem->set("key", "value", 3600);// 获取数据$val = $mem->get("key");// 输出数据echo $val;>3. 使用缓存进行性能优化在实际使用中,需要根据具体的应用场景来选择合适的缓存策略。
Memcached入门学习文档——小兵突击@序:什么是memcached:Free & open source, high-performance, distributed memory object caching system自由、开源、高性能、分布式的内存对象缓存系统。
由livejounal旗下的danga公司开发的老牌的nosql应用nosql:not only sql,即不仅仅是关系型数据库。
特点:key-value键值对存储,如memcached、redis或基于文档存储:如mongoldb一、使用前的准备(关于telnet)Telnet用于远程操作互联网中的设备或终端计算机服务器,可以有效的减少现场操作的麻烦。
因为设备或终端是遍布整个省或市,有的甚至是国外,如何高效的处理问题是当务之急。
除了telnet还可以ssh使用crt软件登陆,telnet开启的话比较方便windows自带的cmd命令行下就可以运行。
telnet命令格式(cmd窗口下):telnet localhost(ip地址) 端口号,如:telnet 192.168.5.109 11211Win7系统中使用想使用telnet命令时往往会出现如下错误:【'telnet'不是内部或外部命令,也不是可运行的程序或批处理文件】。
解决方法:①首先打开[控制面板],找到[程序和功能],然后点击左侧的[打开或关闭Windows功能]②打开或关闭Windows功能③等待一会就OK啦二、Linux下安装memcached1、安装编译工具gcc make libtool autoconfig 的命令:yum install gcc make libtool autoconfig2、安装memcached的依赖库命令:wget --no-check-certificate3、wget (memcached源文件)4、先装依赖库。
Memcache缓存1.MyBatis缓存MyBatis缓存分为一级缓存与二级缓存一级缓存:基于PerpetualCache 的HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有Cache 就将清空。
二级缓存:与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为Mapper(Namespace)缓存更新机制:当某一作用域(一级缓存Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有select 中的缓存将被清空避免使用二级缓存:/isea533/article/details/445662572.Memcachea)简介Memcache 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。
Memcache基于一个存储键/值对的hashmapb)安装安装命令-d 选项是启动一个守护进程-m 是分配给Memcache使用的内存数量,单位是MB,默认是64MB-u 是运行Memcache的用户-L 是监听的服务器IP地址,默认应该是本机-I page大小,默认1M-p 是设置Memcache监听的端口,默认是11211,最好是1024以上的端口-c 选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定-P 是设置保存Memcache的pid文件位置-h 打印帮助信息-f 指定chunk增长因子大小,该值越小所能提供的chunk间隔越小,可以减少内存的浪费-n chunk最小尺寸-v 输出警告和错误信息-vv 打印客户端的请求和返回信息PS:Memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程最大30天的数据过期时间,设置为永久的也会在这个时间过期Key: 最大键长为250字节,大于长度无法存储,常量KEY_MAX_LENGTH 250控制Value: 单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制运行命令1. 使用telnet连接Memcache服务器端口2. 连接上端口输入stats命令,获取描述Memcache服务器运行情况的参数操作命令 /zzulp/article/details/7823511 命令参数以及用法: 1. s et:命令用于向缓存添加新的键值对。
MemCached帮助文档1、安装(for Windows)memcached 1.2.4 for win32.下载地址:/memcached-win32/例如:c:\memcached\memcached.exe -d installc:\memcached\memcached.exe -d start(默认端口11211)参数解释:-d 以守护程序(daemon)方式运行 memcached;-m 设置 memcached 可以使用的内存大小,单位为 M;-l 设置监听的 IP 地址,如果是本机的话,通常可以不设置此参数;-p 设置监听的端口,默认为 11211,所以也可以不设置此参数;-u 指定用户,如果当前为 root 的话,需要使用此参数指定用户。
-h 帮助2、查看使用状态首先登录到服务器,然后在cmd命令行中键入telnet 127.0.0.1 11211其中127.0.0.1是服务器的地址(这里是本机),11211是memcached绑定的端口号。
之后命令行窗口全黑只有光标提示,摸黑输入stats,即可得到描述Memcached服务器运行情况的参数。
如下图:其中,uptime 是memcached运行的秒数,cmd_get是查询缓存的次数。
这两个数据相除一下就能得到平均每秒请求缓存的次数——最近niupu的流量很低,所以平均也就一秒请求一次多,这么点大的压力,用文件系统缓存一样没问题,根本不会体现出使用memcached的优越。
下面的cmd_set 就是设置key=>value的次数。
整个memcached是个大hash,用cmd_get 没有找到的内容,就会调用一下cmd_set写进缓存里。
紧跟着是get_hits,就是缓存命中的次数。
缓存命中率 = get_hits/cmd_get * 100%。
下面的get_misses的数字加上get_hits应该等于cmd_get。
memcached技术第 1 章MEMCACHED是什么 (1)1.1MEMCACHED的历史1 1.2MEMCACHED的运行原理1 1.3MEMCACHED的安装11.3.1windows下的安装步骤 (2)1.3.2Liunx下安装memcached步骤 (3)第 2 章对MEMCACHED进行操作(CRUD) (5)2.1通过TELNET操作MEM5 2.2 7 2.3通过PHP程序对MEMCACHED进行操作(通过DLL扩展) 7 2.4如何实现WINDOWS 操作LINUX下的MEM12 2.5MEMCACHED最佳实践12 2.6使用源码对MEMCACHED操作13第 3 章MEMCACHED的机制了解 (14)3.1MEMCACHED是基于C/S的架构,协议是文本协议14 3.2MEMCACHED是使用LIBEVENT处理并发14 3.3MEMCACHED是内存存储数据,当MEM重启,或者操作系统重新,数据消失,当数据满后,再放入数据,则使用LRU算法(最近最少使用),对数据置换. 14 3.4MEMCACHED是基于客户端分布式的系统15第 4 章MEMCACHED的细节说明 (17)4.1MEMCACHED的数据生命周期17 4.2S ESSION数据放入到M EMCACHED17 4.3MEMCACHED的安全性讨论18 4.4什么数据放入到MEMCACHED提示19第 1 章memcached是什么概述: memcached就是一个高性能的支持分布式的内存存储系统(软件)。
你可以把它看成一个巨大的hash表: 结构key(键) value(值)字符串(唯一) 整数,浮点数,字符串,布尔,数组,对象,null,二进制数据(视频,音频,图片)1.1memcached的历史国外livejoural 网站,开发memcached软件.=>很多大型网站都开始使用。
memcached 是各种开发程序使用比如php,,jsp网站Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
memcached的使⽤ 1. 下载memcached客户端⽂件把下载⽂件放在⽂件⽬录下2. 安装 memcached命令: c:/memcached/memcached.exe -d install3. 启动 memcachedc:/memcached/memcached.exe -d start4. 连接到 memcachedtelnet localhost 112115:客户端使⽤的基本命令启动/结束memcached -d -m 10 -u root -l 127.0.0.1 -p 11200 -c 256 -P /tmp/memcached.pid-d 选项是启动⼀个守护进程-m 是分配给Memcache使⽤的内存数量,单位是MB,这⾥是10MB-u 是运⾏Memcache的⽤户,这⾥是root-l 是监听的服务器IP地址,如果有多个地址的话,这⾥指定了服务器的IP地址127.0.0.1-p 是设置Memcache监听的端⼝,这⾥设置了12000,最好是1024以上的端⼝-c 选项是最⼤运⾏的并发连接数,默认是1024,这⾥设置了256,按照你服务器的负载量来设定-P 是设置保存Memcache的pid⽂件kill `cat /tmp/memcached.pid` 关闭memcached6:在项⽬中使⽤(与Spring集成)获取Memcached API 地址:创建接⼝MemcachedClient1import java.util.Collection;2import java.util.Map;3import java.util.concurrent.TimeoutException;45/**6 * 提供通⽤的memcached访问接⼝7*/8public interface MemcachedClient {9/**10 * 不管数据存在不存在都会将⽬前设置的数据存储的memcached11 *12 * @param key13 * 不要超过250字节14 * @param exp15 * 以秒为单位,如果超过30天的值,将会⽤unix timestamp来制定截⽌有效时间16 * @param value17 * @return18 * @throws TimeoutException19 * @throws InterruptedException20 * @throws MemcachedClientException21*/22boolean set(String key, int exp, Object value) throws TimeoutException,23 InterruptedException, MemcachedClientException;2425/**26 * 不管数据存在不存在都会将⽬前设置的数据存储的memcached,⾃⾏制定超时时间27 *28 * @see #set(String, int, Object)29 * @param key30 * @param exp31 * @param value32 * @param timeout33 * @return34 * @throws TimeoutException35 * @throws InterruptedException36 * @throws MemcachedClientException37*/38boolean set(String key, int exp, Object value, long timeout)39throws TimeoutException, InterruptedException,4142/**43 * 不管数据存在不存在都会将⽬前设置的数据存储的memcached,但不等待返回确认44 *45 * @see #set(String, int, Object)46 * @param key47 * @param exp48 * @param value49 * @throws InterruptedException50 * @throws MemcachedClientException51*/52void setWithNoReply(String key, int exp, Object value)53throws InterruptedException, MemcachedClientException;5455/**56 * 只有数据不存在时进⾏添加57 *58 * @param key59 * 不要超过250字节60 * @param exp61 * 以秒为单位,如果超过30天的值,将会⽤unix timestamp来制定截⽌有效时间62 * @param value63 * @return64 * @throws TimeoutException65 * @throws InterruptedException66 * @throws MemcachedClientException67*/68boolean add(String key, int exp, Object value) throws TimeoutException,69 InterruptedException, MemcachedClientException;7071/**72 * 只有数据不存在时进⾏添加73 *74 * @param key75 * @param exp76 * 以秒为单位,如果超过30天的值,将会⽤unix timestamp来制定截⽌有效时间77 * @param value78 * @param timeout79 * 1/1000秒为单位,在制定的时间段内没有响应就抛出TimeoutException80 * @return81 * @throws TimeoutException82 * @throws InterruptedException83 * @throws MemcachedClientException84*/85boolean add(String key, int exp, Object value, long timeout)86throws TimeoutException, InterruptedException,87 MemcachedClientException;8889/**90 * 只有数据不存在时进⾏添加,不需要返回具体的确认信息,⼤多数情况下可以⽤此⽅法来提升效率,毕竟我们对Memcached的理解是假设数据不是持久的91 *92 * @param key93 * @param exp94 * @param value95 * @throws InterruptedException96 * @throws MemcachedClientException97*/98void addWithNoReply(String key, int exp, Object value)99throws InterruptedException, MemcachedClientException;100101/**102 * 只有数据存在才进⾏覆盖103 *104 * @param key105 * @param exp106 * @param value107 * @return108 * @throws TimeoutException109 * @throws InterruptedException110 * @throws MemcachedClientException111*/112boolean replace(String key, int exp, Object value) throws TimeoutException,113 InterruptedException, MemcachedClientException;114115/**116 * 只有数据存在才进⾏覆盖117 *118 * @param key119 * @param exp120 * @param value121 * @param timeout122 * @return125 * @throws MemcachedClientException126*/127boolean replace(String key, int exp, Object value, long timeout)128throws TimeoutException, InterruptedException,129 MemcachedClientException;130131/**132 * 只有数据存在才进⾏覆盖,不等返回确认133 *134 * @param key135 * @param exp136 * @param value137 * @throws InterruptedException138 * @throws MemcachedClientException139*/140void replaceWithNoReply(String key, int exp, Object value)141throws InterruptedException, MemcachedClientException; 142143/**144 * 追加到当前数据的后⾯145 *146 * @param key147 * @param value148 * @return149 * @throws TimeoutException150 * @throws InterruptedException151 * @throws MemcachedClientException152*/153boolean append(String key, Object value) throws TimeoutException, 154 InterruptedException, MemcachedClientException;155156/**157 * 追加到当前数据的后⾯158 *159 * @param key160 * @param value161 * @param timeout162 * @return163 * @throws TimeoutException164 * @throws InterruptedException165 * @throws MemcachedClientException166*/167boolean append(String key, Object value, long timeout)168throws TimeoutException, InterruptedException,169 MemcachedClientException;170171/**172 * 追加到当前数据的后⾯,不等待响应173 *174 * @param key175 * @param value176 * @throws InterruptedException177 * @throws MemcachedClientException178*/179void appendWithNoReply(String key, Object value)180throws InterruptedException, MemcachedClientException; 181182/**183 * 追加到当前数据的前⾯184 *185 * @param key186 * @param value187 * @return188 * @throws TimeoutException189 * @throws InterruptedException190 * @throws MemcachedClientException191*/192boolean prepend(String key, Object value) throws TimeoutException, 193 InterruptedException, MemcachedClientException;194195/**196 * 追加到当前数据的前⾯197 *198 * @param key199 * @param value200 * @param timeout201 * @return202 * @throws TimeoutException203 * @throws InterruptedException204 * @throws MemcachedClientException205*/206boolean prepend(String key, Object value, long timeout)209210/**211 * 追加到当前数据的前⾯,不等待返回212 *213 * @param key214 * @param value215 * @throws InterruptedException216 * @throws MemcachedClientException217*/218void prependWithNoReply(String key, Object value)219throws InterruptedException, MemcachedClientException;220221long incr(String key, long delta, long initValue) throws TimeoutException,222 InterruptedException, MemcachedClientException;223224long incr(String key, long delta, long initValue, long timeout)225throws TimeoutException, InterruptedException,226 MemcachedClientException;227228void incrWithNoReply(String key, long delta) throws InterruptedException,229 MemcachedClientException;230231long decr(String key, long delta, long initValue) throws TimeoutException,232 InterruptedException, MemcachedClientException;233234long decr(String key, long delta, long initValue, long timeout)235throws TimeoutException, InterruptedException,236 MemcachedClientException;237238void decrWithNoReply(String key, long delta) throws InterruptedException,239 MemcachedClientException;240241boolean delete(String key) throws TimeoutException, InterruptedException,242 MemcachedClientException;243244boolean delete(String key, long opTimeout) throws TimeoutException,245 InterruptedException, MemcachedClientException;246247boolean delete(String key, long cas, long opTimeout)248throws TimeoutException, InterruptedException,249 MemcachedClientException;250251void deleteWithNoReply(String key) throws InterruptedException,252 MemcachedClientException;253254 <T> T get(String key) throws TimeoutException, InterruptedException,255 MemcachedClientException;256257 <T> T get(String key, long timeout) throws TimeoutException,258 InterruptedException, MemcachedClientException;259260 <T> Map<String, T> get(Collection<String> keyCollections)261throws TimeoutException, InterruptedException,262 MemcachedClientException;263264 <T> Map<String, T> get(Collection<String> keyCollections, long timeout)265throws TimeoutException, InterruptedException,266 MemcachedClientException;267268 <T> GetsResponse<T> gets(String key) throws TimeoutException,269 InterruptedException, MemcachedClientException;270271 <T> GetsResponse<T> gets(String key, long timeout) throws TimeoutException, 272 InterruptedException, MemcachedClientException;273274 <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections) 275throws TimeoutException, InterruptedException,276 MemcachedClientException;277278 <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections, 279long timeout) throws TimeoutException, InterruptedException,280 MemcachedClientException;281282283284boolean isEnabled();285 }创建接⼝实现类MemcachedClientWrapper1package .jszg.cache;3import java.util.Collection;4import java.util.HashMap;5import java.util.Map;6import java.util.Set;7import java.util.concurrent.TimeoutException;89import net.rubyeye.xmemcached.exception.MemcachedException;1011public class MemcachedClientWrapper implements MemcachedClient {12private net.rubyeye.xmemcached.MemcachedClient client;13private boolean enabled = false;1415public MemcachedClientWrapper() {16super();17 }1819public void setMemcachedClient(net.rubyeye.xmemcached.MemcachedClient client) {20this.client = client;21 }2223public net.rubyeye.xmemcached.MemcachedClient getXMemcachedClient() {24return client;25 }2627 @Override28public boolean set(String key, int exp, Object value) throws TimeoutException, InterruptedException, 29 MemcachedClientException {30try {31return client.set(key, exp, value);32 } catch (MemcachedException e) {33throw new MemcachedClientException(e);34 }35 }3637 @Override38public boolean set(String key, int exp, Object value, long timeout) throws TimeoutException,39 InterruptedException, MemcachedClientException {40try {41return client.set(key, exp, value, timeout);42 } catch (MemcachedException e) {43throw new MemcachedClientException(e);44 }45 }4647 @Override48public void setWithNoReply(String key, int exp, Object value) throws InterruptedException,49 MemcachedClientException {50try {51 client.setWithNoReply(key, exp, value);52 } catch (MemcachedException e) {53throw new MemcachedClientException(e);54 }55 }5657 @Override58public boolean add(String key, int exp, Object value) throws TimeoutException, InterruptedException, 59 MemcachedClientException {60try {61return client.add(key, exp, value);62 } catch (MemcachedException e) {63throw new MemcachedClientException(e);64 }65 }6667 @Override68public boolean add(String key, int exp, Object value, long timeout) throws TimeoutException,69 InterruptedException, MemcachedClientException {70try {71return client.add(key, exp, value, timeout);72 } catch (MemcachedException e) {73throw new MemcachedClientException(e);74 }75 }7677 @Override78public void addWithNoReply(String key, int exp, Object value) throws InterruptedException,79 MemcachedClientException {80try {81 client.addWithNoReply(key, exp, value);82 } catch (MemcachedException e) {83throw new MemcachedClientException(e);84 }85 }87 @Override88public boolean replace(String key, int exp, Object value) throws TimeoutException, InterruptedException,89 MemcachedClientException {90try {91return client.replace(key, exp, value);92 } catch (MemcachedException e) {93throw new MemcachedClientException(e);94 }95 }9697 @Override98public boolean replace(String key, int exp, Object value, long timeout) throws TimeoutException,99 InterruptedException, MemcachedClientException {100try {101return client.replace(key, exp, value, timeout);102 } catch (MemcachedException e) {103throw new MemcachedClientException(e);104 }105 }106107 @Override108public void replaceWithNoReply(String key, int exp, Object value) throws InterruptedException,109 MemcachedClientException {110try {111 client.replaceWithNoReply(key, exp, value);112 } catch (MemcachedException e) {113throw new MemcachedClientException(e);114 }115 }116117 @Override118public boolean append(String key, Object value) throws TimeoutException, InterruptedException,119 MemcachedClientException {120try {121return client.append(key, value);122 } catch (MemcachedException e) {123throw new MemcachedClientException(e);124 }125 }126127 @Override128public boolean append(String key, Object value, long timeout) throws TimeoutException, InterruptedException,129 MemcachedClientException {130try {131return client.append(key, value, timeout);132 } catch (MemcachedException e) {133throw new MemcachedClientException(e);134 }135 }136137 @Override138public void appendWithNoReply(String key, Object value) throws InterruptedException, MemcachedClientException { 139try {140 client.appendWithNoReply(key, value);141 } catch (MemcachedException e) {142throw new MemcachedClientException(e);143 }144 }145146 @Override147public boolean prepend(String key, Object value) throws TimeoutException, InterruptedException,148 MemcachedClientException {149try {150return client.prepend(key, value);151 } catch (MemcachedException e) {152throw new MemcachedClientException(e);153 }154 }155156 @Override157public boolean prepend(String key, Object value, long timeout) throws TimeoutException, InterruptedException,158 MemcachedClientException {159try {160return client.prepend(key, value, timeout);161 } catch (MemcachedException e) {162throw new MemcachedClientException(e);163 }164 }165166 @Override167public void prependWithNoReply(String key, Object value) throws InterruptedException, MemcachedClientException { 168try {169 client.prependWithNoReply(key, value);171throw new MemcachedClientException(e);172 }173 }174175 @Override176public long incr(String key, long delta, long initValue) throws TimeoutException, InterruptedException,177 MemcachedClientException {178try {179return client.incr(key, delta, initValue);180 } catch (MemcachedException e) {181throw new MemcachedClientException(e);182 }183 }184185 @Override186public long incr(String key, long delta, long initValue, long timeout) throws TimeoutException,187 InterruptedException, MemcachedClientException {188try {189return client.incr(key, delta, initValue, timeout);190 } catch (MemcachedException e) {191throw new MemcachedClientException(e);192 }193 }194195 @Override196public void incrWithNoReply(String key, long delta) throws InterruptedException, MemcachedClientException { 197try {198 client.incrWithNoReply(key, delta);199 } catch (MemcachedException e) {200throw new MemcachedClientException(e);201 }202 }203204 @Override205public long decr(String key, long delta, long initValue) throws TimeoutException, InterruptedException,206 MemcachedClientException {207try {208return client.decr(key, delta, initValue);209 } catch (MemcachedException e) {210throw new MemcachedClientException(e);211 }212 }213214 @Override215public long decr(String key, long delta, long initValue, long timeout) throws TimeoutException,216 InterruptedException, MemcachedClientException {217try {218return client.decr(key, delta, initValue, timeout);219 } catch (MemcachedException e) {220throw new MemcachedClientException(e);221 }222 }223224 @Override225public void decrWithNoReply(String key, long delta) throws InterruptedException, MemcachedClientException { 226try {227 client.decrWithNoReply(key, delta);228 } catch (MemcachedException e) {229throw new MemcachedClientException(e);230 }231 }232233 @Override234public boolean delete(String key) throws TimeoutException, InterruptedException, MemcachedClientException { 235try {236return client.delete(key);237 } catch (MemcachedException e) {238throw new MemcachedClientException(e);239 }240 }241242 @Override243public boolean delete(String key, long opTimeout) throws TimeoutException, InterruptedException,244 MemcachedClientException {245try {246return client.delete(key, opTimeout);247 } catch (MemcachedException e) {248throw new MemcachedClientException(e);249 }250 }251252 @Override253public boolean delete(String key, long cas, long opTimeout) throws TimeoutException, InterruptedException,255try {256return client.delete(key, cas, opTimeout);257 } catch (MemcachedException e) {258throw new MemcachedClientException(e);259 }260 }261262 @Override263public void deleteWithNoReply(String key) throws InterruptedException, MemcachedClientException {264try {265 client.deleteWithNoReply(key);266 } catch (MemcachedException e) {267throw new MemcachedClientException(e);268 }269 }270271 @SuppressWarnings("unchecked")272 @Override273public <T> T get(String key) throws TimeoutException, InterruptedException, MemcachedClientException { 274try {275return (T)client.get(key);276 } catch (MemcachedException e) {277throw new MemcachedClientException(e);278 }279 }280281 @SuppressWarnings("unchecked")282 @Override283public <T> T get(String key, long timeout) throws TimeoutException, InterruptedException,284 MemcachedClientException {285try {286return (T)client.get(key, timeout);287 } catch (MemcachedException e) {288throw new MemcachedClientException(e);289 }290 }291292 @Override293public <T> Map<String, T> get(Collection<String> keyCollections) throws TimeoutException,294 InterruptedException, MemcachedClientException {295try {296return client.get(keyCollections);297 } catch (MemcachedException e) {298throw new MemcachedClientException(e);299 }300 }301302 @Override303public <T> Map<String, T> get(Collection<String> keyCollections, long timeout) throws TimeoutException, 304 InterruptedException, MemcachedClientException {305try {306return client.get(keyCollections, timeout);307 } catch (MemcachedException e) {308throw new MemcachedClientException(e);309 }310 }311312 @SuppressWarnings("unchecked")313 @Override314public <T> GetsResponse<T> gets(String key) throws TimeoutException, InterruptedException,315 MemcachedClientException {316try {317return new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) client.gets(key));318 } catch (MemcachedException e) {319throw new MemcachedClientException(e);320 }321 }322323 @SuppressWarnings("unchecked")324 @Override325public <T> GetsResponse<T> gets(String key, long timeout) throws TimeoutException, InterruptedException, 326 MemcachedClientException {327try {328return new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) client.gets(key, timeout)); 329 } catch (MemcachedException e) {330throw new MemcachedClientException(e);331 }332 }333334 @Override335public <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections) throws TimeoutException, 336 InterruptedException, MemcachedClientException {339 Map<String, net.rubyeye.xmemcached.GetsResponse<T>> tmps = client.gets(keyCollections);340if (tmps != null) {341 Set<String> keys = tmps.keySet();342for (String key : keys) {343 results.put(key, new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) tmps.get(key)));344 }345 }346return results;347 } catch (MemcachedException e) {348throw new MemcachedClientException(e);349 }350 }351352 @Override353public <T> Map<String, GetsResponse<T>> gets(Collection<String> keyCollections, long timeout)354throws TimeoutException, InterruptedException, MemcachedClientException {355try {356 Map<String, GetsResponse<T>> results = new HashMap<String, GetsResponse<T>>();357 Map<String, net.rubyeye.xmemcached.GetsResponse<T>> tmps = client.gets(keyCollections, timeout);358if (tmps != null) {359 Set<String> keys = tmps.keySet();360for (String key : keys) {361 results.put(key, new GetsResponse<T>((net.rubyeye.xmemcached.GetsResponse<T>) tmps.get(key)));362 }363 }364return results;365 } catch (MemcachedException e) {366throw new MemcachedClientException(e);367 }368 }369370 @Override371public boolean isEnabled() {372return enabled;373 }374375public void setEnabled(boolean enabled) {376this.enabled = enabled;377 }378379 }经验总结:缓存数据的⼀致性问题缓存数据尽量只读,因此缓存本⾝是不适合⼤量写和更新操作的数据场景的。
memcached工作原理
memcached是一款高性能的分布式内存缓存系统,主要用于减轻数据库负载,提高应用程序的性能。
其工作原理如下:
1. 客户端向memcached服务器发送请求,请求可以是获取或设置缓存数据。
2. 如果请求是获取缓存数据,memcached服务器首先检查是否有该数据的缓存副本,如果有,则返回该数据给客户端。
3. 如果请求是设置缓存数据,memcached服务器将数据存储到其内存中,并设置相应的索引。
4. 当memcached服务器的内存空间不足时,会采用LRU(最近最少使用)算法将一些旧的缓存数据删除,以腾出更多的内存空间。
5. 当多个memcached服务器组成一个分布式缓存集群时,客户端需要通过一致性哈希算法来选择具体的服务器,以保证缓存数据的一致性。
6. 当客户端对缓存数据进行修改时,需要同时更新所有memcached服务器上的缓存数据,以保证数据一致性。
总之,memcached工作原理简单、高效,可以提高应用程序的响应速度和吞吐
量,同时减少数据库的负载。
memcached全面剖析作者:长野雅广(Masahiro Nagano)作者:前坂徹(Toru Maesaka)翻译:charlee整理:yaykey发表时间:2008/07/02‐2008/07/30翻译时间:2008/07/10‐2008/07/31整理时间:2010/11/09原文链接:http://gihyo.jp/dev/feature/01/memcached/0001 http://gihyo.jp/dev/feature/01/memcached/0002 http://gihyo.jp/dev/feature/01/memcached/0003 http://gihyo.jp/dev/feature/01/memcached/0004 http://gihyo.jp/dev/feature/01/memcached/0005译文地址:•第1次:/2008/07/10/memcached‐001/ •第2次:/2008/07/11/memcached‐002/ •第3次:/2008/07/16/memcached‐003/ •第4次:/2008/07/24/memcached‐004/ •第5次:/2008/07/31/memcached‐005/2 / 81目录1. memcached完全剖析–1. memcached的基础 (5)1.1. memcached是什么? (7)1.2. memcached的特征 (9)1.2.1. 协议简单 (9)1.2.2. 基于libevent的事件处理 (9)1.2.3. 内置内存存储方式 (10)1.2.4. memcached不互相通信的分布式 (10)1.3. 安装memcached (11)1.3.1. memcached的安装 (11)1.3.2. memcached的启动 (12)1.4. 用客户端连接 (13)1.5. 使用Cache::Memcached (15)1.5.1. 使用Cache::Memcached连接memcached (16)1.5.2. 保存数据 (17)1.5.3. 获取数据 (17)1.5.4. 删除数据 (17)1.5.5. 增一和减一操作 (18)1.6. 总结 (19)2. memcached全面剖析–2.理解memcached的内存存储 (21)2.1. Slab Allocation机制:整理内存以便重复使用 (23)2.1.1. Slab Allocation的主要术语 (24)2.1.1.1. Page (24)2.1.1.2. Chunk (24)2.1.1.3. Slab Class (24)2.2. 在Slab中缓存记录的原理 (25)2.3. Slab Allocator的缺点 (27)2.4. 使用Growth Factor进行调优 (29)2.5. 查看memcached的内部状态 (31)2.6. 查看slabs的使用状况 (33)2.7. 内存存储的总结 (35)3. memcached全面剖析–3.memcached的删除机制和发展方向 (37)3.1. memcached在数据删除方面有效利用资源 (39)3.1.1. 数据不会真正从memcached中消失 (39)3.1.2. Lazy Expiration (39)3.2. LRU:从缓存中有效删除数据的原理 (41)3.3. memcached的最新发展方向 (43)3.3.1. 关于二进制协议 (43)3.3.2. 二进制协议的格式 (43)3.3.3. HEADER中引人注目的地方 (45)3.4. 外部引擎支持 (47)3 / 813.4.1. 外部引擎支持的必要性 (47)3.4.2. 简单API设计的成功的关键 (48)3.4.3. 重新审视现在的体系 (49)3.5. 总结 (51)4. memcached全面剖析–4. memcached的分布式算法 (53)4.1. memcached的分布式 (55)4.1.1. memcached的分布式是什么意思? (55)4.2. Cache::Memcached的分布式方法 (59)4.2.1. 根据余数计算分散 (59)4.2.2. 根据余数计算分散的缺点 (60)4.3. Consistent Hashing (63)4.3.1. Consistent Hashing的简单说明 (63)4.3.2. 支持Consistent Hashing的函数库 (65)4.4. 总结 (67)5. memcached全面剖析–5. memcached的应用和兼容程序 (69)5.1. mixi案例研究 (71)5.1.1. 服务器配置和数量 (71)5.1.2. memcached进程 (72)5.1.3. memcached使用方法和客户端 (72)5.1.3.1. 通过Cache::Memcached::Fast维持连接 (73)5.1.3.2. 公共数据的处理和rehash (74)5.2. memcached应用经验 (75)5.2.1. 通过daemontools启动 (75)5.2.2. 监视 (76)5.2.3. memcached的性能 (77)5.3. 兼容应用程序 (79)5.3.1. Tokyo Tyrant案例 (79)5.4. 总结 (81)4 / 81memcached完全剖析–1. memcached的基础1.memcached完全剖析–1. memcached的基础翻译一篇技术评论社的文章,是讲memcached的连载。
fcicq同学说这个东西很有用,希望大家喜欢。
发表日:2008/7/2作者:长野雅广(Masahiro Nagano)原文链接:http://gihyo.jp/dev/feature/01/memcached/0001我是mixi株式会社开发部系统运营组的长野。
日常负责程序的运营。
从今天开始,将分几次针对最近在Web应用的可扩展性领域 的热门话题memcached,与我公司开发部研究开发组的前坂一起, 说明其内部结构和使用。
•memcached是什么?•memcached的特征o协议简单o基于libevent的事件处理o内置内存存储方式o memcached不互相通信的分布式•安装memcachedo memcached的安装o memcached的启动•用客户端连接•使用Cache::Memcachedo使用Cache::Memcached连接memcachedo保存数据o获取数据o删除数据o增一和减一操作•总结5 / 81memcached完全剖析–1. memcached的基础 6 / 81memcached完全剖析–1. memcached的基础1.1.memcached是什么?memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。
现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。
许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。
但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。
这时就该memcached大显身手了。
memcached是高性能的分布式内存缓存服务器。
一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
图1 一般情况下memcached的用途7 / 81memcached完全剖析–1. memcached的基础 8 / 81memcached完全剖析–1. memcached的基础1.2.memcached的特征memcached作为高速运行的分布式缓存服务器,具有以下的特点。
•协议简单•基于libevent的事件处理•内置内存存储方式•memcached不互相通信的分布式1.2.1.协议简单memcached的服务器客户端通信并不使用复杂的XML等格式,而使用简单的基于文本行的协议。
因此,通过telnet也能在memcached上保存数据、取得数据。
下面是例子。
$ telnet localhost 11211Trying 127.0.0.1...Connected to localhost.localdomain (127.0.0.1).Escape character is '^]'.set foo 0 0 3 (保存命令)bar (数据)STORED (结果)get foo (取得命令)VALUE foo 0 3 (数据)bar (数据)协议文档位于memcached的源代码内,也可以参考以下的URL。
•/svn/memcached/trunk/server/doc/protocol.tx t1.2.2.基于libevent的事件处理libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。
即使对服务器的连接数增加,也能发挥O(1)的性能。
memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
关于事件处理这里就不再详细介绍,可以参考Dan Kegel 的The C10K Problem。
•libevent: /~provos/libevent/•The C10K Problem: /c10k.html9 / 81memcached 完全剖析–1. memcached 的基础10 / 81 1.2.3. 内置内存存储方式为了提高性能,memcached 中保存的数据都存储在memcached 内置的内存存储空间中。
由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。
另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。
memcached 本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
关于内存存储的详细信息,本连载的第二讲以后前坂会进行介绍,请届时参考。
1.2.4. m emcached 不互相通信的分布式memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。
各个memcached 不会互相通信以共享信息。
那么,怎样进行分布式呢?这完全取决于客户端的实现。
本连载也将介绍memcached的分布式。