zoukankan      html  css  js  c++  java
  • 后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记

      Memcached的知识点大致可以分为三个部分。

    1. 服务器部分:环境搭建。
    2. 概念:存储的数据类型,指令,内存的替换策略。
    3. 集成:与Java语言的集成。

    1、搭建环境

    1.1 Linux环境

    在Linux环境下安装memcached和安装tomcat差不多,获取jar包,解压开,运行服务即可。

    参考教程:http://memcached.org/downloads

    1.2 Window环境

      在Window环境下安装memcached主要是为了学习使用,安装完成之后需要配置一些必要的参数,例如内存的大小,测试的时候使用telnet,此时需要开启windows的telnet服务。

      参考教程:https://commaster.net/posts/installing-memcached-windows/

      使用telnet 连接,输入version命令验证是否安装成功。

    2、命令

      框架支持的数据类型只有一种,key-value键值对,其中value可以是字符串,数字等等。

      框架的命令分为两种

    1. 第一种是对数据的添加,删除,修改,查询等操作。
    2. 第二种是对服务器的统计指令等操作。

      在使用命令时,需要注意,某些命令只支持数字,某些只支持字符串。所以使用之前先查看命令的帮助手册。

    2.1   数据指令

    2.1.1  添加

      2.1.1.1   set

    描述

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

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

    格式

    set  key  flags  exptime  bytes  [noreply] 

    value

    参数

    参数:key

    说明:键值 key-value 结构中的 key,用于查找缓存值

    类型:字符串类型

    是否必填:是

    参数:flags

    说明:键值对的整型参数,客户机使用它存储关于键值对的额外信息

    类型:数字

    是否必填:是

    参数:exptime

    说明:键值对在缓存中保存的时间长度,以秒为单位,0表示永远

    类型:数字

    是否必填:是

    参数:bytes

    说明:键值对在缓存中存储的字节数

    类型:数字

    是否必填:是

    注:此值需要与Value值相对应,当该值过大时,会导致之后输入的所有命令都当成Value。当过小时,会出现bad data chunk 错误。

    参数:noreply

          说明: 该参数告知服务器不需要返回数据

          类型:noreply的固定值

          是否必填:否

    参数:value

          说明:键值key-value结构中的value,存储的值

          类型:任意值

          是否必填:是

    注:value参数始终位于第二行

    返回结果

    保存成功时,返回STORED,保存失败时,返回ERROR

      2.1.1.2  add

    描述

    add命令与set命令的作用相同,唯一的区别是如果add的key已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且将获得响应 NOT_STORED。

    格式

    add  key  flags  exptime  bytes  [noreply] 

    value

    参数

    与set参数的含义相同,参考set

    返回结果

    保存成功时,返回STORED,保存失败时,返回NOT STORED

      2.1.1.3 cas

    名称

    cas

    描述

    cas命令用于执行一个“检查并设置”的操作,它仅在当前客户端最后一次取值后,该key值对应的值没有被其他客户端修改的情况下,才能够将值写入。检查是通过cas_token参数进行的,这个参数是memcached指定给已经存在的元素的一个唯一的64位值

    格式

    cas  key  flags  exptime  bytes  unique_cas_token  [noreply] 

    value

    参数:key

    说明:键值 key-value 结构中的 key,用于查找缓存值

    类型:字符串类型

    是否必填:是

    参数

    参数:flags

    说明:键值对的整型参数,客户机使用它存储关于键值对的额外信息

    类型:数字

    是否必填:是

    参数:exptime

    说明:键值对在缓存中保存的时间长度,以秒为单位,0表示永远

    类型:数字

    是否必填:是

    参数:bytes

    说明:键值对在缓存中存储的字节数。

    类型:数字

    是否必填:是

    注:此值需要与Value值相对应,当该值过大时,会导致之后输入的所有命令都当成Value。当过小时,会出现bad data chunk 错误。

    参数:unique_cas_token

          说明:通过gets命令获取的一个唯一的64位值

          类型:字符串和数字都可以,只要唯一就可以

          是否必填:是

    参数:noreply

          说明: 该参数告知服务器不需要返回数据

          类型:noreply的固定值

          是否必填:否

    参数:value

          说明:键值key-value结构中的value,存储的值

          类型:任意值

          是否必填:是

    注:value参数始终位于第二行

    返回结果

    保存成功时,返回STORED,保存失败时,返回NOT STORED

    2.1.2  删除

      2.1.2.1   delete

    描述

    delete 命令用于删除已存在的 key(键)

    格式

    delete key [noreply]

    参数

    参数:key

          说明:键值

          类型:字符串

          是否必填:是

    参数:noreply

          说明: 该参数告知服务器不需要返回数据

          类型:noreply的固定值

          是否必填:否

    返回结果

    删除成功时,返回DELETED,删除失败时,返回EOOR。 key值不存在时,返回NOT FOUND

    2.1.3 修改

      2.1.3.1   replace

    描述

    replace命令用户替换已存在的key(键)的value(数据值),如果key值不存在,则替换失败,并且将获得响应NOT STORED

    格式

    replace  key  flags  exptime  bytes  [noreply] 

    value

    参数

    参数:key

    说明:键值 key-value 结构中的 key,用于查找缓存值

    类型:字符串类型

    是否必填:是

    参数:flags

    说明:键值对的整型参数,客户机使用它存储关于键值对的额外信息

    类型:数字

    是否必填:是

    参数:exptime

    说明:键值对在缓存中保存的时间长度,以秒为单位,0表示永远

    类型:数字

    是否必填:是

    参数:bytes

    说明:键值对在缓存中存储的字节数

    类型:数字

    是否必填:是

    注:此值需要与Value值相对应,当该值过大时,会导致之后输入的所有命令都当成Value。当过小时,会出现bad data chunk 错误。

    参数:noreply

          说明: 该参数告知服务器不需要返回数据

          类型:noreply的固定值

          是否必填:否

    参数:value

          说明:键值key-value结构中的value,存储的值

          类型:任意值

          是否必填:是

    注:value参数始终位于第二行

    返回结果

    保存成功时,返回STORED,保存失败时,返回NOT STORED

      2.1.3.2 append

    描述

    append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据

    格式

    append  key  flags  exptime  bytes  [noreply] 

    value

    参数

    参数:key

    说明:键值 key-value 结构中的 key,用于查找缓存值

    类型:字符串类型

    是否必填:是

    参数:flags

    说明:键值对的整型参数,客户机使用它存储关于键值对的额外信息

    类型:数字

    是否必填:是

    参数:exptime

    说明:键值对在缓存中保存的时间长度,以秒为单位,0表示永远

    类型:数字

    是否必填:是

    参数:bytes

    说明:键值对在缓存中存储的字节数,该值为新增加的字节数,不包含原始数据的字节。

    类型:数字

    是否必填:是

    注:此值需要与Value值相对应,当该值过大时,会导致之后输入的所有命令都当成Value。当过小时,会出现bad data chunk 错误。

    参数:noreply

          说明: 该参数告知服务器不需要返回数据

          类型:noreply的固定值

          是否必填:否

    参数:value

          说明:键值key-value结构中的value,存储的值

          类型:任意值

          是否必填:是

    注:value参数始终位于第二行

    返回结果

    保存成功时,返回STORED,保存失败时,返回NOT STORED

    2.1.3.3   prepend

    描述

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

    格式

    append  key  flags  exptime  bytes  [noreply] 

    value

    参数

    与append参数的含义相同,参考append

    返回结果

    保存成功时,返回STORED,保存失败时,返回NOT STORED,出现错误时,返回ERROR

      2.1.3.4   incr(数字)

    名称

    incr,全称为increment

    描述

    用于对已存在的key(键)的数字值进行自增操作。当value值为数字值时才有意义。

    格式

    incr key increment_value

    参数

    参数:key

          说明:键值

          类型:字符串

          是否必填:是

    参数:increment_value

          说明:增加的数值

          类型:数字

          是否必填:是

    返回结果

    当key值不存在时,返回NOT_FOUND,当自增值不为数字时,返回CLIENT_ERROR,当语法错误时,返回ERROR

      2.1.3.5 decr(数字)

    名称

    decr,全称为decrement

    描述

    用于对已存在的key(键)的数字值进行自减操作。当value值为数字值时才有意义。

    格式

    decr key increment_value

    参数

    参数:key

          说明:键值

          类型:字符串

          是否必填:是

    参数:increment_value

          说明:增加的数值

          类型:数字

          是否必填:是

    返回结果

    当key值不存在时,返回NOT_FOUND,当自增值不为数字时,返回CLIENT_ERROR,当语法错误时,返回ERROR。

      2.1.3  查询

    2.1.3.1   get

    描述

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

    格式

    一个key时:get key

    多个key时:get key key1 key2,其中key,key1和key2使用空格分割。

    参数

    参数:key

          说明:键值

          类型:字符串

          是否必填:至少存在一个key值

    返回结果

    1. 当key值不存在时,返回END
    2. 当为一个key值时,返回结果格式 VALUE key flags bytes value(第二行)

    返回结果:VALUE,固定字符串

    返回结果:key,查询时的key值

    返回结果:flags,添加key-value时设置的flags标记。

    返回结果:bytes,value的字节数。

    返回结果:value,在第二行,为key对应的value值。

    1. 当为多个key时,返回结果为

    第一个key对应的返回结果,(换行)第二个key值对应的返回结果(换行)第N个key对应的返回结果。

    2.1.3.2   gets

    描述

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

    格式

    单个key时:gets key

    多个key时:get key key1 key2,其中key,key1和key2使用空格分割。

    参数

    参数:key

          说明:键值

          类型:字符串

          是否必填:至少存在一个key值

    返回结果

    1、当key值不存在时,返回END

    2、当为一个key值时,返回结果格式 VALUE key flags bytes cas_token value(第二行)

    返回结果:VALUE,固定字符串

    返回结果:key,查询时的key值

    返回结果:flags,添加key-value时设置的flags标记。

    返回结果:bytes,value的字节数。

    返回结果:cas_token,cas令牌(TODO)

    返回结果:value,在第二行,为key对应的value值。

    3、当为多个key时,返回结果为

    第一个key对应的返回结果,(换行)第二个key值对应的返回结果(换行)第N个key对应的返回结果。

    2.2   服务器指令

    2.2.1  统计  

    2.2.1.1   stats

    名称

    stats,全称为status

    描述

    用stats命令来输出memcached的服务信息。

    返回结果

    结果:pid

          说明:父进程的id值

    结果:uptime

          说明:服务器运行的秒数值。

    结果:time

          说明:服务器当前的时间戳。

    结果: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

          说明:gets命令命中次数

    结果:get_misses

          说明:get命令未命中次数

    结果:delete_misses

          说明:delete命令未命中次数

    结果:delete_hits

          说明:delete命令命中次数

    结果:incr_misses

          说明:incr命令未命中次数

    结果:incr_hits

          说明:incr命令命中次数

    结果:cas_misses

          说明:cas命令未命中次数

    结果:cas_hits

          说明:cas命令命中次数

    结果:cas_badval

          说明:使用擦拭次数

    结果:auth_cmds

          说明:认证命令处理的次数

    结果:auth_errors

          说明:认证失败数目

    结果:bytes_read

          说明:读取总字节数

    结果:bytes_written

          说明:发送总字节数

    结果:limit_maxbytes

          说明:分配的内存总大小(字节)

    结果:accepting_conn

          说明:服务器是否达到过最大连接

    结果:listen_disabled_num

          说明:失效的监听数

    结果:threads

          说明:当前线程数

    结果:conn_yields

          说明:连接操作主动放弃数目

    结果:bytes

          说明:当前存储占用的字节数

    结果:curr_items

          说明:当前存储的数据总数

    结果:total_items

          说明:启动以来存储的数据总数

    结果:evictions

          说明:LRU释放的对象数目

    结果:reclaimed

          说明:已过期的数据条目来存储新数据的数目。

    2.2.1.2   stats items

    描述

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

    返回结果

    结果:number

          说明:item的个数

    结果:age

          说明:未设置item的过期时间时,默认的过期时间

    结果:evicted

          说明:从内存中删除的item个数

    结果:evitcted_nonzero

          说明:由于item过期,导致删除的item个数

    结果:evicted_time

          说明:最近一次更新内存的时间

    结果:outofmemory

          说明:发生内存溢出的次数。

    结果:tailrepairs

          说明:slabs的修复次数。内存是1个slabs分为多个page,每个page又包含多个chunk,当page剩余部分不足以存放数据时,会导致内存有一部分浪费,此时修复就是为了合理利用这部分内存

    2.2.1.3   stats sizes

    描述

    stats sizes 命令用于显示所有chunk size的大小和item的个数

    返回结果

    结果:STAT

          说明:字符常量

    结果:第一个数值

          说明:chunk size的大小

    结果:第二个数值

          说明:item的个数

      2.2.1.4   stats slabs

    描述

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

    返回结果

    结果:chunk_size

          说明:每个chunk的大小

    结果:chunk_per_page

          说明:每一页包含多少个chunk

    结果:total_pages

          说明:page的总数

    结果:total_chunks

          说明:chunk的总数

    结果:used_chunk

          说明:已经使用的chunk个数

    结果:free_chunk

          说明:显示是0,未理解含义

    结果:free_chunk_end

          说明:未被使用的chunk个数

    结果:mem_requested

          说明:请求次数

    结果:total_malloced

          说明:总占用的内存字节数,total_pages * chunk_per_page * chunk_size

    结果:XX_hit

          说明:与stats结果中的hit含义相似。

    2.2.2  清空

      2.2.2.1 flush_all

    描述

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

    格式

    flush_all [time] [noreply]

    参数

    参数:time

          说明:用户在特定的时候后执行该操作,单位为秒

          类型:数值

          是否必填:是

    参数:noreply

          说明: 该参数告知服务器不需要返回数据

          类型:noreply的固定值

          是否必填:否

    3、集成

    3.1 Java语言

    /**
     * 
     * @Title: MemcacheUtil.java
     * @Package learn.cache.memcached
     * @Description: Memcached的工具类
     * @author wangRD
     * @date 2020年2月27日 下午2:35:06
     * @version V1.0
     */
    public class MemcacheUtil {
    	// IP地址
    	private static final String IP = "127.0.0.1";
    	// 端口号
    	private static final Integer PORT = 11211;
    	//
    	private static List<MemcachedClient> clients = new ArrayList<MemcachedClient>();
    
    	public static void main(String[] args) throws InterruptedException, ExecutionException {
            set("test"); } /** * * @Title: getClient * @Description: 获取MemcachedClient类 * @return */ public static MemcachedClient getClient() { // Memcached的IP地址 InetSocketAddress address = new InetSocketAddress(IP, PORT); // Memcached的客户端类,通过它调用API,每个API方法都有对应的指令 MemcachedClient client = null; try { if (clients.isEmpty()) { client = new MemcachedClient(address); // 添加到集合中 clients.add(client); } else { client = clients.get(0); } } catch (IOException e) { e.printStackTrace(); } return client; } /** * * @Title: set * @Description: 使用set指令 * @param key * @return * @throws InterruptedException * @throws ExecutionException */ public static Object set(String key) throws InterruptedException, ExecutionException { MemcachedClient client = getClient(); // 存储,第一个参数为key值,第二个值为过期时间,单位为秒,第三个值为value Future<Boolean> future = client.set(key, 900, key + "-value"); // 查看存储状态,是否成功 System.out.println(future.get()); // 查看值 System.out.println(client.get(key)); // 查看存储状态 return client.get(key); } }

    4、参考资料

    1. Git:https://github.com/memcached/memcached/wiki
    2. 英文学习资料:http://www.runoob.com/memcached/memcached-tutorial.html
    3. 中文学习资料:https://www.runoob.com/memcached/memcached-cas.html
  • 相关阅读:
    没有生产管理,只会生产的企业即将被淘汰
    实施一套MES系统需要多少钱?
    MES助力日立电梯提升精细化管理水平
    数据定义
    (CVE-2017-16995)Ubuntu内核提权
    (CVE-2017-7494)Linux Samba远程代码执行
    (CVE-2019-13272)Linux本地提权
    vulnhub 之 dc6
    vulnhub 之 dc 5
    vulnhub 之 dc4
  • 原文地址:https://www.cnblogs.com/rain144576/p/12373482.html
Copyright © 2011-2022 走看看