目錄
memcached是什么?
memcached的特征
协议简单
基于libevent的事件处理
内置内存存储方式
memcached不互相通信的分布式
安装memcached
memcached的安装
memcached的启动
用客户端连接
使用Cache::Memcached
使用Cache::Memcached连接memcached
保存数据
获取数据
删除数据
增一和减一操作
总结
首頁 php教程 php手册 memcached完全剖析–1. memcached的基础

memcached完全剖析–1. memcached的基础

Jun 13, 2016 am 09:42 AM
dev http memcached 剖析 發表 基礎 連結

发表日:2008/7/2 

原文链接:http://gihyo.jp/dev/feature/01/memcached/0001 

这个系列文章的链接在这里:

  • 第1次:http://www.phpchina.com/html/29/n-35329.html
  • 第2次:http://www.phpchina.com/html/30/n-35330.html
  • 第3次:http://www.phpchina.com/html/31/n-35331.html
  • 第4次:http://www.phpchina.com/html/32/n-35332.html href="http://www.phpchina.com/html/32/n-35332.html">
  • 第5次:http://www.phpchina.com/html/32/n-35333.html href="http://www.phpchina.com/html/32/n-35333.html"> href="http://www.phpchina.com/html/32/n-35332.html">

我是mixi株式会社开发部系统运营组的长野。 日常负责程序的运营。从今天开始,将分几次针对最近在Web应用的可扩展性领域 的热门话题memcached,与我公司开发部研究开发组的前坂一起, 说明其内部结构和使用。

  • memcached是什么?
  • memcached的特征
    • 协议简单
    • 基于libevent的事件处理
    • 内置内存存储方式
    • memcached不互相通信的分布式
  • 安装memcached
    • memcached的安装
    • memcached的启动
  • 用客户端连接
  • 使用Cache::Memcached
    • 使用Cache::Memcached连接memcached
    • 保存数据
    • 获取数据
    • 删除数据
    • 增一和减一操作
  • 总结

memcached是什么?

memcached 是以LiveJournal 旗下Danga Interactive 公司的Brad Fitzpatric 为首开发的一款软件。现在已成为 mixi、 hatena、 Facebook、 Vox、LiveJournal等众多服务中 提高Web应用扩展性的重要因素。

许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。

这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。

图1 一般情况下memcached的用途

memcached的特征

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

  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

协议简单

memcached的服务器客户端通信并不使用复杂的XML等格式, 而使用简单的基于文本行的协议。因此,通过telnet 也能在memcached上保存数据、取得数据。下面是例子。

$ telnet localhost 11211 Trying 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。

  • http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt

基于libevent的事件处理

libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能 封装成统一的接口。即使对服务器的连接数增加,也能发挥O(1)的性能。 memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。 关于事件处理这里就不再详细介绍,可以参考Dan Kegel的The C10K Problem。

  • libevent: http://www.monkey.org/~provos/libevent/
  • The C10K Problem: http://www.kegel.com/c10k.html

内置内存存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。 另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。 memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。 关于内存存储的详细信息,本连载的第二讲以后前坂会进行介绍,请届时参考。

memcached不互相通信的分布式

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。 各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢? 这完全取决于客户端的实现。本连载也将介绍memcached的分布式。

图2 memcached的分布式

接下来简单介绍一下memcached的使用方法。

安装memcached

memcached的安装比较简单,这里稍加说明。

memcached支持许多平台。

  • Linux
  • FreeBSD
  • Solaris (memcached 1.2.5以上版本)
  • Mac OS X

另外也能安装在Windows上。这里使用Fedora Core 8进行说明。

memcached的安装

运行memcached需要本文开头介绍的libevent库。Fedora 8中有现成的rpm包, 通过yum命令安装即可。

$ sudo yum install libevent libevent-devel
登入後複製

memcached的源代码可以从memcached网站上下载。本文执笔时的最新版本为1.2.5。 Fedora 8虽然也包含了memcached的rpm,但版本比较老。因为源代码安装并不困难, 这里就不使用rpm了。

  • 下载memcached:http://www.danga.com/memcached/download.bml

memcached安装与一般应用程序相同,configure、make、make install就行了。

$ wget http://www.danga.com/memcached/dist/memcached-1.2.5.tar.gz $ tar zxf memcached-1.2.5.tar.gz $ cd memcached-1.2.5 $ ./configure $ make $ sudo make install
登入後複製

默认情况下memcached安装到/usr/local/bin下。

memcached的启动

从终端输入以下命令,启动memcached。

$ /usr/local/bin/memcached -p 11211 -m 64m -vv slab class 1: chunk size 88 perslab 11915 slab class 2: chunk size 112 perslab 9362 slab class 3: chunk size 144 perslab 7281 中间省略 slab class 38: chunk size 391224 perslab 2 slab class 39: chunk size 489032 perslab 2 <23 server listening <24 send buffer was 110592, now 268435456 <24 server listening (udp) <24 server listening (udp) <24 server listening (udp) <24 server listening (udp)
登入後複製

这里显示了调试信息。这样就在前台启动了memcached,监听TCP端口11211 最大内存使用量为64M。调试信息的内容大部分是关于存储的信息, 下次连载时具体说明。

作为daemon后台启动时,只需

$ /usr/local/bin/memcached -p 11211 -m 64m -d
登入後複製

这里使用的memcached启动选项的内容如下。

选项说明-p使用的TCP端口。默认为11211-m最大内存大小。默认为64M-vv用very vrebose模式启动,调试信息和错误输出到控制台-d作为daemon在后台启动

上面四个是常用的启动选项,其他还有很多,通过

$ /usr/local/bin/memcached -h
登入後複製

命令可以显示。许多选项可以改变memcached的各种行为, 推荐读一读。

用客户端连接

许多语言都实现了连接memcached的客户端,其中以Perl、PHP为主。 仅仅memcached网站上列出的语言就有

  • Perl
  • PHP
  • Python
  • Ruby
  • C#
  • C/C++
  • Lua

等等。

  • memcached客户端API:http://www.danga.com/memcached/apis.bml

这里介绍通过mixi正在使用的Perl库链接memcached的方法。

使用Cache::Memcached

Perl的memcached客户端有

  • Cache::Memcached
  • Cache::Memcached::Fast
  • Cache::Memcached::libmemcached

等几个CPAN模块。这里介绍的Cache::Memcached是memcached的作者Brad Fitzpatric的作品, 应该算是memcached的客户端中应用最为广泛的模块了。

  • Cache::Memcached - search.cpan.org: http://search.cpan.org/dist/Cache-Memcached/

使用Cache::Memcached连接memcached

下面的源代码为通过Cache::Memcached连接刚才启动的memcached的例子。

#!/usr/bin/perl use strict; use warnings; use Cache::Memcached; my $key = "foo"; my $value = "bar"; my $expires = 3600; # 1 hour my $memcached = Cache::Memcached->new({ servers => ["127.0.0.1:11211"], compress_threshold => 10_000 }); $memcached->add($key, $value, $expires); my $ret = $memcached->get($key); print "$ret\n";
登入後複製

在这里,为Cache::Memcached指定了memcached服务器的IP地址和一个选项,以生成实例。 Cache::Memcached常用的选项如下所示。

选项说明servers用数组指定memcached服务器和端口compress_threshold数据压缩时使用的值namespace指定添加到键的前缀

另外,Cache::Memcached通过Storable模块可以将Perl的复杂数据序列化之后再保存, 因此散列、数组、对象等都可以直接保存到memcached中。

保存数据

向memcached保存数据的方法有

  • add
  • replace
  • set

它们的使用方法都相同:

my $add = $memcached->add( '键', '值', '期限' ); my $replace = $memcached->replace( '键', '值', '期限' ); my $set = $memcached->set( '键', '值', '期限' );
登入後複製

向memcached保存数据时可以指定期限(秒)。不指定期限时,memcached按照LRU算法保存数据。 这三个方法的区别如下:

选项说明add仅当存储空间中不存在键相同的数据时才保存replace仅当存储空间中存在键相同的数据时才保存set与add和replace不同,无论何时都保存

获取数据

获取数据可以使用get和get_multi方法。

my $val = $memcached->get('键'); my $val = $memcached->get_multi('键1', '键2', '键3', '键4', '键5');
登入後複製

一次取得多条数据时使用get_multi。get_multi可以非同步地同时取得多个键值, 其速度要比循环调用get快数十倍。

删除数据

删除数据使用delete方法,不过它有个独特的功能。

$memcached->delete('键', '阻塞时间(秒)');
登入後複製

删除第一个参数指定的键的数据。第二个参数指定一个时间值,可以禁止使用同样的键保存新数据。 此功能可以用于防止缓存数据的不完整。但是要注意,set函数忽视该阻塞,照常保存数据

增一和减一操作

可以将memcached上特定的键值作为计数器使用。

my $ret = $memcached->incr('键'); $memcached->add('键', 0) unless defined $ret;
登入後複製

增一和减一是原子操作,但未设置初始值时,不会自动赋成0。因此, 应当进行错误检查,必要时加入初始化操作。而且,服务器端也不会对 超过2 32时的行为进行检查。

总结

这次简单介绍了memcached,以及它的安装方法、Perl客户端Cache::Memcached的用法。 只要知道,memcached的使用方法十分简单就足够了。

下次由前坂来说明memcached的内部结构。了解memcached的内部构造, 就能知道如何使用memcached才能使Web应用的速度更上一层楼。 欢迎继续阅读下一章。

版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接以及本声明。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用磁力鏈接 如何使用磁力鏈接 Feb 18, 2024 am 10:02 AM

磁力連結是一種用於下載資源的連結方式,相較於傳統的下載方式更為便利和有效率。使用磁力連結可以透過點對點的方式下載資源,而不需要依賴中介伺服器。本文將介紹磁力連結的使用方法及注意事項。一、什麼是磁力連結磁力連結是一種基於P2P(Peer-to-Peer)協定的下載方式。透過磁力鏈接,使用者可以直接連接到資源的發布者,從而完成資源的共享和下載。與傳統的下載方式相比,磁

115://開頭的連結怎麼下載?下載方法介紹 115://開頭的連結怎麼下載?下載方法介紹 Mar 14, 2024 am 11:58 AM

  最近有很多用戶都在問小編,115://開頭的連結怎麼下載?想要下載115://開頭的連結需要藉助115瀏覽器,大家下載好115瀏覽器後,再來看看下面小編整理好的下載教學。  115://開頭的鏈接下載方法介紹  1、登入115.com,下載115瀏覽器並安裝。  2、在1​​15瀏覽器網址列輸入:chrome://extensions/,進入擴充中心,搜尋Tampermonkey,安裝對應插件。  3、在115瀏覽器網址列輸入:  油猴腳本:https://greasyfork.org/en/

win10安裝snmp失敗錯誤碼0x8024402C的解決方法 win10安裝snmp失敗錯誤碼0x8024402C的解決方法 Feb 13, 2024 am 08:30 AM

snmp協議是簡單網路管理協議,該協議能夠支援網路管理系統,用於監測連接到網路上的設備是否有任何引起管理上關注的情況,不過近期不少的用戶們反應win10安裝snmp失敗錯誤代碼0x8024402C怎麼辦?使用者可以以管理員的身分啟動Powershell來進行設置,以下就讓本站來為使用者來仔細的介紹一下win10安裝snmp失敗錯誤碼0x8024402C的解決方法吧。 win10安裝snmp失敗錯誤碼0x8024402C的解決方法一、以管理員的身分啟動Powershell1、第一步在win10系

如何取得微信影片號連結?微信影片號碼怎麼加入商品連結? 如何取得微信影片號連結?微信影片號碼怎麼加入商品連結? Mar 22, 2024 pm 09:36 PM

微信視訊號作為微信生態系統的一部分,已逐漸成為內容創作者和商家的重要推廣工具。在這個平台上獲取視頻號連結對於分享和傳播內容至關重要。下文將詳細介紹如何獲取微信視頻號鏈接,以及如何在視頻號中添加商品鏈接,提升內容的傳播效果。一、如何取得微信影片號連結?在微信視頻號中發布影片後,系統會自動建立一個影片連結。作者可以在發布後複製該鏈接,方便進行分享和傳播。登入微信影片號碼後,您可以瀏覽自己的影片號碼首頁。在主頁上,每個視頻都附有相應的鏈接,方便您直接複製或分享。 3.搜尋影片號碼:在微信搜尋框中輸入影片號名

Ubuntu 20.04系統安裝Carla詳細教學。 Ubuntu 20.04系統安裝Carla詳細教學。 Feb 19, 2024 pm 08:20 PM

Carla是一款開源的自動駕駛模擬平台,專為開發和測試自動駕駛演算法而設計。以下是在Ubuntu20.04系統上安裝Carla的詳細教學:安裝依賴項:開啟終端機窗口,執行以下指令安裝Carla的依賴項:sudoaptupdatesudoaptinstall-ybuild-essentialclang-10llvm-10python3-pipiytython3-devlibpng-devlib -devlibhdf5-devlibsquish-de

影片號掛連結需要什麼條件?影片號碼帶貨怎麼掛連結? 影片號掛連結需要什麼條件?影片號碼帶貨怎麼掛連結? Mar 07, 2024 pm 01:13 PM

隨著短影片平台的盛行,越來越多的創作者開始利用影片號碼來創作和推廣內容。視訊號碼不僅可以展示個人才能,還可以透過帶貨連結來實現商業變現。但是,要在視頻號中添加鏈接,必須符合一定的條件。一、影片號掛連結需要什麼條件?視訊號認證是在視訊號碼中加入連結的前提條件。目前,主要的短視訊平台如抖音、快手等都提供認證服務,主要包括個人認證和機構認證兩種類型。個人認證需要提交真實身份信息,而機構認證則需要提供相關企業或組織的認證材料。完成認證後,用戶可以在視頻號中添加鏈接,提升帳號的可信度和權威性。影片號碼掛連結的一個

主機板上的數位音訊輸出介面-SPDIF OUT 主機板上的數位音訊輸出介面-SPDIF OUT Jan 14, 2024 pm 04:42 PM

主機板上SPDIFOUT連接線序最近我遇到了一個問題,就是關於電線的接線順序。我上網查了一下,有些資料說1、2、4對應的是out、+5V、接地;而有些資料則說1、2、4對應的是out、接地、+5V。最好的方法是查看你的主機板說明書,如果找不到說明書,你可以使用萬用電表進行測量。首先找到接地,然後就可以確定其他的接線順序了。主機板vdg怎麼接線連接主機板的VDG接線時,您需要將VGA連接線的一端插入顯示器的VGA接口,另一端插入電腦的顯示卡VGA接口。請注意,不要將其插入主機板的VGA介面。完成連接後,您可以

番茄小說如何發表動態 番茄小說如何發表動態 Feb 27, 2024 pm 05:30 PM

番茄小說,這款備受歡迎的小說閱讀軟體,不僅擁有豐富多樣的小說資源,還提供了專屬的分類,讓每位讀者都能輕鬆找到心儀的讀物。無論是經典名著還是熱門新作,番茄小說都能滿足你的閱讀需求。其中也能夠發表自己的動態,分享自己的閱讀觀點,經驗,實現社交功能,但是很多小伙伴們都不清楚究竟該如何發表自己的動態,那麼想要了解的用戶們們就快來跟著一起詳細了解一下吧。番茄小說怎麼發動態? 1.先點選進入番茄小說的我的頁面。 2、然後點選頭像框進入個人資訊頁面。 3.接著點選發表動態的編輯圖案。 4.最後填寫好內容以後選擇發表按

See all articles