memcache java开发,Memcache Java 客户端使用

前面我们讲解了memcache的概念及安装,本节我们使用java客户端连接测试,看一下其如何在开发过程中使用。

Memcached Client目前有3种:

1.Memcached Client for Java

项目地址:https://github.com/gwhalin/Memcached-Java-Client/

2.SpyMemcached

项目地址:http://code.google.com/p/spymemcached/

3.XMemcached

项目地址:https://github.com/killme2008/xmemcached

这三种Client一直存在各种争议:

Memcached Client for Java比SpyMemcached更稳定、更早、更广泛;

SpyMemcached 比 Memcached Client for Java更高效;

XMemcached 比 SpyMemcache并发效果更好。

用数据来说话,参考官方性能对比:

Memcached Client for Java: https://github.com/gwhalin/Memcached-Java-Client/wiki/PERFORMANCE

XMemcached: https://github.com/killme2008/xmemcached/blob/master/benchmark/benchmark.html

下面我们以Memcached Client for Java为例演示一下其使用。

1.在maven仓库中添加java-memcached-2.6.2.jar

由于目前java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository。java memcached client的jar包下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads 目前2.6.2版本的java memcached client要依赖slf4j-simple、slf4j-api、commons-pool三个包,依此我们可以为其编辑一个pom文件,将java memcached client的jar包和pom文件一起安装,解决java memcached client对其他jar包的依赖。安装命令:

mvn install:install-file -Dfile=/path/to/java-memcached-release_2.6.2.jar -DpomFile=/path/to/java-memcached-2.6.2.pom

其中java-memcached-2.6.2.pom的内容为:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

4.0.0

com.danga

java-memcached

2.6.2

org.slf4j

slf4j-simple

1.6.2

org.slf4j

slf4j-api

1.6.2

commons-pool

commons-pool

1.5.6

log4j

log4j

1.2.12

2.添加jar到

工程的pom.xml

com.danga

java-memcached

2.6.2

3.实例代码

实体:User.java

package cn.slimsmart.memcache.demo.test;

import java.io.Serializable;

//实体需要序列化

public class User implements Serializable{

private static final long serialVersionUID = 1L;

private String userName;

private String password;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

}客户端工具类:MemCachedManager.java

package cn.slimsmart.memcache.demo.test;

import java.util.Date;

import com.meetup.memcached.MemcachedClient;

import com.meetup.memcached.SockIOPool;

/**

* 客户端工具类

*/

public class MemCachedManager {

// 创建全局的唯一实例

private static MemcachedClient memcachedClient;

private static MemCachedManager memCachedManager = new MemCachedManager();

static {

// 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。这里应该设置为多个不同的服务

String[] servers = { "192.168.100.110:11211", "192.168.100.110:11311", "192.168.100.110:11411" };

// 设置服务器权重

Integer[] weights = { 3, 2, 1 };

// 创建一个Socked连接池实例

SockIOPool sockIOPool = SockIOPool.getInstance();

sockIOPool.setServers(servers);// 设置memcached服务器地址

sockIOPool.setWeights(weights);// 设置每个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.setMaintSleep(30);// 设置主线程睡眠时间,每30秒苏醒一次,维持连接池大小

sockIOPool.initialize();// 初始化连接池

if (memcachedClient == null) {

memcachedClient = new MemcachedClient();

}

// 压缩设置,超过指定大小(单位为K)的数据都会被压缩

memcachedClient.setCompressEnable(true);

memcachedClient.setCompressThreshold(64 * 1024);

}

/**

* 获取唯一实例.

*

* @return

*/

public static MemCachedManager getInstance() {

return memCachedManager;

}

private MemCachedManager() {

}

/**

* 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new

* Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。

* 设置过期时间:设置10分钟后过期,是应该设置date为System.currentTimeInMillis()+10*60*1000

* 还是10*60*1000 服务端是两种方式都兼容的,一个是多少秒后过期,一个是什么时候过期, 但后者因为设置时间是在客户端,

* 存储在服务端,假如两台服务器时间差别很大,就会导致数据的过期时间和我要求的时间点不符合。

*

*/

public static boolean add(String key, Object value, Date expire) {

return memcachedClient.add(key, value, expire);

}

/**

* 根据键获取Memcached内存缓存管理系统中相应的值

*/

public static Object get(String key) {

return memcachedClient.get(key);

}

public boolean replace(String key, Object value) {

return memcachedClient.replace(key, value);

}

public boolean replace(String key, Object value, Date expiry) {

return memcachedClient.replace(key, value, expiry);

}

}测试类:

package cn.slimsmart.memcache.demo.test;

import java.util.Date;

//测试

public class Test {

public static void main(String[] args) {

User user = new User();

user.setUserName("lucy");

user.setPassword("abc123");

MemCachedManager.add("user", user, new Date(1000 * 60));// 向Memcached中添加一个序列化的对象

user = (User) (MemCachedManager.get("user"));

System.err.println("用户名:" + user.getUserName() + ",密码:" + user.getPassword());

}

}运行打印:

用户名:lucy,密码:abc123

关于SpyMemcached的使用添加相应jar

net.spy

spymemcached

2.11.6

具体请参考代码示例:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Shiro可以很方便地与Memcached进行整合,以实现Session的存储和管理。 下面是整合步骤: 1. 首先需要添加Memcached的相关依赖,可以使用Maven来管理依赖,添加以下代码到pom.xml文件中: ```xml <dependency> <groupId>com.whalin</groupId> <artifactId>Memcached-Java-Client</artifactId> <version>3.0.2</version> </dependency> ``` 2. 在Shiro的配置文件(shiro.ini或shiro.yml)中配置Session的管理方式为Memcached,例如: ```ini [main] cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager [session] sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager sessionManager.globalSessionTimeout = 1800000 sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO sessionDAO.activeSessionsCacheName = shiro-activeSessionCache cacheManager = org.apache.shiro.cache.ehcache.EhCacheManager securityManager.cacheManager = $cacheManager # Memcached session # ======================================= sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO sessionDAO.activeSessionsCacheName = shiro-activeSessionCache sessionDAO.sessionIdGenerator = org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator cacheManager = com.whalin.MemCached.MemCachedClientPoolCacheManager cacheManager.poolName = shiroCache cacheManager.servers = 127.0.0.1:11211 securityManager.cacheManager = $cacheManager sessionManager.sessionDAO = $sessionDAO sessionManager.cacheManager = $cacheManager ``` 其中,cacheManager配置使用MemoryConstrainedCacheManager和EhCacheManager,用于缓存Shiro的授权信息和其他缓存数据;sessionDAO配置使用了EnterpriseCacheSessionDAO,用于管理Session的存储和读取;cacheManager配置使用MemCachedClientPoolCacheManager,用于与Memcached进行交互。 3. 在项目启动时,需要创建Memcached客户端并将其注入到cacheManager中,例如: ```java import com.whalin.MemCached.MemCachedClient; import com.whalin.MemCached.SockIOPool; public class MemcachedCacheManager implements CacheManager { private MemCachedClient cache; @Override public <K, V> Cache<K, V> getCache(String name) throws CacheException { return new MemcachedCache<>(name, this.cache); } public void init() { String[] servers = {"127.0.0.1:11211"}; SockIOPool pool = SockIOPool.getInstance("shiroCache"); pool.setServers(servers); pool.initialize(); this.cache = new MemCachedClient("shiroCache"); } public void destroy() { SockIOPool.getInstance("shiroCache").shutDown(); } } ``` 4. 在Web应用中,可以使用DefaultWebSessionManager来管理Session,例如: ```java import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; public class MemcachedSessionManager extends DefaultWebSessionManager { @Override protected void onStart(Session session, SessionContext context) { super.onStart(session, context); // 将Session存储到Memcached中 this.getSessionDAO().create(session); } @Override protected void onStop(Session session, SessionKey key) { super.onStop(session, key); // 从Memcached中删除Session this.getSessionDAO().delete(session); } @Override protected Session retrieveSession(SessionKey sessionKey) throws UnknownSessionException { // 从Memcached中读取Session Session session = this.getSessionDAO().readSession(sessionKey); if (session == null) { throw new UnknownSessionException("Session not found with key: " + sessionKey); } return session; } } ``` 通过以上步骤,就可以将Java Shiro与Memcached整合起来,实现Session的存储和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值