当前位置: 首页 > 编程日记 > 正文

Memcached在大型网站中应用

memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。


1、 memcached 协议理解
memcache是为了加快http://www.livejournal.com/访问速度而诞生的一个项目。
它的官方主页是:http://www.danga.com/memcached/
工作机制:

通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度,和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash,用户不必关心数据存放在哪,只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。


2、 memcached 使用入门


2.1 memcached的安装

<1>memcached服务的安装
先检查linux内核版本,建议将memcached 安装在2.6以上。
因为memcached 需要用到libevent和 epoll 。
memcached安装前首先确定你的服务器上面安装了libevent库,
libevent下载地址( http://www.monkey.org/~provos/libevent/)。
下载memcached的源码( http://www.danga.com/memcached/download.bml)。
Memcached最初是用perl写的,现在的版本是用c写的。
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf memcached-1.1.12.tar.gz
cd memcached-1.1.12
./configure
这里必须先要configure, 它会检测你的系统情况,然后生成一个config.h文件和其它的几个文件,另外和其它的configure一样,你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。
make //编译
make install //安装


<2>memcached客户端的安装
根据memcached协议,用户可以自己写出符合自己要求的客户端程序。目前http://www.danga.com/memcached/download.bml
提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装:
下载后拷贝到一个目录,安装需要root用户来执行
tar -zxvf Cache-Memcached-1.14.tar.gz
cd Cache-Memcached-1.14
perl makefile.pl
make
make install
make test
这样就安装好了memcahced, 启动memcached就可使用分布式缓存系统了!


2.2 快速入门
<1> memcached服务的启动
memcached的启动非常简单,它没有配置文件,只要配置好几个参数就可以使用了。下面我以一个实际应用的例子,具体说明一下:
memcached –d –m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log
启动的这个memcached为一个后台守护进程模式(-d), 然后缓存的空间为500M(-m), 监听(-l)服务器64.128.191.15的11211号端口(-p).,将日志写道/var/www/kelly/test/logs/memcached_$$.log(-vv)。
其实memcached的参数也非常的有限,就下面这几个:
? -p port number to listen on
? -l interface to listen on, default is INDRR_ANY
? -d run as a daemon
? -r maximize core file limit
? -u assume identity of (only when run as root)
? -m max memory to use for items in megabytes, default is 64 MB
? -M return error on memory exhausted (rather than removing items)
? -c max simultaneous connections, default is 1024
? -k lock down all paged memory
? -v verbose (print errors/warnings while in event loop)
? -vv very verbose (also print client commands/reponses)
? -h print this help and exit
? -i print memcached and libevent license
我们也可以将这个启动脚本写道/etc/rc.d或者/erc/rc.local,这样可以在服务器启动时候执行。

<2> memcached客户端的连接
下面我就以perl客户端程序为例说明客户端的连接:
启动两个memcached server
memcached –d –m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log
memcached –d –m 500 -l 64.128.191.151 -p 11212 -vv >>/var/www/kelly/test/logs/memcached_$$.log
perl客户端程序
#!/usr/bin/perl
use Cache::Memcached;
my $memd = new Cache::Memcached {
'servers' => [ "64.128.191.15:11211" , "64.128.191.15:11212"],
};
my $val = $memd->get( "my_key" );
if ( $val )
{
print "Value is '$val'/n";
}
# Set a value
$memd->set("my_key", "123");
$memd->disconnect_all();
?运行测试
$ perl test-memcache.pl
$ perl test-memcache.pl
Value is '123'
可以看到,第一次没有取得my_key,第二次从memcached中得到my_key的值。
同时通过查看日志,可以发现的确存储在两个memcache server中。
这个简单的例子,解释了如何在memcached中存取数据,以及memcache是真正的分布式缓存系统。
当然,这还只是很简单的例子,体现不出memcache的优势,下面将通过一个很具体的例子,给出详细的应用。


3、 memcached在Zorpia的应用
http://www.zorpia.com 是一个网页相册,博客,交友,论坛的大型网站公司。现在已有超过140万活跃使用者遍布美国,香港,东南亚,欧洲,澳洲,亚洲等其它地区。每天的访问量都在增长,已成为全世界排名第五的社会生活关系网。
Memcached也采用了memcached来提高网站的访问速度,并且取得了很好的效果,我在负责zorpia的memcached项目时候积累了一些经验,主要的做法如下:
1) 通过对memcache的perl客户端进行包装,定制自己的客户端。
2) 通过制定符合zorpia规范的hash key命名规范
? ? memcache中需要存储的内容的key均由string组成。
这个string统一由一个memcache.pm的subroutine来实现。(假设这个subroutine是 get_key() )
? ? memcache中存放两种形式的数据
(1) result of SQL query :
(2) 普通变量(variable)
这两种数据的key的组合方式是不相同的,由get_key进行判断和完成
? ? 关于get_key 和 naming rule
get_key subroutine完成所有memcache key的命名,naming rule也是在它里边体现:
(1)输入参数 -- hash结构,里边定义了当前需要存放的数据的信息
结构
(2)返回值 -- string,返回数据的key_name
?必须确定 get_key 的传入hash的结构,
hash中主要有两个元素
type --- 定义当前数据结构的类型 ,有 'var' , 'sql'两种值
object --- 存放当前数据结构的详细信息,
当 type eq 'var'时,object表示变量的名字,该名字由程序员指定
当 type eq 'sql'时,object包含所存放sql的主要基本信息,hash结构,也由程序员按照规则制定
## 当variable 数据类型,比较简单
$var_hash = {
type => 'var', ## var表示当前类型是 variable
object => 'language', ## language代表variable的名字
};
生成的key是Zorpia::var| language
## sql 数据
比如select first_name from user where user_id =2那么hash为
$sql_hash = {
type => 'sql',
object => {
table => {table2=>"user",}, ## sql 查询的表
column => {column1=>"first_name",}, ## sql所要查询的column
condition => { user_id =>"2",}, ## sql条件
},
};
生成的key是Zorpia::sql|user|first_name| user_id =2
get_key subroutine必须对传入hash进行判断,对不同类型的数据按照不同的方式组合,形成key,返回给使用者。这个key,必须保证其唯一性:
比如:所有字母小写,一些数组在组合成key之前必须首先排序
? ? get_key函数
sub get_key{
my $hash = shift;
return undef unless $hash && ref $hash eq "HASH";
my $type = $hash->{type};
my $key_name;
if ($type eq 'sql') {
my ($table_key,$column_key,$condition_key);
$table_key=_get_key($hash->{object}->{table});
$column_key=_get_key($hash->{object}->{column});
$condition_key=_get_key($hash->{object}->{condition});
$key_name = join('|',$type,$table_key,$column_key,$condition_key);
#Currently the length limit of a key is set at 250 characters
if (length($key_name)>250)
{
$key_name=substr(0,250,$key_name);
}
}
elsif($type eq 'var')
{
$key_name = join('|',$type,$hash->{object});
}
return $key_name;
}
sub _get_key
{
my $hash=shift;
return undef unless $hash && ref $hash eq "HASH";
my ($t,$ret,$i);
foreach $i (sort keys %$hash)
{
$i=~s/^/s+|/s+$//g;
$hash->{$i}=~s/^/s+|/s+$//g;
push(@$t,lc("$i=$hash->{$i}"));
}
$ret=join(':',sort { $a cmp $b } @$t);
return $ret;
}
3) 制定需要应用memcached的规则
?经常访问的表user,user_details
?合理设定变量在memcached的生存周期
?将活跃用户的信息预先导入到memcached
?分别在多台机器上启动多个memcached服务
?编写脚本监控memcached服务是否活动
4) User表的具体应用举例
? 在 select时候
先查询memcahce里有没有,有的话,返回;否则从数据库select,在memcache里设置,返回。
my $sql_hash = {
type => 'sql',
object => {
table => {table1=>"user",},
column => {column1=>"user_id",},
condition => {email=>$user_id,},
},
};
my $key=Zorpia::MemCache::get_key($sql_hash);
my $user_id_by_email=Zorpia::MemCache::get($key);
if(!$user_id_by_email)
{
my $sth;
my $query ="select user_id from user where email=?";
$sth = $dbh->prepare($query);
$sth->execute($user_id);
my $user1 = $sth->fetchrow_hashref();
$user_id_by_email=$user1->{'user_id'};
Zorpia::MemCache::set($key,$user_id_by_email,1800);
}
?在 update,insert,delete时候
先在数据库update,insert,delete,在memcache里设置,返回。
&Zorpia::DB::data_entry_no_return($dbh,"user","COUNT(*)","$account_information_insert_statement user_id=$current_user_id", "user_id=$current_user_id");
#add by kelly
my $sql_hash = {
type => 'sql',
object => {
table => {table1=>"user",},
column => {column1=>"user_id",},
condition => {user_id=>$current_user_id,},
},
};
my $key=Zorpia::MemCache::get_key($sql_hash);
my $query = "SELECT *, user_id AS id FROM user WHERE user_id=?";
my $sth_memc = $dbh->prepare($query);
$sth_memc->execute($current_user_id);
my $user_memc = $sth_memc->fetchrow_hashref();
&Zorpia::MemCache::set($key,$user_memc,21600);


4、 memcached的应用展望
使用了memcached以后, 我发现以前做过的很多的项目都可以应用它提高效率,包括最近做的“大单追踪”, “数码搜索”等等。当然既然memcahced是分布式的缓存系统,那么它就是建立了一个分布式的平台, 我们可以用它来进行分布式的记数, 因为对于一个键值key我们可以设置它的数值以及有效期在参数中,另外还可以重新设置这个键值的数值。 所以我总结了一下目前可以应用到的地方:
<1>.数据库检索结果的缓存,也就是说可以有机的和数据库结合起来应用,提高效率。
这也是目前memcached用到的最多的地方,比如用于大型网站等。
可以这样来实现:
打开memcached服务器连接
编写sql语句, 同时算出它的一个hash key值
获取这个hash值的memcached保存数据(get)
如果获取的这个hash值的数据存在。返回
否则连接数据库查找
把这个查找结果保存在memcached中(set),可以设置有效期
返回查找结果
<2>.分布式计算
<3>.分布式共享数据
总之,memcached的机制比较灵活,可以适用于一切需要分布式缓存数据的地方,随着memcached逐渐为人所知,必将在更多的分布式应用领域大放异彩。

相关文章:

iOS开发-照片选择

本来想做个注册登录的表单的&#xff0c;想想还是先做个简单的头像选择&#xff0c;一般情况下不管是内部管理系统还是面向公众的互联网公司&#xff0c;注册登录是免不了的&#xff0c;用户头像上传是免不了的&#xff0c;尤其是企业用户&#xff0c;上传了自己的图片才感觉自…

打造一流创新环境:协作、开放、可持续

作者 | 微软亚洲研究院院长 周礼栋 毋庸置疑&#xff0c;人类是群居物种。早在两千多年前&#xff0c;亚里士多德便在其著述《政治学》里揭示了人类群居共利协作的趋向&#xff1a;个体组成家庭&#xff0c;家庭组成村落&#xff0c;村落组成城池&#xff0c;城池组成国家和社会…

Ansible源码解析 Inventory组概念

group.py 作者 煮酒品茶 一个组的Class&#xff0c;包含对外方法以及属性如下。 组做为inventory的子节点&#xff0c;会有嵌套组&#xff0c;组变量&#xff0c;组内主机&#xff0c;子组&#xff0c;父组的一些概念 [ name, hosts, vars, child_groups, parent_groups, depth…

Hadoop简要介绍

本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档&#xff0c;里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的&#xff0c;同时又参考了网上的很多文章&#xff0c;对学习Hadoop中遇到的问题进行了归纳总结。 …

超 40W 奖金池等你来战!第二届“长沙银行杯”腾讯云启创新大赛火热来袭!...

HEY&#xff01;你在等待一个机会提升自己的能力吗&#xff1f;现在机会来啦&#xff01;第二届“长沙银行杯”腾讯云启创新大赛如约而至&#xff01;现在&#xff0c;让更多人见证你的创新能力和新鲜想法第二届“长沙银行杯”腾讯云启创新大赛由长沙银行联合腾讯云、腾讯云启共…

(转)AppCan中调用系统浏览器打开网页

<!DOCTYPE html> <html> <head> <style>body{ background:#fff; font-size:30px;}</style> <meta charset"utf-8"> <script> function openUrl(url){if(uexWidgetOne.getPlatform()0){//IOS设备uexWidget.loadApp(url,,);…

Python optionParser模块的使用方法

Python 有两个内建的模块用于处理命令行参数&#xff1a; 一个是 getopt&#xff0c;《Deep in python》一书中也有提到&#xff0c;只能简单处理 命令行参数&#xff1b; 另一个是 optparse&#xff0c;它功能强大&#xff0c;而且易于使用&#xff0c;可以方便地生成标准的、…

squid命中率分析参数注释

默认squid配置文件里面已经加上acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objecthttp_access allow all#cachemgr_passwd pass allhttp_access allow Manager all 3.0直接看这里基本的使用方法*取得squid运行状态信息&#xff1a; squidclient -p 80 mgr:info //注…

库克退休前的最后一战:不是苹果汽车而是……

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 上个月库克迎来了他担任苹果 CEO 十周年的日子&#xff0c;我们也为此统计了一份成绩单&#xff1b;而下一个十年&#xff0c;库克可能不会再陪苹果完整走过了&#xff1a;今年 4 月库克在采访中表示…

VIM技巧:显示行号

在vi的命令模式下输入":set nu"&#xff0c;就有行号了&#xff0c;取消行号输入":set nonu"。 命令只对当前文档有效&#xff0c;如果想使vi打开文档时默认显示行号&#xff0c;可以修改vi的配置文件。 # vi ~/.vimrc 在这个文件中&#xff0c;添加 set n…

Python 自动化运维 pycurl

1.探测web服务质量&#xff08;HTTP状态码&#xff0c;请求延时&#xff0c;HTTP头信息&#xff0c;下载速度等&#xff09; web服务质量&#xff1a;1.服务可用性 2.服务响应速度 2.实例 12345678910111213141516171819202122232425262728293031323334353637383940414243impor…

Squid3反向代理安装与配置

一、编译安装 下载 #wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz //找到地址#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版#cd squid-3.0.STABLE25 #./configure --prefix/usr/local/squid / //必须 //以下几步可选 --enable-arp-ac…

ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)

执行SQL语句&#xff1a;int result db.SqlScalar<int>("SELECT OBJECT_ID(name)", new { name "SomeName" });继承表的实现 &#xff08;存储于同一个表中&#xff09;[Alias("Table")] public abstract class MyBaseClass {public…

Deepsort + Yolo 实现行人检测和轨迹追踪

作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 引言 行人检测是近年来计算机视觉领域的研究热点&#xff0c;同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人&#xff0c;在许多领域中都有广泛的应用。交通安全方面&#xff0c;无人驾驶汽车通过提前…

推荐15个国外使用 CSS3 制作的漂亮网站

今天分享的作品集网站有些特别&#xff0c;因为他们都是使用 CSS3 技术制作的。对于设计师来说&#xff0c;为了吸引注意力&#xff0c;作品集必须展示出你的能力&#xff0c;这有点像制作简历&#xff0c;要让人们看到你所擅长的&#xff0c;突出的部分&#xff0c;这是一次推…

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处&#xff1a;http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明&#xff1a;现大部分文章为寻找问题时在网上相互转载&#xff0c;此博是为自己做个记录记录&#xff0c;方便自己也方便有类似问题的朋友&#xff0c;本文的思想也许有所借鉴&#xff0c;…

对抗软件系统复杂性①:如无必要,勿增实体

作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能&#xff0c;软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能&#xff0c;人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要&#xff0c;勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone

今天分析别人网站的时候&#xff0c;注意到国内的chinacache服务商的CDN加速&#xff0c;把squid默认的X-Cache修改为Powered-By-ChinaCache&#xff0c;如下图&#xff1a;以前注意了但是没去研究过&#xff0c;今天刚好有点空挡自己就来研究看看。我的squid版本&#xff1a;s…

NginxApachePHP参数汇总

1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别

含义&#xff1a;intent英文意思是意图&#xff0c;pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面&#xff0c;但不是马上跳转。 Intent 是及时启动&#xff0c;intent 随所在的activity 消失而消失。…

Squid如何提高命中率

缓存命中1.缓存时间设置&#xff0c;顾名思义&#xff0c;缓存时间设置的越长那么命中率也会相对较高。缓存与更新是一对矛盾的概念&#xff0c;既要做到高命中又要做到快速更新这个就需要自己对自己网站内容的了解然后指定合适的缓存策略。2.缓存能缓存的内容&#xff0c;什么…

海量秋招面试资料等你来拿!你离大厂也许并不远

秋招在即&#xff0c;你还在为秋招如何准备而发愁吗&#xff1f;你还在为拿不到大厂offer而苦恼吗&#xff1f;工欲善其事&#xff0c;必先利其器。金秋开学季&#xff0c;CSDN助力你的技术学习与成长&#xff0c;为你免费提供海量大厂面试资料&#xff0c;让你的秋招不再慌乱&…

Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式

Microsoft Dynamics CRM server 2013 中业务规则&#xff0c;我的理解就是有点像C#的正则表达式&#xff0c; 如方某个字段&#xff0c;必须输入什么范围的数值&#xff0c;其它字符不能乱输入。 打开方式有二种&#xff1a; 1. 种像上篇文章中写的那样&#xff0c; 在系统视图…

cCodeforces Round #286 (Div. 2)

A题。。暴力枚举在每个位置添加字符&#xff0c;然后检查一下是不是回文串 1 #include <iostream>2 #include <cstdio>3 #include <cstring>4 #include <algorithm>5 #include <cmath>6 #include <vector>7 8 using namespace std;9 10 #…

Sarg安装配置使用

SARG的全称是&#xff1a;Squid Analysis Report GeneratorSARG作为一款Squid日志分析工具&#xff0c;它采用html格式&#xff0c;详细列出了每一位用户访问internet的站点信息&#xff0c;时间占用信息&#xff0c;排名&#xff0c;连接次数&#xff0c;访问量&#xff0c;访…

OpenAI 以 10 亿美元出售「灵魂」,网友热评不再「Open」

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; OpenAI 如何以 10 亿美元的价格出售其灵魂&#xff1a;GPT-3 和 Codex 背后的公司并不像它声称的那样开放。 当金钱成为障碍时&#xff0c;最好的意图可能会被破坏。 近日&#xff0c;一篇“How Open…

IBM IMM默认ID 及修改默认IP 方法

默认ID&#xff1a; http://192.168.70.125 用户名:USERID 密码:PASSW0RD (数字0) BIOS 下更改IP方法&#xff1a;&#xff08;另一种可进IMM 进行修改&#xff0c;此处不再介绍&#xff09; 本文转自easy80851CTO博客&#xff0c;原文链接&#xff1a;http://blog.51cto.com/6…

squid 优化指南

很多squid 优化只限于在 squid参数和系统参数上面的调整。但是这个实在只是细枝末节的事情&#xff0c;只要不是太弱智的配置导致无法缓存&#xff0c;squid的性能不会有太大差距&#xff0c;也就提高10%左右&#xff0c;只有实际的业务针对squid 进行一些调整&#xff0c;squi…

Android TextView

2019独角兽企业重金招聘Python工程师标准>>> 1、TextView不用获取焦点也能实现跑马灯 public class MarqueeTextView extends TextView { Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if(focused) …

人脸识别模型的动手实践!

作者&#xff1a;宋志龙 来源&#xff1a;Datawhale人脸识别已经成为生活中越来越常见的技术&#xff0c;其中最关键的问题就是安全&#xff0c;而活体检测技术又是保证人脸识别安全性的一个重要手段&#xff0c;本文将向大家简单介绍活体检测&#xff0c;并动手完成一个活体检…