Memcached是一个高并发的内存键值对缓存系统,它的主要做用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度。php
Memcached最开始是做为Linux应用程序被安装在Linux服务器上来使用的,不过自从开源以后,它又被从新编译以适用于Windows环境。Jellycan和Northscale两个站点都提供了Windows的二进制可执行文件下载,下面是下载的地址:html
http://code.jellycan.com/files/memcached-1.2.5-win32-bin.zippython
http://code.jellycan.com/files/memcached-1.2.6-win32-bin.zipgit
http://downloads.northscale.com/memcached-win32-1.4.4-14.zipgithub
http://downloads.northscale.com/memcached-win64-1.4.4-14.zip数据库
http://downloads.northscale.com/memcached-1.4.5-x86.zipwindows
http://downloads.northscale.com/memcached-1.4.5-amd64.zip缓存
在1.4.5版本以前,memcached能够被安装成一个服务,但以后的版本中该功能被移除了。所以memcached的安装能够分为两类,第一类是1.4.5以前的版本,另外一类是1.4.5以后的版本。服务器
1. 将下载的文件解压到任意目录。并发
2. 1.4.5以前版本的memcached会被安装成一个服务,以administrator打开控制台,运行下面的命令:
c:\memcached\memcached.exe -d install
* 注意将路径c:\memcached\memcached.exe替换成你本地的安装路径。
3. 而后使用下面的命令启动或中止memcached服务:
c:\memcached\memcached.exe -d start c:\memcached\memcached.exe -d stop
4. 经过注册表键值来修改memcached的配置项。在运行中输入regedit.exe,而后导航到"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached"。修改其中的键值。例如你想增长memcached所使用的最大内存限制,能够修改ImagePath的值:
"c:\memcached\memcached.exe" -d runservice -m 512
* 除了参数'-m 512'以外,你还可使用其它的参数。经过“c:\memcached\memcached.exe -h”能够查看全部能使用的参数。
5. 若是要卸载memcached服务,可使用下面的命令:
c:\memcached\memcached.exe -d uninstall
1. 将下载的文件解压到任意目录。
2. 1.4.5以后版本的memcached不能做为Windows服务来运行,必须使用Windows计划任务来运行它。要将memcached配置成当Windows启动时自动运行,在命令行运行下面的命令:
schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
* 注意将路径c:\memcached\memcached.exe替换成你本地的安装路径。
** 除了参数'-m 512'以外,你还可使用其它的参数。经过“c:\memcached\memcached.exe -h”能够查看全部能使用的参数。
3. 经过下面的命令将memcached从Windows计划任务中移除:
schtasks /delete /tn memcached
要在PHP中使用memcached,首先须要安装memcache扩展包:
1. 查看你本地的PHP扩展包目录里是否有php_memcache.dll这个文件,若是没有,从https://pecl.php.net/package/memcache下载(选择windows dll文件),而后复制到PHP扩展包目录里。
2. 在php.ini中添加下面的代码以启用memcache扩展包:
extension=php_memcache.dll
3. 建立下面的php示例代码进行测试:
<?php $memcache = new Memcache; $memcache->connect('localhost', 11211) or die ("Could not connect"); $version = $memcache->getVersion(); echo "Server's version: ".$version."<br/>\n"; $tmp_object = new stdClass; $tmp_object->str_attr = 'test'; $tmp_object->int_attr = 123; $memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server"); echo "Store data in the cache (data will expire in 10 seconds)<br/>\n"; $get_result = $memcache->get('key'); echo "Data from the cache:<br/>\n"; var_dump($get_result); ?>
要在Python中使用memcached,首先须要安装memcached客户端:
1. 执行下面的命令进行memcached客户端的安装。第一个适用于Python 2.x,第二个适用于Python 3.x。
pip install python-memcached pip install python3-memcached
2. 建立下面的python示例代码进行测试:
import memcache mc = memcache.Client(['127.0.0.1:11211'], debug=0) mc.set("some_key", "Some value") value = mc.get("some_key") mc.set("another_key", 3) mc.delete("another_key") mc.set("key", "1") # note that the key used for incr/decr must be a string. mc.incr("key") mc.decr("key")
在Node.js中能够经过memcached包来使用memcache,Github的地址https://github.com/3rd-Eden/memcached。下面是一段示例代码:
var Memcached = require( 'memcached' ); // connect to our memcached server on host 10.211.55.5, port 11211 var memcached = new Memcached( "10.211.55.5:11211" ); memcached.set( "hello", 1, 10000, function( err, result ){ if( err ) console.error( err ); console.dir( result ); memcached.end(); // as we are 100% certain we are not going to use the connection again, we are going to end it }); memcached.get( "hello", function( err, result ){ if( err ) console.error( err ); console.dir( result ); memcached.end(); // as we are 100% certain we are not going to use the connection again, we are going to end it });
更详细的使用方法能够参考Github上的说明。
在Golang中使用memcached
package main import ( "fmt" "github.com/bradfitz/gomemcache/memcache" ) var ( server = "127.0.0.1:11211" ) func main() { //create a handle mc := memcache.New(server) if mc == nil { fmt.Println("memcache New failed") } //set key-value mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")}) //get key's value it, _ := mc.Get("foo") if string(it.Key) == "foo" { fmt.Println("value is ", string(it.Value)) } else { fmt.Println("Get failed") } ///Add a new key-value mc.Add(&memcache.Item{Key: "foo", Value: []byte("bluegogo")}) it, err := mc.Get("foo") if err != nil { fmt.Println("Add failed") } else { if string(it.Key) == "foo" { fmt.Println("Add value is ", string(it.Value)) } else { fmt.Println("Get failed") } } //replace a key's value mc.Replace(&memcache.Item{Key: "foo", Value: []byte("mobike")}) it, err = mc.Get("foo") if err != nil { fmt.Println("Replace failed") } else { if string(it.Key) == "foo" { fmt.Println("Replace value is ", string(it.Value)) } else { fmt.Println("Replace failed") } } //delete an exist key err = mc.Delete("foo") if err != nil { fmt.Println("Delete failed:", err.Error()) } //incrby err = mc.Set(&memcache.Item{Key: "aaa", Value: []byte("1")}) if err != nil { fmt.Println("Set failed :", err.Error()) } it, err = mc.Get("foo") if err != nil { fmt.Println("Get failed ", err.Error()) } else { fmt.Println("src value is:", it.Value) } value, err := mc.Increment("aaa", 7) if err != nil { fmt.Println("Increment failed") } else { fmt.Println("after increment the value is :", value) } //decrby value, err = mc.Decrement("aaa", 4) if err != nil { fmt.Println("Decrement failed", err.Error()) } else { fmt.Println("after decrement the value is ", value) } }
要查看memcached的数据统计,能够经过telnet链接到memcached:
telnet 127.0.0.1 11211
* ip地址后面的数字为memcached运行的端口号
** 在Windows 10中telnet组件默认并无添加,可经过Control Panel > Programs and Features > Turn Windows features on or off来添加。
而后使用stats来查看统计信息。下表列出了stats统计结果中各数据项的含义:
Name | Type | Meaning |
---|---|---|
pid | 32u | Process id of this server process |
uptime | 32u | Number of secs since the server started |
time | 32u | current UNIX time according to the server |
version | string | Version string of this server |
pointer_size | 32 | Default size of pointers on the host OS (generally 32 or 64) |
rusage_user | 32u.32u | Accumulated user time for this process (seconds:microseconds) |
rusage_system | 32u.32u | Accumulated system time for this process (seconds:microseconds) |
curr_items | 32u | Current number of items stored |
total_items | 32u | Total number of items stored since the server started |
bytes | 64u | Current number of bytes used to store items |
curr_connections | 32u | Number of open connections |
total_connections | 32u | Total number of connections opened since the server started running |
connection_structures | 32u | Number of connection structures allocated by the server |
reserved_fds | 32u | Number of misc fds used internally |
cmd_get | 64u | Cumulative number of retrieval reqs |
cmd_set | 64u | Cumulative number of storage reqs |
cmd_flush | 64u | Cumulative number of flush reqs |
cmd_touch | 64u | Cumulative number of touch reqs |
get_hits | 64u | Number of keys that have been requested and found present |
get_misses | 64u | Number of items that have been requested and not found |
delete_misses | 64u | Number of deletions reqs for missing keys |
delete_hits | 64u | Number of deletion reqs resulting in an item being removed. |
incr_misses | 64u | Number of incr reqs against missing keys. |
incr_hits | 64u | Number of successful incr reqs. |
decr_misses | 64u | Number of decr reqs against missing keys. |
decr_hits | 64u | Number of successful decr reqs. |
cas_misses | 64u | Number of CAS reqs against missing keys. |
cas_hits | 64u | Number of successful CAS reqs. |
cas_badval | 64u | Number of CAS reqs for which a key was found, but the CAS value did not match. |
touch_hits | 64u | Numer of keys that have been touched with a new expiration time |
touch_misses | 64u | Numer of items that have been touched and not found |
auth_cmds | 64u | Number of authentication commands handled, success or failure. |
auth_errors | 64u | Number of failed authentications. |
evictions | 64u | Number of valid items removed from cache to free memory for new items |
reclaimed | 64u | Number of times an entry was stored using memory from an expired entry |
bytes_read | 64u | Total number of bytes read by this server from network |
bytes_written | 64u | Total number of bytes sent by this server to network |
limit_maxbytes | 32u | Number of bytes this server is allowed to use for storage. |
threads | 32u | Number of worker threads requested. (see doc/threads.txt) |
conn_yields | 64u | Number of times any connection yielded to another due to hitting the -R limit. |
hash_power_level | 32u | Current size multiplier for hash table |
hash_bytes | 64u | Bytes currently used by hash tables |
hash_is_expanding | bool | Indicates if the hash table is being grown to a new size |
expired_unfetched | 64u | Items pulled from LRU that were never touched by get/incr/append/etc before expiring |
evicted_unfetched | 64u | Items evicted from LRU that were never touched by get/incr/append/etc. |
slab_reassign_running | bool | If a slab page is being moved |
slabs_moved | 64u | Total slab pages moved |
crawler_reclaimed | 64u | Total items freed by LRU Crawler |
lrutail_reflocked | 64u | Times LRU tail was found with active ref. Items moved to head to avoid OOM errors. |
更详细的内容能够查看这里:https://github.com/memcached/memcached/blob/master/doc/protocol.txt
另外,有关Memcached的经常使用命令及使用说明也能够参考这篇文章:http://www.cnblogs.com/jeffwongishandsome/archive/2011/11/06/2238265.html