后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记
Memcached的知识点大致可以分为三个部分。
- 服务器部分:环境搭建。
- 概念:存储的数据类型,指令,内存的替换策略。
- 集成:与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可以是字符串,数字等等。
框架的命令分为两种
- 第一种是对数据的添加,删除,修改,查询等操作。
- 第二种是对服务器的统计指令等操作。
在使用命令时,需要注意,某些命令只支持数字,某些只支持字符串。所以使用之前先查看命令的帮助手册。
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值 |
返回结果 |
返回结果:VALUE,固定字符串 返回结果:key,查询时的key值 返回结果:flags,添加key-value时设置的flags标记。 返回结果:bytes,value的字节数。 返回结果:value,在第二行,为key对应的value值。
第一个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、参考资料
- Git:https://github.com/memcached/memcached/wiki
- 英文学习资料:http://www.runoob.com/memcached/memcached-tutorial.html
- 中文学习资料:https://www.runoob.com/memcached/memcached-cas.html
后端——框架——缓存框架——memcached——《Memcached教程》阅读笔记的更多相关文章
- 后端——框架——容器框架——spring_core——《官网》阅读笔记——初篇
1.知识体系 spring-core的知识点大概分为以下几个部分 IOC容器 Bean的配置,XML方式和注解方式 Bean的管理,bean的生命周期,bean的作用域等等 与Bean相关联的接口和对 ...
- 后端——框架——日志框架——logback——《官网》阅读笔记——第一章节
第一章节搭建了logback日志框架的环境,演示了Hello World的示例,并详细分析了示例. 搭建日志框架的过程非常简单,只需要在项目的classpath上添加以下三个jar包,logback- ...
- memcached 源码阅读笔记
阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(2):SSM+Redis概念理解
一.SSM+Redis的结构图 在Java互联网中,以Spring+SpringMVC+MyBatis(SSM)作为主流框架,SSM+Redis的结构图如下: 二.下面介绍它们各自承担的功能: 1.S ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(1):Mybatis和Hibernate概念理解
一.关键字说明: oop:面向对象 aop:面向切面 ioc:控制反转 orm:对象关系映射 pojo:数据库表映射的java实体类 二.常识说明:1.hibernate和mybatis都属于持久层. ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(12):XML配置自动扫描包,自动加载*.properties文件
一.XML和注解组合使用 前几篇的测试案例都是在Java类中配置,现在换一种使用方式,在XML中配置,使Spring IoC容器在启动之后自动去扫描配置的包路径,扫描加载指定路径下的propertie ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(7):装配SpringBean·依赖注入装配
一.依赖注入的三种方式 在实际环境中实现IoC容器的方式主要分为两大类,一类是依赖查找,依赖查找是通过资源定位,把对应的资源查找回来.另一类则是依赖注入.一般而言,依赖注入可分为3中方式: ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(11):XML和Annotation装配Bean的混合使用(@ImportResource)
一.XML和Annotation装配Bean如何合理使用 引入第三方资源包中类的时候,建议使用XML配置,而使用自己编写的Java类的时候,推荐使用Annotation注解配置Bean. 二.关于注解 ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(10):通过注解(annotation)装配Bean之(@Configguration、@Component、@Value、@ComponentScan、@Autowired、@Primary、@Qualifier、@Bean)
一.通过注解(annotation)装配Bean 通过之前的学习,我们已经知道如何使用XML装配Bean,但是更多的时候已经不再推荐使用XML的方式去装配Bean,更多的时候会考虑注解(annotat ...
随机推荐
- Java之CheckedException
先来科普一下 CE 到底是什么吧.Java 要求你必须在函数的类型里面声明它可能抛出的异常.比如,你的函数如果是这样: void foo(string filename) throws FileNot ...
- 【MVC+EasyUI实例】对数据网格的增删改查(上)
前言 此案例是针对之前做的一个小例子的后台框架的修改,从以前的三层框架改为现在的MVC框架,也是做了一次MVC和EasyUI的结合,分为2篇文章来阐述. 界面如下: 点击"添加"按 ...
- 纪中10日T1 2300. 【noip普及组第一题】模板题
2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms 空间限制: 262144 K ...
- SP11470 TTM - To the moon[主席树标记永久化]
SP11470 TTM - To the moon C l r d:区间 \([L,R]\) 中的数都加 d ,同时当前的时间戳加 1. Q l r:查询当前时间戳区间 \([L,R]\) 中所有数的 ...
- 计蒜客 UCF 2015
#A.Find the twins # 题意 找出每个序列是否有特定的值 # 题解 坑,原始序列输出的时候每一行最后一个不能有空格 #include<bits/stdc++.h> #def ...
- Android_Service的一些零散知识点_1
service与线程不甚相同,service是Android提供的可供一个允许常驻后台的组件. 可通过StartService()启动Service和BindService()启动Service St ...
- CSRF 攻击的应对之道 转载
CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...
- linux安装最新(任意)版本nodejs
首先在终端中使用命令 uname -a 查看系统版本 uname -a x86_64 是64位的 所以要安装64位对应的nodejs 打开nodejs中文网里的下载 找到64位的文件 点击后就下载了 ...
- ASP.NET Identity系列教程-2【Identity入门】
https://www.cnblogs.com/r01cn/p/5177708.html13 Identity入门 Identity is a new API from Microsoft to ma ...
- UVA10791-Minimum Sum LCM(唯一分解定理基本应用)
原题:https://vjudge.net/problem/UVA-10791 基本思路:1.借助唯一分解定理分解数据.2.求和输出 知识点:1.筛法得素数 2.唯一分解定理模板代码 3.数论分析-唯 ...