本文复制其他播客,有好的技术文章希望各位大神能告知... 谢谢。

如何使用Java操作Memcached实例:

代码一:

  1. package com.ghj.packageoftool;
  2.  
  3. import java.io.BufferedWriter;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.io.StringWriter;
  8. import java.lang.management.ManagementFactory;
  9. import java.text.SimpleDateFormat;
  10. import java.util.Date;
  11.  
  12. import com.danga.MemCached.MemCachedClient;
  13. import com.danga.MemCached.SockIOPool;
  14.  
  15. /**
  16. * Memcached工具类
  17. *
  18. * @author GaoHuanjie
  19. */
  20. public class MemcachedUtils {
  21.  
  22. private static MemCachedClient memCachedClient;
  23. static {
  24. /************************************配置Memcached**************************************/
  25. SockIOPool sockIOPool = SockIOPool.getInstance();
  26.  
  27. sockIOPool.setServers(new String[]{"127.0.0.1:11211"});//设置memcached服务器地址
  28. sockIOPool.setWeights(new Integer[]{3}); //设置每个MemCached服务器权重
  29. sockIOPool.setFailover(true); //当一个memcached服务器失效的时候是否去连接另一个memcached服务器.
  30. sockIOPool.setInitConn(10); //初始化时对每个服务器建立的连接数目
  31. sockIOPool.setMinConn(10); //每个服务器建立最小的连接数
  32. sockIOPool.setMaxConn(100); //每个服务器建立最大的连接数
  33. sockIOPool.setMaintSleep(30); //自查线程周期进行工作,其每次休眠时间
  34. sockIOPool.setNagle(false); //Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。
  35. sockIOPool.setSocketTO(3000); //Socket阻塞读取数据的超时时间
  36. sockIOPool.setAliveCheck(true); //设置是否检查memcached服务器是否失效
  37. sockIOPool.setMaxIdle(1000*30*30); // 设置最大处理时间
  38. sockIOPool.setSocketConnectTO(0); //连接建立时对超时的控制
  39.  
  40. sockIOPool.initialize(); // 初始化连接池
  41. if (memCachedClient == null){
  42. memCachedClient = new MemCachedClient();
  43. memCachedClient.setPrimitiveAsString(true); //是否将基本类型转换为String方法
  44. }
  45. }
  46.  
  47. private MemcachedUtils() {
  48. }
  49.  
  50. /**
  51. * 向缓存添加键值对。注意:如果键已经存在,则之前的键对应的值将被替换。
  52. *
  53. * @author GaoHuanjie
  54. */
  55. public static boolean set(String key, Object value) {
  56. try {
  57. return memCachedClient.set(key, value);
  58. } catch (Exception e) {
  59. MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  60. return false;
  61. }
  62. }
  63.  
  64. /**
  65. * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:如果键已经存在,则之前的键对应的值将被替换。
  66. *
  67. * @author GaoHuanjie
  68. */
  69. public static boolean set(String key, Object value, Date expire) {
  70. try {
  71. return memCachedClient.set(key, value, expire);
  72. } catch (Exception e) {
  73. MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  74. return false;
  75. }
  76. }
  77.  
  78. /**
  79. * 向缓存添加键值对。注意:仅当缓存中不存在键时,才会添加成功。
  80. *
  81. * @author GaoHuanjie
  82. */
  83. public static boolean add(String key, Object value) {
  84. try {
  85. if (get(key) != null) {
  86. MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(new Exception("Memcached内存缓存中已经存在该键值对")));
  87. return false;
  88. }else{
  89. return memCachedClient.add(key, value);
  90. }
  91. } catch (Exception e) {
  92. MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  93. return false;
  94. }
  95. }
  96.  
  97. /**
  98. * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:仅当缓存中不存在键时,才会添加成功。
  99. *
  100. * @author GaoHuanjie
  101. */
  102. public static boolean add(String key, Object value, Date expire) {
  103. try {
  104. if (get(key) != null) {
  105. MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(new Exception("Memcached内存缓存中已经存在该键值对")));
  106. return false;
  107. }else{
  108. return memCachedClient.add(key, value, expire);
  109. }
  110. } catch (Exception e) {
  111. MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  112. return false;
  113. }
  114. }
  115.  
  116. /**
  117. * 根据键来替换Memcached内存缓存中已有的对应的值。注意:只有该键存在时,才会替换键相应的值。
  118. *
  119. * @author GaoHuanjie
  120. */
  121. public static boolean replace(String key, Object newValue) {
  122. try {
  123. return memCachedClient.replace(key, newValue);
  124. } catch (Exception e) {
  125. MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  126. return false;
  127. }
  128. }
  129.  
  130. /**
  131. * 根据键来替换Memcached内存缓存中已有的对应的值并设置逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:只有该键存在时,才会替换键相应的值。
  132. *
  133. * @author GaoHuanjie
  134. */
  135. public static boolean replace(String key, Object newValue, Date expireDate) {
  136. try {
  137. return memCachedClient.replace(key, newValue, expireDate);
  138. } catch (Exception e) {
  139. MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  140. return false;
  141. }
  142. }
  143.  
  144. /**
  145. * 根据键获取Memcached内存缓存管理系统中相应的值
  146. *
  147. * @author GaoHuanjie
  148. */
  149. public static Object get(String key) {
  150. try {
  151. return memCachedClient.get(key);
  152. } catch (Exception e) {
  153. MemcachedLogUtils.writeLog("Memcached get方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  154. return null;
  155. }
  156. }
  157.  
  158. /**
  159. * 根据键删除memcached中的键/值对
  160. *
  161. * @author GaoHuanjie
  162. */
  163. public static boolean delete(String key) {
  164. try {
  165. return memCachedClient.delete(key);
  166. } catch (Exception e) {
  167. MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  168. return false;
  169. }
  170. }
  171.  
  172. /**
  173. * 根据键和逾期时间(例如:new Date(1000*10):十秒后过期)删除 memcached中的键/值对
  174. *
  175. * @author GaoHuanjie
  176. */
  177. public static boolean delete(String key, Date expireDate) {
  178. try {
  179. return memCachedClient.delete(key, expireDate);
  180. } catch (Exception e) {
  181. MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
  182. return false;
  183. }
  184. }
  185.  
  186. /**
  187. * 清理缓存中的所有键/值对
  188. *
  189. * @author GaoHuanjie
  190. */
  191. public static boolean flashAll() {
  192. try {
  193. return memCachedClient.flushAll();
  194. } catch (Exception e) {
  195. MemcachedLogUtils.writeLog("Memcached flashAll方法报错\r\n" + exceptionWrite(e));
  196. return false;
  197. }
  198. }
  199.  
  200. /**
  201. * 返回String类型的异常栈信息
  202. *
  203. * @author GaoHuanjie
  204. */
  205. private static String exceptionWrite(Exception exception) {
  206. StringWriter stringWriter = new StringWriter();
  207. PrintWriter printWriter = new PrintWriter(stringWriter);
  208. exception.printStackTrace(printWriter);
  209. printWriter.flush();
  210. return stringWriter.toString();
  211. }
  212.  
  213. /**
  214. * Memcached日志记录工具
  215. *
  216. * @author GaoHuanjie
  217. */
  218. private static class MemcachedLogUtils {
  219.  
  220. private static FileWriter fileWriter;
  221. private static BufferedWriter logWrite;
  222. private final static String PID = ManagementFactory.getRuntimeMXBean().getName();// 通过找到对应的JVM进程获取PID
  223.  
  224. /**
  225. * 初始化Memcached日志写入流
  226. *
  227. * @author GaoHuanjie
  228. */
  229. static {
  230. try {
  231. String osName = System.getProperty("os.name");
  232. if (osName.contains("Windows")) {
  233. fileWriter = new FileWriter("D:\\memcached.log", true);
  234. } else {
  235. fileWriter = new FileWriter("/usr/local/logs/memcached.log", true);
  236. }
  237. logWrite = new BufferedWriter(fileWriter);
  238. } catch (IOException iOException) {
  239. iOException.printStackTrace();
  240. try {
  241. if (fileWriter != null) {
  242. fileWriter.close();
  243. }
  244. if (logWrite != null) {
  245. logWrite.close();
  246. }
  247. } catch (Exception exception) {
  248. exception.printStackTrace();
  249. }
  250. }
  251. }
  252. /**
  253. * 写入日志信息
  254. *
  255. * @author GaoHuanjie
  256. */
  257. public static void writeLog(String logContent) {
  258. try {
  259. logWrite.write("[" + PID + "] " + "- [" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "]\r\n" + logContent);
  260. logWrite.newLine();
  261. logWrite.flush();
  262. } catch (IOException e) {
  263. e.printStackTrace();
  264. }
  265. }
  266. }
  267. }

代码二:

  1. package com.ghj.packageofclient;
  2.  
  3. import java.util.Date;
  4.  
  5. import junit.framework.TestCase;
  6.  
  7. import com.ghj.packageoftool.MemcachedUtils;
  8.  
  9. public class Client extends TestCase{
  10.  
  11. /**
  12. * 测试MemcachedUtils类的set方法。
  13. *
  14. * @author GaoHuanjie
  15. */
  16. public static void testSet1() {
  17. MemcachedUtils.set("set1Description", "调用MemcachedUtils类的set方法,没有设置键值对的存在时长");
  18. System.out.println(MemcachedUtils.get("set1Description").toString());
  19. }
  20.  
  21. /**
  22. * 测试MemcachedUtils类的set方法。
  23. *
  24. * @author GaoHuanjie
  25. */
  26. public static void testSet2() {
  27. MemcachedUtils.set("set2Description", "调用MemcachedUtils类的set方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
  28. System.out.println(MemcachedUtils.get("set2Description").toString());
  29. }
  30.  
  31. /**
  32. * 测试MemcachedUtils类的add方法。
  33. *
  34. * @author GaoHuanjie
  35. */
  36. public static void testAdd1() {
  37. MemcachedUtils.add("add1Description", "调用MemcachedUtils类的add方法,没有设置键值对的存在时长");
  38. System.out.println(MemcachedUtils.get("add1Description").toString());
  39. }
  40.  
  41. /**
  42. * 测试MemcachedUtils类的add方法。
  43. *
  44. * @author GaoHuanjie
  45. */
  46. public static void testAdd2() {
  47. MemcachedUtils.add("add2Description", "调用MemcachedUtils类的add方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
  48. System.out.println(MemcachedUtils.get("add2Description").toString());
  49. }
  50.  
  51. /**
  52. * 测试MemcachedUtils类的replace方法。
  53. *
  54. * @author GaoHuanjie
  55. */
  56. public static void testReplace1() {
  57. MemcachedUtils.add("replace1Description", "调用MemcachedUtils类的replace方法,没有设置键值对的存在时长");
  58. MemcachedUtils.replace("replace1Description", "值改变了!!!");
  59. System.out.println(MemcachedUtils.get("replace1Description").toString());
  60. }
  61.  
  62. /**
  63. * 测试MemcachedUtils类的replace方法。
  64. *
  65. * @author GaoHuanjie
  66. */
  67. public static void testReplace2() {
  68. MemcachedUtils.add("replace2Description", "调用MemcachedUtils类的replace方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
  69. MemcachedUtils.replace("replace2Description", "值改变了!!!", new Date(1000*60));
  70. System.out.println(MemcachedUtils.get("replace2Description").toString());
  71. }
  72.  
  73. /**
  74. * 测试MemcachedUtils类的get方法。
  75. *
  76. * @author GaoHuanjie
  77. */
  78. public static void testGet() {
  79. MemcachedUtils.add("getDescription", "调用MemcachedUtils类的get方法,没有设置键值对的存在时长");
  80. System.out.println(MemcachedUtils.get("getDescription").toString());
  81. }
  82.  
  83. /**
  84. * 测试MemcachedUtils类的delete方法。
  85. *
  86. * @author GaoHuanjie
  87. */
  88. public static void testDelete1() {
  89. MemcachedUtils.add("delete1Description", "调用MemcachedUtils类的delete方法,没有设置键值对的逾期时长");
  90. MemcachedUtils.delete("delete1Description");
  91. assertEquals(null, MemcachedUtils.get("delete1Description"));
  92. }
  93.  
  94. /**
  95. * 测试MemcachedUtils类的delete方法。
  96. *
  97. * @author GaoHuanjie
  98. */
  99. public static void testDelete2() {
  100. MemcachedUtils.set("delete2Description1", "调用MemcachedUtils类的delete方法,设置键值对的逾期时长", new Date(600*1000));
  101. MemcachedUtils.delete("delete2Description1", new Date(1000*600));
  102. assertEquals(null, MemcachedUtils.get("delete2Description1"));
  103. }
  104.  
  105. /**
  106. * 测试MemcachedUtils类的flashAll方法。
  107. *
  108. * @author GaoHuanjie
  109. */
  110. public static void testFlashAll() {
  111. MemcachedUtils.add("flashAllDescription", "调用MemcachedUtils类的delete方法,没有设置键值对的预期时长");
  112. MemcachedUtils.flashAll();
  113. assertEquals(null, MemcachedUtils.get("flashAllDescription"));
  114. }
  115. }

Java操作Memcached的更多相关文章

  1. memcached—Java操作Memcached实例

    前面博客介绍了如何在Windows操作系统中安装Memcached,总结一下如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; imp ...

  2. Java操作memcached(一)

    Memcached事实上,两次Hash算法    第一次hash算法被用于定位Memcached示例    第二次hash算法是底部HashMap中间hash算法 Hash算法      1.依据余数 ...

  3. Java操作memcache

    [本文出自天外归云的博客园] 准备工作 Java操作memcache需要spymemcache类库的支持,在Eclipse中修改maven项目的pom.xml文件—— 添加仓库: <reposi ...

  4. Redis基础知识、命令以及java操作Redis

    1 nosql的概念 sql:操作(关系型)数据库的标准查询语言 关系型数据库(rdbms):以关系(由行和列组成的二维表)模型为核心数据库,有表的储存系统.(mysql.oracle.sqlserv ...

  5. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  6. Java操作Sqlite数据库-jdbc连接

    Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...

  7. 【MongoDB for Java】Java操作MongoDB

    上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...

  8. Java操作Oracle

    public class DBCon { // 数据库驱动对象 public static final String DRIVER = "oracle.jdbc.driver.OracleD ...

  9. JAVA操作ORACLE数据库的存储过程

    一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...

随机推荐

  1. 大型服装集团BI决策系统的分析主题模块

    一般BI商业智能解决方案都包含财务.销售.客户等分析模块,本文分享的是某大型服装集团通过帆软FineBI建设的BI决策系统.该决策系统主要针对财务.资金.采购.生产.库存.物流.销售.渠道.产品.客户 ...

  2. Android调试工具之ADB

    Android调试工具之ADB 1.     什么是ADB adb的全称为Android Debug Bridge,顾名思义,这个是PC机与Android设备的连接桥.简单的说,就是通过adb ,PC ...

  3. How Tomcat Works 读书笔记 八 载入器 上

    Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...

  4. rcp perspective 添加9个视图均匀排列

    PageLayout布局方法 pageLayout.addView("NodePMTSStream" + ":1", IPageLayout.TOP, 0.5f ...

  5. iOS 博客资源精选

    摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...

  6. WEB 集群与负载均衡(一)基本概念-上

    Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以 ...

  7. Qt与FFmpeg联合开发指南(三)——编码(1):代码流程演示

    前两讲演示了基本的解码流程和简单功能封装,今天我们开始学习编码.编码就是封装音视频流的过程,在整个编码教程中,我会首先在一个函数中演示完成的编码流程,再解释其中存在的问题.下一讲我们会将编码功能进行封 ...

  8. vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)

    1.首先需要的原料肯定是vue打包生成的dist文件 在vue项目目录下运行:npm run build,等待运行结束,会在项目目录下生成一个dist文件夹,里面会生成一些文件(如下图示) 小的项目文 ...

  9. MySQL中遇到的几种报错及其解决方法

    MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...

  10. java.lang.SecurityException: Can't make field constructor accessible

    原本使用GsonConvertor,在Android版本5.1.1上没有任何问题,结果切换到版本6.0.1上,出现以下所示问题: java.lang.IllegalArgumentException: ...