• 【山外笔记-数据库】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:memcachedmemcached.exe -d install
      
    • 启动和关闭 memcached 服务

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

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

      c:memcachedmemcached.exe -h
      
    • 卸载memcached

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

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

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

        schtasks /create /sc onstart /tn memcached /tr "'c:memcachedmemcached.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中文手册》

  • 相关阅读:
    面试题
    面试题-基础篇(1)
    Windows定时器学习
    C++中类的多态与虚函数的使用
    Win32 SDK 编程开始, 创建窗口, 消息的处理, 消息循环
    线程同步(互斥锁与信号量的作用与区别)
    控制台程序实现暂停功能
    Linux下gcc编译生成动态链接库*.so文件并调用它
    Linux下安装ActiveMQ CPP
    activemq Linux下的编译
  • 原文地址:https://www.cnblogs.com/davidesun/p/12770114.html
Copyright © 2020-2023  润新知