memcached常用语法及java使用方式

Author:SimpleWu

Memcached 存储命令

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

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

  1. set key flags exptime bytes [noreply]
  2. value

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

如果 add 的 key 已经存在,则不会更新数据(过期的 key 会更新),之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。

  1. add key flags exptime bytes [noreply]
  2. value

Memcached replace 命令用于替换已存在的 key(键) 的 value(数据值)。

如果 key 不存在,则替换失败,并且您将获得响应 NOT_STORED。

  1. replace key flags exptime bytes [noreply]
  2. value

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

  1. append key flags exptime bytes [noreply]
  2. value

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

  1. prepend key flags exptime bytes [noreply]
  2. value

Memcached CAS(Check-And-Set 或 Compare-And-Swap) 命令用于执行一个"检查并设置"的操作

它仅在当前客户端最后一次取值后,该key 对应的值没有被其他客户端修改的情况下, 才能够将值写入。

检查是通过cas_token参数进行的, 这个参数是Memcach指定给已经存在的元素的一个唯一的64位值。

  1. cas key flags exptime bytes unique_cas_token [noreply]
  2. value

参数说明如下:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • unique_cas_token通过 gets 命令获取的一个唯一的64位值。
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

Memcached 查找命令

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

  1. get key

多个 key 使用空格隔开

  1. get key1 key2 key3

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

  1. gets key

多个 key 使用空格隔开

  1. gets key1 key2 key3

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

  1. delete key [noreply]

Memcached 统计命令

Memcached stats 命令用于返回统计信息例如 PID(进程号)、版本号、连接数等。

  1. stats

结果:

这里显

  1. stats
  2. STAT pid 1162
  3. STAT uptime 5022
  4. STAT time 1415208270
  5. STAT version 1.4.14
  6. STAT libevent 2.0.19-stable
  7. STAT pointer_size 64
  8. STAT rusage_user 0.096006
  9. STAT rusage_system 0.152009
  10. STAT curr_connections 5
  11. STAT total_connections 6
  12. STAT connection_structures 6
  13. STAT reserved_fds 20
  14. STAT cmd_get 6
  15. STAT cmd_set 4
  16. STAT cmd_flush 0
  17. STAT cmd_touch 0
  18. STAT get_hits 4
  19. STAT get_misses 2
  20. STAT delete_misses 1
  21. STAT delete_hits 1
  22. STAT incr_misses 2
  23. STAT incr_hits 1
  24. STAT decr_misses 0
  25. STAT decr_hits 1
  26. STAT cas_misses 0
  27. STAT cas_hits 0
  28. STAT cas_badval 0
  29. STAT touch_hits 0
  30. STAT touch_misses 0
  31. STAT auth_cmds 0
  32. STAT auth_errors 0
  33. STAT bytes_read 262
  34. STAT bytes_written 313
  35. STAT limit_maxbytes 67108864
  36. STAT accepting_conns 1
  37. STAT listen_disabled_num 0
  38. STAT threads 4
  39. STAT conn_yields 0
  40. STAT hash_power_level 16
  41. STAT hash_bytes 524288
  42. STAT hash_is_expanding 0
  43. STAT expired_unfetched 1
  44. STAT evicted_unfetched 0
  45. STAT bytes 142
  46. STAT curr_items 2
  47. STAT total_items 6
  48. STAT evictions 0
  49. STAT reclaimed 1
  50. END

示了很多状态信息,下边详细解释每个状态项:

  • 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:已过期的数据条目来存储新数据的数目

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

  1. stats items

结果:

  1. stats items
  2. STAT items:1:number 1
  3. STAT items:1:age 7
  4. STAT items:1:evicted 0
  5. STAT items:1:evicted_nonzero 0
  6. STAT items:1:evicted_time 0
  7. STAT items:1:outofmemory 0
  8. STAT items:1:tailrepairs 0
  9. STAT items:1:reclaimed 0
  10. STAT items:1:expired_unfetched 0
  11. STAT items:1:evicted_unfetched 0
  12. END

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

该命令提供了一个可选参数 time,用于在制定的时间后执行清理缓存操作。

  1. flush_all [time] [noreply]

JAVA连接使用Memcached 服务

要使用Java连接memcached服务,一般常见的有两种方式:

  1. 使用Memcached-Java-Client方式(官方提供)
  2. 使用spymemcached方式

两种方式的对比:

Memcached-Java-Client方式,较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。

spymemcached方式,支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。 

项目中加入spymemcached依赖

  1. <!-- spymemcached -->
  2. <dependency>
  3. <groupId>com.google.code.simple-spring-memcached</groupId>
  4. <artifactId>spymemcached</artifactId>
  5. <version>2.8.4</version>
  6. </dependency>

spymemcached操作memcache,连接memcached服务器,并写入数据,检索出数据。

  1. public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
  2. //添加memcached的服务的地址和端口号
  3. InetSocketAddress address = new InetSocketAddress("127.0.0.1", 11211);
  4. //创建memcachedClient客户端连接对象
  5. MemcachedClient client = new MemcachedClient(address);
  6. //存储数据
  7. @SuppressWarnings("rawtypes")
  8. Future future = client.set("SimpleWu", 900, "lovelyWu98k@gmail.com");
  9. //查看存储状态
  10. System.out.println("status:" + future.get());
  11. //输出值
  12. System.out.println("value in cache:" + client.get("SimpleWu"));
  13. //client.delete("hello"); //删除
  14. //client.flushall(); //清除所有数据
  15. client.shutdown(); //关闭连接
  16. }

同样使用Maven来导入Memcached-Java-Client的jar包。

  1. <!-- Memcached-Java-Client -->
  2. <dependency>
  3. <groupId>com.whalin</groupId>
  4. <artifactId>Memcached-Java-Client</artifactId>
  5. <version>3.0.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.slf4j</groupId>
  9. <artifactId>slf4j-simple</artifactId>
  10. <version>1.6.4</version>
  11. </dependency>

使用Memcached-java-client操作memcached服务器。添加数据到memcached,然后检索出数据。

  1. public static void main(String[] args) {
  2. SockIOPool pool = SockIOPool.getInstance(); //创建memcache连接池
  3. String[] addresses = { "127.0.0.1:11211" }; //服务器地址,可以添加多个
  4. Integer[] weights = {3}; //添加权重
  5. pool.setServers(addresses); //服务器地址
  6. pool.setWeights(weights); //权重信息
  7. pool.setInitConn( 5 ); //初始连接数
  8. pool.setMinConn( 5 ); //最小连接数
  9. pool.setMaxConn( 250 ); //最大连接数
  10. pool.setMaxIdle( 1000 * 60 * 60 * 6 ); //最大处理时间。
  11. pool.setMaintSleep( 30 ); // 设置主线程的睡眠时间
  12. pool.setNagle(false); //是否缓冲
  13. pool.setSocketTO(3000); //Socket阻塞读取数据的超时时间
  14. pool.setSocketConnectTO(0); //连接建立时对超时的控制
  15. pool.initialize(); //初始化
  16. MemCachedClient client = new MemCachedClient(); // 使用MemCacheClient
  17. client.add("SimpleWu", "lovelyWu98k@gmail.com"); // 添加
  18. System.out.println(client.get("SimpleWu"));
  19. client.delete("hello"); // 删除
  20. client.flushAll(); // 清空
  21. }

java具体命令使用参考

适用场合

  • 分布式应用。由于memcached本身基于分布式的系统,所以尤其适合大型的分布式系统。
  • 数据库前段缓存。数据库常常是网站系统的瓶颈。数据库的大并发量访问,常常造成网站内存溢出。当然我们也可以使用hibernate的缓存机制。但memcached是基于分布式的,并可独立于网站应用本身,所以更适合大型网站进行应用的拆分。
  • 服务器间数据共享。举例来讲,我们将网站的登录系统、查询系统拆分为两个应用,放在不同的服务器上,并进行集群,那这个时候用户登录后,登录信息如何从登录系统服务器同步到查询系统登录系统将登录信息缓存起来,服务器呢?这时候,我们便可以使用memcached,查询系统便可以获得登录信息,就像获取本地信息一样。

不适用的场合

那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源

Memcached常用语法与java连接服务的更多相关文章

  1. typora中文版官方免费快速下载以及Markdown的一些常用语法、Java知识点

    typora下载 链接:https://某度云盘的域名/s/1geD1APxnyV3gogYW3E08bQ 密码:8fdp 把某度云盘的域名进行替换 1.标题 # 标题1 ## 标题2 ### 标题3 ...

  2. Oracle 左连接(+)加号用法及常用语法之间的关系

    本文目的: 通过分析左连接(+)加号的写法和一些常用语法之间的联系,了解到Oracle 加号(+)的用法 分析步骤: 1.首先创建测试表的结构: create table test_left_a (a ...

  3. JAVA基础语法:java编程规范和常用数据类型(转载)

    JAVA基础语法:java编程规范和常用数据类型 摘要 本文主要介绍了最基本的java程序规则,和常用数据类型,其中侧重说了数组的一些操作. 面向java编程 java是纯面向对象语言,所有的程序都要 ...

  4. 2 hive的使用 + hive的常用语法

    本博文的主要内容有: .hive的常用语法 .内部表 .外部表 .内部表,被drop掉,会发生什么? .外部表,被drop掉,会发生什么? .内部表和外部表的,保存的路径在哪? .用于创建一些临时表存 ...

  5. 【JDBC】Java 连接 MySQL 基本过程以及封装数据库工具类

    一. 常用的JDBC API 1. DriverManager类 : 数据库管理类,用于管理一组JDBC驱动程序的基本服务.应用程序和数据库之间可以通过此类建立连接.常用的静态方法如下 static ...

  6. hive的使用 + hive的常用语法

    本博文的主要内容有: .hive的常用语法 .内部表 .外部表 .内部表,被drop掉,会发生什么? .外部表,被drop掉,会发生什么? .内部表和外部表的,保存的路径在哪? .用于创建一些临时表存 ...

  7. MySQL常用指令,java,php程序员,数据库工程师必备。程序员小冰常用资料整理

    MySQL常用指令,java,php程序员,数据库工程师必备.程序员小冰常用资料整理 MySQL常用指令(备查) 最常用的显示命令: 1.显示数据库列表. show databases; 2.显示库中 ...

  8. Java进阶(二十五)Java连接mysql数据库(底层实现)

    Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...

  9. 【转载】JAVA消息服务JMS规范及原理详解

    转载:https://www.cnblogs.com/molao-doing/articles/6557305.html 作者: moyun- 一.简介 JMS即Java消息服务(Java Messa ...

随机推荐

  1. java伪代码 大道至简第一章

    import.java.大道至简.*; //一·编程的精义 import.java.编程的精义.*; public class BIANCHENGDEJINGYI { if(愚公死了) 愚公的儿子,孙 ...

  2. java实现excel生成和导出

    1.java生成excel 2.java读取excel内容

  3. 推荐前端框架 & 模板

    BootStrap Semantic UI Pure Amazeui(前后端都有,很丰富) amazeui http://tpl.amazeui.org AdminLTE AdminLTE https ...

  4. R大

    知乎链接 https://www.zhihu.com/collection/114506870

  5. box-shadow阴影覆盖问题

    “商品库”栏下方阴影被覆盖,解决方法:给“商品库”盒子加“position:relative”

  6. Flask图书管管理表

    后端的读写 from flask import Flask,render_template,request from flask_sqlalchemy import SQLAlchemy #导入时间模 ...

  7. AIDL通信过程中设置死亡代理

    关于AIDL的使用参考学习: https://blog.csdn.net/u011240877/article/details/72765136 https://blog.csdn.net/iromk ...

  8. The question that comes to mind

    1.在 vue 与小程序中   属性中的小括号是否都可以写表达式 例如: <view checked={{op==1?false:true}}></view>

  9. python小练习,利用dict,做一个简单的登录。

    '''利用字典实现登录'''users=[{'username':'jerry','pwd':'123456'},{'username':'tom','pwd':'1'}] def login(use ...

  10. python 携带cookie获取页面内容

    有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...