后端——框架——缓存框架——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
原文地址:https://www.cnblogs.com/rain144576/p/12373482.html