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

后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记的更多相关文章

  1. 后端——框架——容器框架——spring_core——《官网》阅读笔记——初篇

    1.知识体系 spring-core的知识点大概分为以下几个部分 IOC容器 Bean的配置,XML方式和注解方式 Bean的管理,bean的生命周期,bean的作用域等等 与Bean相关联的接口和对 ...

  2. 后端——框架——日志框架——logback——《官网》阅读笔记——第一章节

    第一章节搭建了logback日志框架的环境,演示了Hello World的示例,并详细分析了示例. 搭建日志框架的过程非常简单,只需要在项目的classpath上添加以下三个jar包,logback- ...

  3. memcached 源码阅读笔记

    阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO ...

  4. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(2):SSM+Redis概念理解

    一.SSM+Redis的结构图 在Java互联网中,以Spring+SpringMVC+MyBatis(SSM)作为主流框架,SSM+Redis的结构图如下: 二.下面介绍它们各自承担的功能: 1.S ...

  5. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解

    一.关键字说明: oop:面向对象 aop:面向切面 ioc:控制反转 orm:对象关系映射 pojo:数据库表映射的java实体类 二.常识说明:1.hibernate和mybatis都属于持久层. ...

  6. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(12):XML配置自动扫描包,自动加载*.properties文件

    一.XML和注解组合使用 前几篇的测试案例都是在Java类中配置,现在换一种使用方式,在XML中配置,使Spring IoC容器在启动之后自动去扫描配置的包路径,扫描加载指定路径下的propertie ...

  7. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配

    一.依赖注入的三种方式      在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...

  8. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(11):XML和Annotation装配Bean的混合使用(@ImportResource)

    一.XML和Annotation装配Bean如何合理使用 引入第三方资源包中类的时候,建议使用XML配置,而使用自己编写的Java类的时候,推荐使用Annotation注解配置Bean. 二.关于注解 ...

  9. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(10):通过注解(annotation)装配Bean之(@Configguration、@Component、@Value、@ComponentScan、@Autowired、@Primary、@Qualifier、@Bean)

    一.通过注解(annotation)装配Bean 通过之前的学习,我们已经知道如何使用XML装配Bean,但是更多的时候已经不再推荐使用XML的方式去装配Bean,更多的时候会考虑注解(annotat ...

随机推荐

  1. Java之CheckedException

    先来科普一下 CE 到底是什么吧.Java 要求你必须在函数的类型里面声明它可能抛出的异常.比如,你的函数如果是这样: void foo(string filename) throws FileNot ...

  2. 【MVC+EasyUI实例】对数据网格的增删改查(上)

    前言 此案例是针对之前做的一个小例子的后台框架的修改,从以前的三层框架改为现在的MVC框架,也是做了一次MVC和EasyUI的结合,分为2篇文章来阐述. 界面如下: 点击"添加"按 ...

  3. 纪中10日T1 2300. 【noip普及组第一题】模板题

    2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms  空间限制: 262144 K ...

  4. SP11470 TTM - To the moon[主席树标记永久化]

    SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...

  5. 计蒜客 UCF 2015

    #A.Find the twins # 题意 找出每个序列是否有特定的值 # 题解 坑,原始序列输出的时候每一行最后一个不能有空格 #include<bits/stdc++.h> #def ...

  6. Android_Service的一些零散知识点_1

    service与线程不甚相同,service是Android提供的可供一个允许常驻后台的组件. 可通过StartService()启动Service和BindService()启动Service St ...

  7. CSRF 攻击的应对之道 转载

    CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...

  8. linux安装最新(任意)版本nodejs

    首先在终端中使用命令 uname -a 查看系统版本 uname -a x86_64 是64位的 所以要安装64位对应的nodejs 打开nodejs中文网里的下载 找到64位的文件 点击后就下载了 ...

  9. ASP.NET Identity系列教程-2【Identity入门】

    https://www.cnblogs.com/r01cn/p/5177708.html13 Identity入门 Identity is a new API from Microsoft to ma ...

  10. UVA10791-Minimum Sum LCM(唯一分解定理基本应用)

    原题:https://vjudge.net/problem/UVA-10791 基本思路:1.借助唯一分解定理分解数据.2.求和输出 知识点:1.筛法得素数 2.唯一分解定理模板代码 3.数论分析-唯 ...