Java操作Memcached
本文复制其他播客,有好的技术文章希望各位大神能告知... 谢谢。
如何使用Java操作Memcached实例:
代码一:
- package com.ghj.packageoftool;
- import java.io.BufferedWriter;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.io.StringWriter;
- import java.lang.management.ManagementFactory;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import com.danga.MemCached.MemCachedClient;
- import com.danga.MemCached.SockIOPool;
- /**
- * Memcached工具类
- *
- * @author GaoHuanjie
- */
- public class MemcachedUtils {
- private static MemCachedClient memCachedClient;
- static {
- /************************************配置Memcached**************************************/
- SockIOPool sockIOPool = SockIOPool.getInstance();
- sockIOPool.setServers(new String[]{"127.0.0.1:11211"});//设置memcached服务器地址
- sockIOPool.setWeights(new Integer[]{3}); //设置每个MemCached服务器权重
- sockIOPool.setFailover(true); //当一个memcached服务器失效的时候是否去连接另一个memcached服务器.
- sockIOPool.setInitConn(10); //初始化时对每个服务器建立的连接数目
- sockIOPool.setMinConn(10); //每个服务器建立最小的连接数
- sockIOPool.setMaxConn(100); //每个服务器建立最大的连接数
- sockIOPool.setMaintSleep(30); //自查线程周期进行工作,其每次休眠时间
- sockIOPool.setNagle(false); //Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。
- sockIOPool.setSocketTO(3000); //Socket阻塞读取数据的超时时间
- sockIOPool.setAliveCheck(true); //设置是否检查memcached服务器是否失效
- sockIOPool.setMaxIdle(1000*30*30); // 设置最大处理时间
- sockIOPool.setSocketConnectTO(0); //连接建立时对超时的控制
- sockIOPool.initialize(); // 初始化连接池
- if (memCachedClient == null){
- memCachedClient = new MemCachedClient();
- memCachedClient.setPrimitiveAsString(true); //是否将基本类型转换为String方法
- }
- }
- private MemcachedUtils() {
- }
- /**
- * 向缓存添加键值对。注意:如果键已经存在,则之前的键对应的值将被替换。
- *
- * @author GaoHuanjie
- */
- public static boolean set(String key, Object value) {
- try {
- return memCachedClient.set(key, value);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:如果键已经存在,则之前的键对应的值将被替换。
- *
- * @author GaoHuanjie
- */
- public static boolean set(String key, Object value, Date expire) {
- try {
- return memCachedClient.set(key, value, expire);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached set方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 向缓存添加键值对。注意:仅当缓存中不存在键时,才会添加成功。
- *
- * @author GaoHuanjie
- */
- public static boolean add(String key, Object value) {
- try {
- if (get(key) != null) {
- MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(new Exception("Memcached内存缓存中已经存在该键值对")));
- return false;
- }else{
- return memCachedClient.add(key, value);
- }
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:仅当缓存中不存在键时,才会添加成功。
- *
- * @author GaoHuanjie
- */
- public static boolean add(String key, Object value, Date expire) {
- try {
- if (get(key) != null) {
- MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(new Exception("Memcached内存缓存中已经存在该键值对")));
- return false;
- }else{
- return memCachedClient.add(key, value, expire);
- }
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached add方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 根据键来替换Memcached内存缓存中已有的对应的值。注意:只有该键存在时,才会替换键相应的值。
- *
- * @author GaoHuanjie
- */
- public static boolean replace(String key, Object newValue) {
- try {
- return memCachedClient.replace(key, newValue);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 根据键来替换Memcached内存缓存中已有的对应的值并设置逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。注意:只有该键存在时,才会替换键相应的值。
- *
- * @author GaoHuanjie
- */
- public static boolean replace(String key, Object newValue, Date expireDate) {
- try {
- return memCachedClient.replace(key, newValue, expireDate);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached replace方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 根据键获取Memcached内存缓存管理系统中相应的值
- *
- * @author GaoHuanjie
- */
- public static Object get(String key) {
- try {
- return memCachedClient.get(key);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached get方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return null;
- }
- }
- /**
- * 根据键删除memcached中的键/值对
- *
- * @author GaoHuanjie
- */
- public static boolean delete(String key) {
- try {
- return memCachedClient.delete(key);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 根据键和逾期时间(例如:new Date(1000*10):十秒后过期)删除 memcached中的键/值对
- *
- * @author GaoHuanjie
- */
- public static boolean delete(String key, Date expireDate) {
- try {
- return memCachedClient.delete(key, expireDate);
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached delete方法报错,key值:" + key + "\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 清理缓存中的所有键/值对
- *
- * @author GaoHuanjie
- */
- public static boolean flashAll() {
- try {
- return memCachedClient.flushAll();
- } catch (Exception e) {
- MemcachedLogUtils.writeLog("Memcached flashAll方法报错\r\n" + exceptionWrite(e));
- return false;
- }
- }
- /**
- * 返回String类型的异常栈信息
- *
- * @author GaoHuanjie
- */
- private static String exceptionWrite(Exception exception) {
- StringWriter stringWriter = new StringWriter();
- PrintWriter printWriter = new PrintWriter(stringWriter);
- exception.printStackTrace(printWriter);
- printWriter.flush();
- return stringWriter.toString();
- }
- /**
- * Memcached日志记录工具
- *
- * @author GaoHuanjie
- */
- private static class MemcachedLogUtils {
- private static FileWriter fileWriter;
- private static BufferedWriter logWrite;
- private final static String PID = ManagementFactory.getRuntimeMXBean().getName();// 通过找到对应的JVM进程获取PID
- /**
- * 初始化Memcached日志写入流
- *
- * @author GaoHuanjie
- */
- static {
- try {
- String osName = System.getProperty("os.name");
- if (osName.contains("Windows")) {
- fileWriter = new FileWriter("D:\\memcached.log", true);
- } else {
- fileWriter = new FileWriter("/usr/local/logs/memcached.log", true);
- }
- logWrite = new BufferedWriter(fileWriter);
- } catch (IOException iOException) {
- iOException.printStackTrace();
- try {
- if (fileWriter != null) {
- fileWriter.close();
- }
- if (logWrite != null) {
- logWrite.close();
- }
- } catch (Exception exception) {
- exception.printStackTrace();
- }
- }
- }
- /**
- * 写入日志信息
- *
- * @author GaoHuanjie
- */
- public static void writeLog(String logContent) {
- try {
- logWrite.write("[" + PID + "] " + "- [" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "]\r\n" + logContent);
- logWrite.newLine();
- logWrite.flush();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
代码二:
- package com.ghj.packageofclient;
- import java.util.Date;
- import junit.framework.TestCase;
- import com.ghj.packageoftool.MemcachedUtils;
- public class Client extends TestCase{
- /**
- * 测试MemcachedUtils类的set方法。
- *
- * @author GaoHuanjie
- */
- public static void testSet1() {
- MemcachedUtils.set("set1Description", "调用MemcachedUtils类的set方法,没有设置键值对的存在时长");
- System.out.println(MemcachedUtils.get("set1Description").toString());
- }
- /**
- * 测试MemcachedUtils类的set方法。
- *
- * @author GaoHuanjie
- */
- public static void testSet2() {
- MemcachedUtils.set("set2Description", "调用MemcachedUtils类的set方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
- System.out.println(MemcachedUtils.get("set2Description").toString());
- }
- /**
- * 测试MemcachedUtils类的add方法。
- *
- * @author GaoHuanjie
- */
- public static void testAdd1() {
- MemcachedUtils.add("add1Description", "调用MemcachedUtils类的add方法,没有设置键值对的存在时长");
- System.out.println(MemcachedUtils.get("add1Description").toString());
- }
- /**
- * 测试MemcachedUtils类的add方法。
- *
- * @author GaoHuanjie
- */
- public static void testAdd2() {
- MemcachedUtils.add("add2Description", "调用MemcachedUtils类的add方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
- System.out.println(MemcachedUtils.get("add2Description").toString());
- }
- /**
- * 测试MemcachedUtils类的replace方法。
- *
- * @author GaoHuanjie
- */
- public static void testReplace1() {
- MemcachedUtils.add("replace1Description", "调用MemcachedUtils类的replace方法,没有设置键值对的存在时长");
- MemcachedUtils.replace("replace1Description", "值改变了!!!");
- System.out.println(MemcachedUtils.get("replace1Description").toString());
- }
- /**
- * 测试MemcachedUtils类的replace方法。
- *
- * @author GaoHuanjie
- */
- public static void testReplace2() {
- MemcachedUtils.add("replace2Description", "调用MemcachedUtils类的replace方法,设置了键值对的存在时长——存在60秒", new Date(1000*60));
- MemcachedUtils.replace("replace2Description", "值改变了!!!", new Date(1000*60));
- System.out.println(MemcachedUtils.get("replace2Description").toString());
- }
- /**
- * 测试MemcachedUtils类的get方法。
- *
- * @author GaoHuanjie
- */
- public static void testGet() {
- MemcachedUtils.add("getDescription", "调用MemcachedUtils类的get方法,没有设置键值对的存在时长");
- System.out.println(MemcachedUtils.get("getDescription").toString());
- }
- /**
- * 测试MemcachedUtils类的delete方法。
- *
- * @author GaoHuanjie
- */
- public static void testDelete1() {
- MemcachedUtils.add("delete1Description", "调用MemcachedUtils类的delete方法,没有设置键值对的逾期时长");
- MemcachedUtils.delete("delete1Description");
- assertEquals(null, MemcachedUtils.get("delete1Description"));
- }
- /**
- * 测试MemcachedUtils类的delete方法。
- *
- * @author GaoHuanjie
- */
- public static void testDelete2() {
- MemcachedUtils.set("delete2Description1", "调用MemcachedUtils类的delete方法,设置键值对的逾期时长", new Date(600*1000));
- MemcachedUtils.delete("delete2Description1", new Date(1000*600));
- assertEquals(null, MemcachedUtils.get("delete2Description1"));
- }
- /**
- * 测试MemcachedUtils类的flashAll方法。
- *
- * @author GaoHuanjie
- */
- public static void testFlashAll() {
- MemcachedUtils.add("flashAllDescription", "调用MemcachedUtils类的delete方法,没有设置键值对的预期时长");
- MemcachedUtils.flashAll();
- assertEquals(null, MemcachedUtils.get("flashAllDescription"));
- }
- }
Java操作Memcached的更多相关文章
- memcached—Java操作Memcached实例
前面博客介绍了如何在Windows操作系统中安装Memcached,总结一下如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; imp ...
- Java操作memcached(一)
Memcached事实上,两次Hash算法 第一次hash算法被用于定位Memcached示例 第二次hash算法是底部HashMap中间hash算法 Hash算法 1.依据余数 ...
- Java操作memcache
[本文出自天外归云的博客园] 准备工作 Java操作memcache需要spymemcache类库的支持,在Eclipse中修改maven项目的pom.xml文件—— 添加仓库: <reposi ...
- Redis基础知识、命令以及java操作Redis
1 nosql的概念 sql:操作(关系型)数据库的标准查询语言 关系型数据库(rdbms):以关系(由行和列组成的二维表)模型为核心数据库,有表的储存系统.(mysql.oracle.sqlserv ...
- Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等
NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...
- Java操作Sqlite数据库-jdbc连接
Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- Java操作Oracle
public class DBCon { // 数据库驱动对象 public static final String DRIVER = "oracle.jdbc.driver.OracleD ...
- JAVA操作ORACLE数据库的存储过程
一.任务提出 JAVA操作oracle11g存储过程实验需要完成以下几个实例: 1.调用没有返回参数的过程(插入记录.更新记录) 2.有返回参数的过程 3.返回列表的过程 4.返回带分页的列表的过程. ...
随机推荐
- 大型服装集团BI决策系统的分析主题模块
一般BI商业智能解决方案都包含财务.销售.客户等分析模块,本文分享的是某大型服装集团通过帆软FineBI建设的BI决策系统.该决策系统主要针对财务.资金.采购.生产.库存.物流.销售.渠道.产品.客户 ...
- Android调试工具之ADB
Android调试工具之ADB 1. 什么是ADB adb的全称为Android Debug Bridge,顾名思义,这个是PC机与Android设备的连接桥.简单的说,就是通过adb ,PC ...
- How Tomcat Works 读书笔记 八 载入器 上
Java的类载入器 详细资料见 http://blog.csdn.net/dlf123321/article/details/39957175 http://blog.csdn.net/dlf1233 ...
- rcp perspective 添加9个视图均匀排列
PageLayout布局方法 pageLayout.addView("NodePMTSStream" + ":1", IPageLayout.TOP, 0.5f ...
- iOS 博客资源精选
摘要:记录一些网上非常牛的人写的博文.收藏起来. 以备日后需要时学习备用. 1:iOS中UIWebView的Javascript与Objective-C通信 http://imchao.net/201 ...
- WEB 集群与负载均衡(一)基本概念-上
Web集群是由多个同时运行同一个web应用的服务器组成,在外界看来就像一个服务器一样,这多台服务器共同来为客户提供更高性能的服务.集群更标准的定义是:一组相互独立的服务器在网络中表现为单一的系统,并以 ...
- Qt与FFmpeg联合开发指南(三)——编码(1):代码流程演示
前两讲演示了基本的解码流程和简单功能封装,今天我们开始学习编码.编码就是封装音视频流的过程,在整个编码教程中,我会首先在一个函数中演示完成的编码流程,再解释其中存在的问题.下一讲我们会将编码功能进行封 ...
- vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)
1.首先需要的原料肯定是vue打包生成的dist文件 在vue项目目录下运行:npm run build,等待运行结束,会在项目目录下生成一个dist文件夹,里面会生成一些文件(如下图示) 小的项目文 ...
- MySQL中遇到的几种报错及其解决方法
MySQL中遇到的几种报错及其解决方法 1.[Err] 1064 - You have an error in your SQL syntax; check the manual that corre ...
- java.lang.SecurityException: Can't make field constructor accessible
原本使用GsonConvertor,在Android版本5.1.1上没有任何问题,结果切换到版本6.0.1上,出现以下所示问题: java.lang.IllegalArgumentException: ...