Memcached使用点滴

合集下载

使用Memcached进行对象缓存和内存优化

使用Memcached进行对象缓存和内存优化

使用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安装使用

Memcached安装使用1.Memcached安装下载地址:/p/memcached/downloads/list1.1. 安装libevent# tar zxvf libevent-2.0.19-stable.tar.gz# cd libevent-2.0.19-stable# ./configure --prefix=/usr/local/libevent# make# make install1.2. 安装memcached# tar zxvf memcached-1.4.13.tar.gz# cd memcached-1.4.13# ./configure --with-libevent=/usr/local/libevent –-enable-threads --prefix=/usr/local/memcached# make# make install2.Memcached 运行2.1. 运行memcached# ./memcached -d -u root -m 1024 -P /opt/memcached/pid/memcached11211.pid –C -v2.2. 启动参数说明•启动方式:•-d 以守护程序(daemon)方式运行•-u root 指定用户,如果当前为root ,需要使用此参数指定用户•-P /tmp/a.pid 保存PID到指定文件•内存设置:•-m 1024 数据内存数量,不包含memcached本身占用,单位为MB •-M 内存不够时禁止LRU,报错•-n 48 初始chunk=key+suffix+value+32结构体,默认48字节•-f 1.25 增长因子,默认1.25•-L 启用大内存页,可以降低内存浪费,改进性能•连接设置:•-l 127.0.0.1 监听的IP地址,本机可以不设置此参数•-p 11211 TCP端口,默认为11211,可以不设置•-U 11211 UDP端口,默认为11211,0为关闭•并发设置:•-c 1024 最大并发连接数,默认1024,最好是200•-t 4 线程数,默认4。

Memcached 基本语法 记录

Memcached 基本语法 记录
Memcached
Memcached 基本语法 记录
set 指令:指令将value数值存储在指定的key中;
set key flags exptime bytes [noreply]
value
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机用法它存储关于键值对的额外信息 。
bytes:在缓存中存储的字节数
noreply(可选): 该参数告诉服务器不需要返回数据
value:存储的值(始终位于其次行)(可挺直理解为key-value结构中的value)
STORED:保存胜利ቤተ መጻሕፍቲ ባይዱ输出。
NOT_STORED :在保存失败后输出。
get yx
STORED:保存胜利后输出。
ERROR:在保存失败后输出。
add 指令:
Memcached add 指令用于将 value(数据值) 存储在指定的 key(键) 中。假如 add 的 key 已经存在,则不会更新数据(过期的key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
add key flags exptime bytes [noreply]
value
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机用法它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时光长度(以秒为单位,0 表示永久)
exptime:在缓存中保存键值对的时光长度(以秒为单位,0 表示永久)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告诉服务器不需要返回数据

网站大访问量缓存技术之memcache的安装和使用

网站大访问量缓存技术之memcache的安装和使用

网站大访问量缓存技术之memcache的安装和使用知识点:一、memcachemem 内存cache 缓存网页的静态化--》文件缓存。

memcache 内存来作为缓存。

管理内存中的数据。

大中型项目。

1。

作用:用来缓存数据。

数据库临时存储数据的地方,刷新或重启(关机)。

数据就没有了2 优势:数据写入内存,访问速度将加快。

3 memcache 的安装和配置。

memcached.exe 执行可以安装memcache.php_memcache.dll php的扩展库文件。

---》php5.n版本5.2+安装:1 检查以前是否装过memcache控制面板--》管理工具---》服务--》memcache选项。

(没有,没装过);2 安装:memcached.exe -d install3 启动:memcached.exe -d start注意:memcache 内存管理,在杀毒软件下,最好把保护功能暂时先停掉。

4 卸载:需要进服务当中先把mamcache停止掉。

memcached.exe -d unistall5 应用:mysql 3306默认。

memcache 11211 默认。

memcached.exe -d 【参数】installstartuninstallrestart 重启stop 停止memcache服务。

php---》memcache 配置1》php_memcache.dll 文件拷贝php/ext/php_memcache.dll2》php.ini文件:在extension 列表最后一行添加以下代码。

extension=php_memcache.dll --》启动memcache 扩展库。

需要重启apache.6 php使用memcache1>$mem = new Memcache; //实例化内存管理对象memcache的对象。

2>php连接memcache;$mem->connect("主机名称",端口号); 成功返回true 失败false3>memcache add("变量名称","值");$mem->add();4>从内存中取出数据:$mem->get(变量名称);mem 存储数据和数组没有问题。

memcache使用文档

memcache使用文档

Memcache使用指南一线天色天宇星辰概述Memcache 服务为您的应用程序提供了高性能的内存键值缓存,您可通过应用程序的多个实例访问该缓存。

Memcache 对于那些不需要数据库的永久性功能和事务功能的数据很有用,例如临时数据或从数据库复制到缓存以进行高速访问的数据。

Memcache API 与 Danga Interactive 开发的Memcached有类似的功能并兼容。

Memcache API 可通过以下方式让您提高应用程序的性能并减少数据库的负载:∙显著地减少数据库查询的次数。

∙减少使用率非常高的页面的数据库配额的使用。

∙缓存操作量巨大的查询和操作的结果。

∙让使用临时计数器成为可能。

通过使用 Memcache API,您可以为应用程序中的数据创建一致的缓存。

缓存可用于应用程序中的所有实例,而且数据只有通过内存压力(例如缓存中的数据过多)或开发人员设置的缓存政策才能清除。

可以在存储在缓存中的每个键-值对上设置缓存政策。

您可以清除所有缓存或针对每份数据设置缓存过期时间。

Client 类Memcache API 提供一个基于类的接口,以便与其他 Memcache API 兼容。

另请参阅提供相同功能的函数接口。

∙Client()∙实例方法:o set()o set_multi()o get()o get_multi()o delete()o delete_multi()o add()o add_multi()o replace()o replace_multi()o incr()o decr()o flush_all()o get_stats()∙class Client()∙与 Memcache 服务通信的客户端。

∙Client 实例有以下方法:∙set(key, value, time=0, min_compress_len=0)∙设置键的值,与先前缓存中的内容无关。

∙参数:∙key∙要设置的键。

MemcachedClient使用说明

MemcachedClient使用说明

MemcachedClient使⽤说明上⼀篇介绍了Memcached基本使⽤⽅法《》,下⾯介绍java如何操作memcached。

使⽤的是java_memcached-release_2.6.6。

⼀、使⽤⽅法新建项⽬,添加相关jar包:直接上代码了,注释写的很详细,不⽤多说了啊。

package ;import com.danga.MemCached.MemCachedClient;import com.danga.MemCached.SockIOPool;public class MemcachedDemo {public static void main(String[] args) {//memcached服务器String[] servers = {"127.0.0.1:11211","192.168.1.3:11211"};/*** 设置连接池可⽤cache服务器的权重,和server数组的位置⼀⼀对应*/Integer[] weights = {1,2};/*** 这个类⽤来创建管理客户端和服务器通讯连接池,客户端主要的⼯作包括数据通讯、服务器定位、hash码⽣成等都是由这个类完成的。

* 获得连接池的单态⽅法。

这个⽅法有⼀个重载⽅法getInstance( String poolName ),每个poolName只构造⼀个SockIOPool实例。

* 缺省构造的poolName是default。

*/SockIOPool pool = SockIOPool.getInstance();//设置memcached服务器pool.setServers(servers);//设置memcached服务器权重pool.setWeights(weights);//设置容错开关设置为TRUE,当当前socket不可⽤时,程序会⾃动查找可⽤连接并返回,否则返回NULL,默认状态是true,建议保持默认pool.setFailover( true );//设置开始时每个cache服务器的可⽤连接数pool.setInitConn( 10 );//设置每个服务器最少可⽤连接数pool.setMinConn( 5 );//设置每个服务器最⼤可⽤连接数pool.setMaxConn( 250 );/*** 设置连接池维护线程的睡眠时间* 设置为0,维护线程不启动* 维护线程主要通过log输出socket的运⾏状况,监测连接数⽬及空闲等待时间等参数以控制连接创建和关闭。

memcached 手册

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"可以删除之前存储的值。

memcache安装和使用

memcache安装和使用

Memcache 的安装和使用安装:下载安装包:memcached-1.4.8.tar.gz(最新)libevent-1.4.9-stable.tar.gz(socket通信程序,它是memcached 所依赖的异步事件通知库) 上述包都是用c写的。

故在linux环境下安装,linux必须有c编译环境,目前都用gcc(最好系统自带,否则自己安装非常麻烦,特别耗时间)命令tar –xzf libevent-1.4.9-stable.tar.gzcd libevent-1.4.9-stable.tar.gz./configure –prefix=/usrmakemake install=============libevent 安装完毕====================tar –xzf memcached-1.4.8.tar.gzcd memcached-1.4.8.tar.gz./configure –prefix=/usrmakemake install=============memcache安装完毕==================Memcache 已经安装到usr/bin目录下启动/usr/bin memcached –d –m 128 –l 10.10.31.79 –p 11211 -u root-d 以守护(daemon)程序方式运行memcached-l 设置监听的ip地址,如果是本机,通常不设置-p 设置监听端口,默认为11211 通常不设置-m 设置内存大小单位M-u 指定用户。

当前用户为root时,可以指定用户。

(不能以root用户权限启动)-vv 用very vrebose模式启动,调试信息和错误输出到控制台还有很多命令可以用memcached –h 来查看测试telnet server port这里,我用的SecureCRT ,当然还有很多客户端工具,如PuTTy;Window 自带的cmd中的telnet 也可以,但是容易出现乱码问题,得设置编码格式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我对于Memcached的接触,还是在去年看了CSDN的一系列国外大型网站架构设计而开始的。

最初的时候只是简单的封装了Memcached Java版的客户端,主要是对于配置的简化以及Memcached多点备份作了一些工作,然后就作为ASF的组件一部分提供给其他Team使用。

其实看过Memcached Java客户端代码的人就会了解其实客户端的事情很简单,就是要有一套高性能的Socket通信框架以及对Memcached的私有协议实现的接口,自己去做这些事情也是很简单的,不过既然有可以满足自己需求的开源部分,那么就去实现自己需要的但没有实现的。

这里我用的是Whalin的客户端版本,这里为什么还要提出来讲这个,后面会提到。

在对Java客户端作了简单封装和扩展以后,由于其他Team使用的没有什么特殊需求,也就没有再去做太多的修改,直到最近自己的服务集成平台需要做服务访问控制,才重新丰富了Cache组件,也就是这个过程中对于Memcached的一些特性和小的细节有了一些新的认识。

作为服务集成平台需要对服务有所监控,包括访问频率控制以及访问次数控制。

频率控制其实很类似于硬件方面的频率控制,例如硬件可以对IP的高频率访问视为攻击,列入黑名单。

而作为服务的访问,对于服务访问者的控制其实涉及到了业务参数,那么硬件就不是很适合去做这方面的控制,为此我也考虑了很久,最开始打算在Apache上做一个模块控制,但是最后觉得还是放在后面的业务框架上做这件事情。

当然后面我说说的方案可能并不好,但是也算是一种想法。

要把频繁的访问数据记录下来同时分析,那么数据库肯定是不行的,最简单的方式就是采用Cache,又因为是集群范围内的控制,那么集中式Cache就非Memcached莫数了(分布式的Cache传播本身损耗太大,集中式Cache本来的最大缺点就是单点,但作简单的备份操作就可以基本解决此类问题)。

作为解决这个问题的方法来说只需要实现两部分工作:访问计数器,定时任务。

定时任务在我做日志分析框架的时候都是采用了Jdk5的Concurrent包里面的ScheduledExecutorService,这个作简单的循环任务足够用了,同时也是有很好的多线程异步支持,复杂一点么用Quartz。

计数器就要靠Memcached来实现了,本来一般的Cache最大的问题就是高并发下的事务保证,如果采用Get+Set 来完成计数的话,那么高并发下计数器就会出现读写不一致性的问题,幸好Memcached提供了计数累加功能,让这种累加动作能够在服务端一次做好,服务端控制并发写入,保证数据的一致性。

下面就看看以下几个方法:boolean storeCounter(String key, long count):存储key的计数器,值为count。

long getCounter(String key):获取key的计数器,如果不存在返回-1。

long addOrDecr(String key, long decr):计数器值减去decr,如果计数器不存在,保存decr作为计数器值long addOrIncr(String key, long inc):计数器值增加inc,如果计数器不存在,保存inc作为计数器值long decr(String key, long decr):与addOrDecr不同的是在计数器不存在的时候不保存任何值,返回-1long incr(String key, long inc) :与addOrIncr不同的是在计数器不存在的时候不保存任何值,返回-1这里需要说明几点:storeCounter和普通的set方法不同,如果通过set方式置入key:value的话,getCounter等其他四个方法都认为技术器不存在。

所以Counter的存储方式是和普通内容存储不同的。

在不同的场景要慎用addOrXXXX和XXXX的方法,两者还是有比较大的区别的。

计数器没有提供移除特殊方法,使用delete方法可以移除计数器,但是频繁的delete和addOrXXXX有时候会出现一些奇怪的问题(例如同名的计数器就没有办法再次被创建,不过这个还需要进一步的去研究一下看看)。

一般情况下如果计数器的key不是很多,同时也会被复用,那么可以通过置为0或者减去已经分析过的数量来复位。

有上面的一套计数器机制就可以很方便的实现Memcached的计数功能,但是又一个问题出现了,如何让定时任务去遍历计数器,分析计数器是否到了阀值,触发创建黑名单记录的工作。

早先我同事希望我能够提供封装好的keySet接口,但是我自己觉得其实作为Cache来说简单就是最重要的,Cache不需要去遍历。

首先使用Cache的角色就应该知道Key,然后去Cache里面找,找不到就去后台例如DB里面去搜索,然后将搜索的结果在考虑更新到Cache里面,这样才是最高效并且最可靠的,Cache靠不住阿,随时都可能会丢失或者崩溃,因此作为类似于一级缓存或者这类数据完整性要求不高,性能要求很高的场景使用最合适。

当时就没有提供这样的接口,直到今天自己需要了,才考虑如何去做这件事情。

开始考虑是否能够将key都记录在另外的Cache中或者是Memcached中,首先在高并发下更新操作就是一大问题,再者Memcached的内存分配回收机制以及Value的大小限制都不能满足这样的需求,如果使用数据库,那么频繁更新操作势必不可行,采用异步缓存刷新又有一个时间间隔期,同时更新也不是很方便。

最后考虑如果能够让Memcached实现Keyset那么就是最好的解决方案,网上搜索了一下,找到一种策略,然后自己优化了一下,优化后的代码如下:@SuppressWarnings("unchecked")public Set keySet(int limit,boolean fast){Set<String> keys = new HashSet<String>();Map<String,Integer> dumps = new HashMap<String,Integer>();Map slabs = getCacheClient().statsItems();if (slabs != null && slabs.keySet() != null){Iterator itemsItr = slabs.keySet().iterator();while(itemsItr.hasNext()){String server = itemsItr.next().toString();Map itemNames = (Map) slabs.get(server);Iterator itemNameItr = itemNames.keySet().iterator();while(itemNameItr.hasNext()){String itemName = itemNameItr.next().toString();// itemAtt[0] = itemname// itemAtt[1] = number// itemAtt[2] = fieldString[] itemAtt = itemName.split(":");if (itemAtt[2].startsWith("number"))dumps.put(itemAtt[1],Integer.parseInt(itemAtt[1]));}}if (!dumps.values().isEmpty()){Iterator<Integer> dumpIter = dumps.values().iterator();while(dumpIter.hasNext()){int dump = dumpIter.next();Map cacheDump = statsCacheDump(dump,limit);Iterator entryIter = cacheDump.values().iterator();while (entryIter.hasNext()){Map items = (Map)entryIter.next();Iterator ks = items.keySet().iterator();while(ks.hasNext())String k = (String)ks.next();try{k = URLDecoder.decode(k,"UTF-8"); }catch(Exception ex){Logger.error(ex);}if (k != null && !k.trim().equals("")) {if (fast)keys.add(k);elseif (containsKey(k))keys.add(k);}}}}}return keys;}对于上面代码的了解需要从Memcached内存分配和回收机制开始,以前接触Memcached的时候只是了解,这部分代码写了以后就有些知道怎么回事了。

Memcached为了提高内存的分配和回收效率,采用了slab和dump分区的概念。

Memcached一大优势就是能够充分利用Memory资源,将同机器或者不同机器的Memcached服务端组合成为对客户端看似统一的存储空间,Memcached 可以在一台机器上开多个端口作为服务端多个实例,也可以在多台机器上开多个服务实例,而slab 就是Memcached的服务端。

下面是我封装后的Cache配置:<?xml version="1.0" encoding="UTF-8"?><memcached><client name="mclient0" compressEnable="true"defaultEncoding="UTF-8" socketpool="pool0"><!--errorHandler></errorHandler--></client><client name="mclient1" compressEnable="true"defaultEncoding="UTF-8" socketpool="pool1"><!--errorHandler></errorHandler--></client><client name="mclient11" compressEnable="true"defaultEncoding="UTF-8" socketpool="pool11"><!--errorHandler></errorHandler--></client><socketpool name="pool0" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0"nagle="false" socketTO="3000" aliveCheck="true"><servers>10.2.225.210:13000,10.2.225.210:13001,10.2.225.210:1 3002</servers></socketpool><socketpool name="pool1" failover="true" initConn="10" minConn="5" maxConn="250" maintSleep="0"nagle="false" socketTO="3000" aliveCheck="true"><servers>10.2.225.210:13000</servers></socketpool><socketpool name="pool11"failover="true"initConn="10"minConn="5" maxConn="250" maintSleep="0"nagle="false" socketTO="3000" aliveCheck="true"><servers>10.2.225.210:13000</servers></socketpool><cluster name="cluster1"><memCachedClients>mclient1,mclient11</memCachedClients></cluster></memcached>可以看到其实pool才是最终连接服务端的配置,看看pool0,它会连接10.2.225.210:13000,10.2.225.210:13001,10.2.225.210:13002这些机器和他们的端口,但是对于使用pool0的mclient0来说它仅仅只是知道有一个叫做mclient0的cache可以保存数据。

相关文档
最新文档