【山外笔记-数据库】Memcached教程详解

本文打印版文档下载地址

【山外笔记-数据库】Memcached详解教程-打印版.pdf

一、Memcached数据库概述

1、Memcached简介

(1)Memcached是一个自由开源的,高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表来存储各种格式的数据。

(2)Memcached本质上是一个基于内存的key-value存储系统,用来存储小块的任意数据(字符串、对象)。

(3)Memcached的守护进程(daemon )用C语言编写,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

(4)Memcached是以守护程序(监听)方式运行于一个或者多个服务器中,随时会接受客户端的连接和操作。

(5)Memcached客户端有各种语言的版本,包括java,c,php,.net等等。

(6)Memcached通过在内存中缓存数据和对象来减少读取数据库的次数,提高动态、数据库驱动网站的速度,减轻数据库负载。

(7)Memcached的API兼容大部分流行的开发语言,其中包括Perl、PHP、Python、RubyC#、C/C++、Lua等。

memcached02.png

2、Memcached的特点

(1)协议简单

(2)基于libevent的事件处理

libevent是一个将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一接口的程序库。

(3)内置内存存储方式

  • memcached中保存的数据都存储在memcached内置的内存存储空间中。

  • 由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。

  • 内存容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。

  • memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

(4)分布式memcached互不通信

  • memcached尽管是分布式缓存服务器,但服务器端并没有分布式功能。

  • 各个memcached不会互相通信以共享信息。

memcached01.png

3、Memcached的工作原理:缓存式的Web应用程序架构

(1)在传统的app层和db层之间加入cache层, 每个app服务器都可以绑定一个mc(memcached)。

(2)每次数据的读取都可以从ms(内置分配内存的组件)中取得,如果没有,再从db层读取。

(3)当ms的hash表满了之后,新的插入数据会替代老的数据,更新的策略是LRU(最近最少使用)+ 到期失效策略,失效数据首先被替换,然后再替换到最近未使用的数据。。

(4)当数据要进行更新时,除了要发送update的 sql给db层,同时也要将更新的数据发给,让mc去更新ms中的数据。

4、Memcached的安装

(1)Linux Memcached安装

  • Ubuntu/Debian在线安装

    sudo apt-get install libevent ibevent-dev
    sudo apt-get install memcached
    
  • Redhat/Fedora/Centos在线安装

    yum install libevent libevent-devel
    yum install memcached
    
  • 源代码安装

    wget http://memcached.org/latest                    下载最新版本
    tar -zxvf memcached-1.x.x.tar.gz                    解压源码
    cd memcached-1.x.x                                  进入目录
    ./configure --prefix=/usr/local/memcached           配置
    make && make test                                   编译
    sudo make install                                   安装
    

(2)Windows Memcached安装

在 1.4.5 版本以前 Memcached可以作为一个服务安装,而在 1.4.5 及之后的版本删除了该功能。因此需要采用不同的安装方式。

Memcached安装包下载地址:https://github.com/memcached/memcached/releases

  • Memcached 1.4.5 以前的版本

  • 解压下载的安装包到指定目录。

  • memcached 可以作为一个服务安装,cmd窗口执行

    c:\memcached\memcached.exe -d install
    
  • 启动和关闭 memcached 服务

    c:\memcached\memcached.exe -d start
    c:\memcached\memcached.exe -d stop
    
  • 修改 memcached 的缓存配置项

    c:\memcached\memcached.exe -d runservice -m 512
    
  • 查看memcached 的的帮助信息

    c:\memcached\memcached.exe -h
    
  • 卸载memcached

    c:\memcached\memcached.exe -d uninstall
    
  • Memcached 1.4.5 以后的版本

    • 解压下载的安装包到指定目录。

    • memcached 不能作为服务来运行,需要使用任务计划中来开启一个普通的进程,设置开机自动启动。

      schtasks /create /sc onstart /tn memcached /tr "'c:\memcached\memcached.exe' -m 512"
      
    • 删除 memcached 的任务计划

      schtasks /delete /tn memcached
      
5、Memcached的运行

(1)Linux自动安装 memcached 命令位于 /usr/local/bin/memcached

(2)查看Memcached命令的帮助:memcached -h

  • -d选项:启动一个守护进程;
  • -m选项:分配给Memcached使用的内存数量,单位是MB;
  • -u选项:运行Memcached的用户;
  • -l选项:监听的服务器IP地址,可以有多个地址;
  • -p选项:设置Memcached监听的端口,最好是1024以上的端口;
  • -c选项:最大运行的并发连接数,默认是1024;
  • -P选项:设置保存Memcached的pid文件。

(3)启动Memcached服务

memcached -d -m 64M -u root -l 192.168.0.120 -p 11211 -c 256 -P /tmp/memcached.pid

(4)关闭Memcached服务

ps -ef|grep memcached
kill -9 memcached_pid
6、Memcached的连接

(1)通过 telnet 命令并指定主机ip和端口来连接 Memcached 服务。

(2)语法:telnet HOST PORT

二、Memcached 存储命令

1、Memcached set 命令

(1)Memcached set 命令:用于将 value(数据值) 存储在指定的 key(键) 中。

(2)如果set的key已经存在,该命令可以更新该key所对应的原来的数据,也就是实现更新的作用。

(3)set 命令的基本语法格式:

set key flags exptime bytes [noreply] 
value 

(4)参数说明:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

(4)输出信息:

  • STORED:保存成功后输出。
  • ERROR:在保存失败后输出。
2、Memcached add 命令

(1)Memcached add 命令:用于将 value(数据值) 存储在指定的 key(键) 中。

(2)如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持不变,并且获得响应 NOT_STORED。

(3)add 命令的基本语法格式:

add key flags exptime bytes [noreply]
value

(4)参数说明和输出信息同set命令。

3、Memcached replace 命令

(1)Memcached replace 命令:用于替换已存在的 key(键)value(数据值)

(2)如果 key 不存在,则替换失败,并且获得响应 NOT_STORED

(3)replace 命令的基本语法格式:

replace key flags exptime bytes [noreply]
value

(4)参数说明和输出信息同set命令。

(5) set 、add 、replace 三个命令的区别

  • add命令:用于向 memcache 服务器添加一个要缓存的数据,如果 key 存在则返回 false。

  • replace命令:用于向 memcache 服务器替换一个指定 key 的缓存内容,如果 key 不存在则返回 false。

  • set 命令:用于设置一个指定 key 的缓存内容,是 add 方法和 replace 方法的集合体。

4、Memcached append 命令

(1)Memcached append 命令:用于向已存在 key(键)value(数据值) 后面追加数据(字符串相加) 。

(2)append 命令的基本语法格式:

append key flags exptime bytes [noreply]
value

(3)参数说明同set命令。

(4)输出信息

  • STORED:保存成功后输出。
  • NOT_STORED:该键在 Memcached 上不存在。
  • CLIENT_ERROR:执行错误。
5、Memcached prepend 命令

(1)Memcached prepend 命令用于向已存在 key(键)value(数据值) 前面追加数据 。

(2)prepend 命令的基本语法格式:

prepend key flags exptime bytes [noreply]
value

(3)参数说明同set命令。

(4)输出信息同append命令。

6、Memcached CAS 命令

(1)Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令:用于执行一个"检查并设置"的操作。

  • Memcached CAS命令仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。

  • 检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。

  • 使用 CAS 命令,需要从 Memcached 服务商通过 gets 命令获取令牌(token)。

(2)CAS 命令的基本语法格式:

cas key flags exptime bytes unique_cas_token [noreply]
value

(3)参数说明:

  • unique_cas_token选项:通过 gets 命令获取的一个唯一的64位值。
  • 其他参数说明同set命令。

(4)输出信息:

  • STORED:保存成功后输出。
  • ERROR:保存出错或语法错误。
  • EXISTS:在最后一次取值后另外一个用户也在更新该数据。
  • NOT_FOUND:Memcached 服务上不存在该键值。

三、Memcached查找命令

1、Memcached get 命令

(1)Memcached get 命令:获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。

(2)get 命令的基本语法格式如下:

get key
get key1 key2 key3		#多个 key 使用空格隔开

(3)参数key:键值 key-value 结构中的 key,用于查找缓存值。

2、Memcached gets 命令

(1)Memcached gets 命令获取带有 CAS 令牌存 的 value(数据值) ,如果 key 不存在,则返回空。

(2)gets 命令的基本语法格式如下:

gets key
gets key1 key2 key3		#多个 key 使用空格隔开
3、Memcached delete 命令

(1)Memcached delete 命令:用于删除已存在的 key(键)。

(2)delete 命令的基本语法格式:delete key [noreply]

(3)参数说明:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • noreply(可选): 该参数告知服务器不需要返回数据

(4)输出信息说明:

  • DELETED:删除成功。
  • ERROR:语法错误或删除失败。
  • NOT_FOUND:key 不存在。
4、Memcached incr 命令

(1)Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增操作。

  • incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。

  • 如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR

(2)incr 命令的基本语法格式:incr key increment_value

(3)参数说明:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • increment_value: 增加的数值。

(4)输出信息说明:

  • NOT_FOUND:key 不存在。
  • CLIENT_ERROR:自增值不是对象。
  • ERROR其他错误,如语法错误等。
5、Memcached decr 命令

(1)Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自减操作。

  • decr 命令操作的数据必须是十进制的32位无符号整数。

  • 如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR

(2)decr 命令的基本语法格式:decr key decrement_value

(3)参数说明:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • decrement_value: 减少的数值。

(4)输出信息说明:

  • NOT_FOUND:key 不存在。
  • CLIENT_ERROR:自增值不是对象。
  • ERROR其他错误,如语法错误等。

四、Memcached 统计命令

1、Memcached stats 命令

(1)Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

(2)stats 命令的基本语法格式:stats

stats
STAT pid 1162
STAT uptime 5022
STAT time 1415208270
STAT version 1.4.14
STAT libevent 2.0.19-stable
STAT pointer_size 64
STAT rusage_user 0.096006
STAT rusage_system 0.152009
STAT curr_connections 5
STAT total_connections 6
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 6
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 4
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1
STAT incr_misses 2
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0
STAT auth_errors 0
STAT bytes_read 262
STAT bytes_written 313
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16
STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 1
STAT evicted_unfetched 0
STAT bytes 142
STAT curr_items 2
STAT total_items 6
STAT evictions 0
STAT reclaimed 1
END

(3)状态项说明:

  • pid: memcache服务器进程ID
  • uptime:服务器已运行秒数
  • time:服务器当前Unix时间戳
  • version:memcache版本
  • pointer_size:操作系统指针大小
  • rusage_user:进程累计用户时间
  • rusage_system:进程累计系统时间
  • curr_connections:当前连接数量
  • total_connections:Memcached运行以来连接总数
  • connection_structures:Memcached分配的连接结构数量
  • cmd_get:get命令请求次数
  • cmd_set:set命令请求次数
  • cmd_flush:flush命令请求次数
  • get_hits:get命令命中次数
  • get_misses:get命令未命中次数
  • delete_misses:delete命令未命中次数
  • delete_hits:delete命令命中次数
  • incr_misses:incr命令未命中次数
  • incr_hits:incr命令命中次数
  • decr_misses:decr命令未命中次数
  • decr_hits:decr命令命中次数
  • cas_misses:cas命令未命中次数
  • cas_hits:cas命令命中次数
  • cas_badval:使用擦拭次数
  • auth_cmds:认证命令处理的次数
  • auth_errors:认证失败数目
  • bytes_read:读取总字节数
  • bytes_written:发送总字节数
  • limit_maxbytes:分配的内存总大小(字节)
  • accepting_conns:服务器是否达到过最大连接(0/1)
  • listen_disabled_num:失效的监听数
  • threads:当前线程数
  • conn_yields:连接操作主动放弃数目
  • bytes:当前存储占用的字节数
  • curr_items:当前存储的数据总数
  • total_items:启动以来存储的数据总数
  • evictions:LRU释放的对象数目
  • reclaimed:已过期的数据条目来存储新数据的数目
2、Memcached stats items 命令

(1)Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。

(2)stats items 命令的基本语法格式:stats items

3、Memcached stats slabs 命令

(1)Memcached stats slabs 命令用于显示各个slab的信息,包括chunk的大小、数目、使用情况等。

(2)stats slabs 命令的基本语法格式:stats slabs

4、Memcached stats sizes 命令

(1)Memcached stats sizes 命令:用于显示所有item的大小和个数。

(2)该信息返回两列,第一列是 item 的大小,第二列是 item 的个数。

(3)stats sizes 命令的基本语法格式:stats sizes

5、Memcached flush_all 命令

(1)Memcached flush_all 命令:用于清理缓存中的所有 key=>value(键=>值) 对。

(2)Memcached flush_all 命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。

(3)flush_all 命令的基本语法格式:flush_all [time] [noreply]

五、Memcached 应用

1、Java 连接 Memcached 服务

使用 Java 程序连接 Memcached,需要在 classpath 中添加 Memcached jar 包。

本站 jar 包下载地址:spymemcached-2.10.3.jar

以下程序假定 Memcached 服务的主机为 127.0.0.1,端口为 11211。

import net.spy.memcached.MemcachedClient;
import java.net.*;

public class MemcachedJava {
   public static void main(String[] args) {
      try{
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         System.out.println("Connection to server sucessful.");		// 本地连接 Memcached 服务
         Future fo = mcc.set("mentest", 900, "Free Education");		// 存储数据
         System.out.println("set status:" + fo.get());				// 查看存储状态
         System.out.println("mentest value in cache - " + mcc.get("mentest"));
         fo = mcc.add("mentest", 900, "memcached");					// 添加
         System.out.println("add status:" + fo.get());				// 打印状态
         fo = mcc.add("codingground", 900, "All Free Compilers");	// 添加新key
         System.out.println("add status:" + fo.get());				// 打印状态
         System.out.println("codingground value in cache - " + mcc.get("codingground"));
         fo = mcc.replace("mentest", 900, "Tutorials' Library");	// 添加新的 key
         System.out.println("replace status:" + fo.get());			// 打印状态
         System.out.println("mentest value in cache - " + mcc.get("mentest"));
         fo = mcc.append("mentest", 900, " for All");				// 对存在的key进行数据添加操作
         System.out.println("append status:" + fo.get());			// 打印状态
         System.out.println("mentest value in cache - " + mcc.get("codingground"));
         fo = mcc.prepend("mentest", 900, "Free ");					// 对存在的key进行数据添加操作
         System.out.println("prepend status:" + fo.get());			// 打印状态
         System.out.println("mentest value in cache - " + mcc.get("codingground"));
         CASValue casValue = mcc.gets("mentest");			// 通过 gets 方法获取 CAS token(令牌)
         System.out.println("CAS token - " + casValue);		// 输出 CAS token(令牌) 值
         CASResponse casresp = mcc.cas("mentest", casValue.getCas(), 900, "Tutorials-Library");
         System.out.println("CAS Response - " + casresp);	// 输出 CAS 响应信息
         System.out.println("mentest value in cache - " + mcc.get("mentest"));
         fo = mcc.delete("mentest");							// 对存在的key进行数据添加操作
         System.out.println("delete status:" + fo.get());	// 打印状态
         System.out.println("mentest value in cache - " + mcc.get("codingground"));
         System.out.println("value in cache after increment - " + mcc.incr("number", 111));
         System.out.println("value in cache after decrement - " + mcc.decr("number", 112));
         mcc.shutdown();  											// 关闭连接    
      }catch(Exception ex){
         System.out.println( ex.getMessage() );
      }
   }
}

(1)连接操作:程序中使用 InetSocketAddress 连接 IP 为 127.0.0.1 端口 为 11211 的 memcached 服务。

(2)set 操作:mcc.set("mentest", 900, "Free Education")

(3)add 操作:mcc.add("mentest", 900, "memcached")

(4)replace 操作:mcc.replace("mentest", 900, "Tutorials' Library")

(5)append 操作:append("mentest", 900, " for All")

(6)prepend 操作:mcc.prepend("mentest", 900, "Free ")

(7)CAS 操作:mcc.cas("mentest", casValue.getCas(), 900, "Tutorials-Library")

(8)get 操作:mcc.get("mentest")

(9)gets 操作:mcc.gets("mentest")

(10)delete 操作:mcc.delete("mentest")

(11)Incr/Decr 操作:mcc.incr("number", 111)mcc.decr("number", 112)

2、PHP 连接 Memcached 服务

(1)PHP Memcache 扩展安装

  • 离线安装

    wget http://pecl.php.net/get/memcache-2.2.7.tgz               
    tar -zxvf memcache-2.2.7.tgz
    cd memcache-2.2.7
    /usr/local/php/bin/phpize
    ./configure --with-php-config=/usr/local/php/bin/php-config
    make && make install
    
  • 在线安装

    yum install -y php-memcached
    systemctl start httpd 			//开启apache
    systemctl start memcached 		//开启memcached
    setenforce 0
    

(2)检查安装结果:/usr/local/php/bin/php -m | grep memcache

(3) Memcache类

  • Memcache::add:增加一个条目到缓存服务器
  • Memcache::addServer:向连接池中添加一个memcache服务器
  • Memcache::close:关闭memcache连接
  • Memcache::connect :打开一个memcached服务端连接
  • Memcache::decrement :减小元素的值
  • Memcache::delete :从服务端删除一个元素
  • Memcache::flush :清洗(删除)已经存储的所有的元素
  • Memcache::get :从服务端检回一个元素
  • Memcache::getExtendedStats :缓存服务器池中所有服务器统计信息
  • Memcache::getServerStatus :用于获取一个服务器的在线/离线状态
  • Memcache::getStats :获取服务器统计信息
  • Memcache::getVersion :返回服务器版本信息
  • Memcache::increment:增加一个元素的值
  • Memcache::pconnect:打开一个到服务器的持久化连接
  • Memcache::replace :替换已经存在的元素的值
  • Memcache::set :Store data at the server
  • Memcache::setCompressThreshold :开启大值自动压缩
  • Memcache::setServerParams :运行时修改服务器参数和状态

(4)Memcache 函数:

  • memcache_debug:转换调试输出的开/关

六、参考资料

1、《Memcached 教程-菜鸟教程》

2、《PHP中文手册》

posted @ 2020-04-24 21:04  山外Sundal  阅读(2244)  评论(0编辑  收藏  举报