知识点
相关文章
更多最近更新
更多java操作Memcached
2019-03-25 21:27|来源: 网络
1.memcached client for java客户端API:memcached client for java
网址:http://www.whalin.com/memcached
最新版本:java_memcached-release_2.0.1
操作示例:
import com.danga.MemCached.*;
import org.apache.log4j.*;
public class TestMemcached {
public static void main(String[] args) {
/*初始化SockIOPool,管理memcached的连接池*/
String[] servers = { "192.168.1.20:12111" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
/*建立MemcachedClient实例*/
MemCachedClient memCachedClient = new MemCachedClient();
for (int i = 0; i < 10; i++) {
/*将对象加入到memcached缓存*/
boolean success = memCachedClient.set("" + i, "Hello!");
/*从memcached缓存中按key值取对象*/
String result = (String) memCachedClient.get("" + i);
System.out.println(String.format("set( %d ): %s", i, success));
System.out.println(String.format("get( %d ): %s", i, result));
}
}
}
2.spymemcached客户端API:spymemcached client
网址:http://code.google.com/p/spymemcached/
最新版本:memcached-2.1.jar
操作示例:
用spymemcached将对象存入缓存
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MClient {
public static void main(String[] args){
try{
/*建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号*/
MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.1.20", 12111));
Future<Boolean> b = null;
/*将key值,过期时间(秒)和要缓存的对象set到memcached中*/
b = mc.set("neea:testDaF:ksIdno", 900, "someObject");
if(b.get().booleanValue()==true){
mc.shutdown();
}
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
用spymemcached从缓存中取得对象
import java.net.InetSocketAddress;
import java.util.concurrent.Future;
import net.spy.memcached.MemcachedClient;
public class MClient {
public static void main(String[] args){
try{
/*建立MemcachedClient 实例,并指定memcached服务的IP地址和端口号*/
MemcachedClient mc = new MemcachedClient(new InetSocketAddress("192.168.1.20", 12111));
/*按照key值从memcached中查找缓存,不存在则返回null */
Object b = mc.get("neea:testDaF:ksIdno ");
mc.shutdown();
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
3.两种API比较
memcached client for java:较早推出的memcached JAVA客户端API,应用广泛,运行比较稳定。
spymemcached:A simple, asynchronous, single-threaded memcached client written in java. 支持异步,单线程的memcached客户端,用到了java1.5版本的concurrent和nio,存取速度会高于前者,但是稳定性不好,测试中常报timeOut等相关异常。
由于memcached client for java发布了新版本,性能上有所提高,并且运行稳定,所以建议使用memcached client for java。
以上是转自:http://lveyo.iteye.com/blog/240146
以下是转自:http://leeqianjun.iteye.com/blog/264010
建立Manager类
package com.alisoft.sme.memcached;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemCachedManager {
// 创建全局的唯一实例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCachedManager memCachedManager = new MemCachedManager();
// 设置与缓存服务器的连接池
static {
// 服务器列表和其权重
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
// 获取socke连接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers(servers);
pool.setWeights(weights);
// 设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6);
// 设置主线程的睡眠时间
pool.setMaintSleep(30);
// 设置TCP的参数,连接超时等
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setSocketConnectTO(0);
// 初始化连接池
pool.initialize();
// 压缩设置,超过指定大小(单位为K)的数据都会被压缩
mcc.setCompressEnable(true);
mcc.setCompressThreshold(64 * 1024);
}
/**
* 保护型构造方法,不允许实例化!
*
*/
protected MemCachedManager() {
}
/**
* 获取唯一实例.
*
* @return
*/
public static MemCachedManager getInstance() {
return memCachedManager;
}
/**
* 添加一个指定的值到缓存中.
*
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value) {
return mcc.add(key, value);
}
public boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
public boolean replace(String key, Object value) {
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
}
/**
* 根据指定的关键字获取对象.
*
* @param key
* @return
*/
public Object get(String key) {
return mcc.get(key);
}
public static void main(String[] args) {
MemCachedManager cache = MemCachedManager.getInstance();
cache.add("hello", 234);
System.out.print("get value : " + cache.get("hello"));
}
}
package com.alisoft.sme.memcached;
import java.util.Date;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
public class MemCachedManager {
// 创建全局的唯一实例
protected static MemCachedClient mcc = new MemCachedClient();
protected static MemCachedManager memCachedManager = new MemCachedManager();
// 设置与缓存服务器的连接池
static {
// 服务器列表和其权重
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
// 获取socke连接池的实例对象
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers(servers);
pool.setWeights(weights);
// 设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6);
// 设置主线程的睡眠时间
pool.setMaintSleep(30);
// 设置TCP的参数,连接超时等
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setSocketConnectTO(0);
// 初始化连接池
pool.initialize();
// 压缩设置,超过指定大小(单位为K)的数据都会被压缩
mcc.setCompressEnable(true);
mcc.setCompressThreshold(64 * 1024);
}
/**
* 保护型构造方法,不允许实例化!
*
*/
protected MemCachedManager() {
}
/**
* 获取唯一实例.
*
* @return
*/
public static MemCachedManager getInstance() {
return memCachedManager;
}
/**
* 添加一个指定的值到缓存中.
*
* @param key
* @param value
* @return
*/
public boolean add(String key, Object value) {
return mcc.add(key, value);
}
public boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
public boolean replace(String key, Object value) {
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
}
/**
* 根据指定的关键字获取对象.
*
* @param key
* @return
*/
public Object get(String key) {
return mcc.get(key);
}
public static void main(String[] args) {
MemCachedManager cache = MemCachedManager.getInstance();
cache.add("hello", 234);
System.out.print("get value : " + cache.get("hello"));
}
}
建立数据对象
package com.alisoft.sme.memcached;
import java.io.Serializable;
public class TBean implements Serializable {
private static final long serialVersionUID = 1945562032261336919L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<pre class="java" name="code"> </pre>
package com.alisoft.sme.memcached;
import java.io.Serializable;
public class TBean implements Serializable {
private static final long serialVersionUID = 1945562032261336919L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<pre class="java" name="code"> </pre>
创建测试用例
package com.alisoft.sme.memcached.test;
import junit.framework.TestCase;
import org.junit.Test;
import com.alisoft.sme.memcached.MemCachedManager;
import com.alisoft.sme.memcached.TBean;
public class TestMemcached extends TestCase {
private static MemCachedManager cache;
@Test
public void testCache() {
TBean tb = new TBean();
tb.setName("E网打进");
cache.add("bean", tb);
TBean tb1 = (TBean) cache.get("bean");
System.out.println("name=" + tb1.getName());
tb1.setName("E网打进_修改的");
tb1 = (TBean) cache.get("bean");
System.out.println("name=" + tb1.getName());
}
@Override
protected void setUp() throws Exception {
super.setUp();
cache = MemCachedManager.getInstance();
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
cache = null;
}
}
测试结果
[INFO] ++++ serializing for key: bean for class: com.alisoft.sme.memcached.TBean
[INFO] ++++ memcache cmd (result code): add bean 8 0 93 (NOT_STORED)
[INFO] ++++ data not stored in cache for key: bean
[INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean
name=E网打进
[INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean
name=E网打进
[INFO] ++++ serializing for key: bean for class: com.alisoft.sme.memcached.TBean
[INFO] ++++ memcache cmd (result code): add bean 8 0 93 (NOT_STORED)
[INFO] ++++ data not stored in cache for key: bean
[INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean
name=E网打进
[INFO] ++++ deserializing class com.alisoft.sme.memcached.TBean
name=E网打进
本文链接:java操作Memcached
相关问答
更多-
memcached java客户端下载地址??[2021-11-27]
https://github.com/gwhalin/Memcached-Java-Client/downloads 这里不是有下么?最新版的 -
此外,我还讨论过较为常见的基于 服务器的 数据存储,比如 MongoDB 和 CouchDB。每个数据存储都有其优势和劣势,特别是当应用于特定领域时。 本期的 Java 开发 2.0 关注的是 Redis,一种轻量级 键值对数据存储。多数 NoSQL 实现本质上都是键值对,但是 Redis 支持非常丰富的值集,其中包括 字符串、列表、集以及散列。因此,Redis 通常被称为 数据结构服务器。Redis 也以异常快速而闻名,这使得它成为某一特定 类型使用案例的最优选择。 当我们想要了解一种 新事物时,将其同熟 ...
-
这里就不再逐个讨论了,我将会在一个实际应用程序开发场景中介绍其中的一些。使用Redis 作为一个缓存解决方案 我之前提到过,Redis 可轻易地用作一个缓存解决方案,碰巧我现在正好需要这样一个!在该应用程序示例中,我将 Redis 集成到我基于定位的移动 Web 服务中,称之为 Magnus。 如果您没有关注本系列,那么我会先使用 Play 框架实现 Magnus,从那时起我就已经在各种实现中开发和重构它了。Magnus 是一个简单服务,可以通过 HTTP PUT 请求使用 JSON 文档。这些文档描述了特 ...
-
Java怎么使用memcached和redis实现缓存[2023-09-20]
首先get(key),如果获取不到缓存,则查询数据库后把结果放入缓存,再次取就行了 Object obj = MemUtil.get(key); if(key == null){ //查询数据库,返回结果B MemUtil.set(key,B); }else{ //正常操作 } -
Memcached有什么介绍?[2022-07-07]
Memcached就是在内存中维护一张巨大的hash表,通过自己的一套算法来维 护数据的操作,这个算法比较复杂,这里我们只做简单的介绍,对我们PHP程序员而言,重点掌握如何在项目如何使 Memcached技术. 本章节要求同学们深刻理解Memcached运行原理,并能够正确使用Memcached对网站优化提速。 -
作为spymemcached的作者,我有点偏见,但我会说这是我的原因如下: 从头开始设计为无阻塞无处不在。 当你要求数据,发出一个集合等等时,有一个小的并发队列插入,你会得到一个未来来阻止结果(有一些方便的常见情况,比如get)。 积极优化 您可以在我的优化页面上阅读更多内容,但我做了整个应用程序优化。 我仍然在微基准测试中做得很好,但是要与其他客户端进行比较,您必须设法实现不切实际的使用模式(例如,等待每个设置操作的响应或构建锁周围的响应,以防止数据包优化)。 痴迷地测试 我保留了一个非常严格的测试套件, ...
-
这是不可能的, 这是解释原因: 没有.memcached不支持它,它不是一个计划的功能。 这将是一个相对缓慢和阻塞的操作...... UPDATE 常见问题如何列出所有密钥? 使用memcached,您无法列出所有密钥。 有一个调试接口,但这不是一个明智的用法。 It's not possible, here's the explanation why: No. memcached doesn't support that and it's not a planned feature. It would b ...
-
它在文本协议中不受支持,因为它表达非常非常复杂,没有客户端会支持它,并且它提供的功能很少,你不能从文本协议中做到这一点。 它在二进制协议中得到支持,因为它是二进制操作的一个简单用例。 spymemcached隐式支持它 - 只需做一堆集并且魔术发生: http://dustin.github.com/2009/09/23/spymemcached-optimizations.html It's not supported in the text protocol because it'd be very, ...
-
在Java中存储和检索来自Memcached的协议缓冲区数据(Store and retrieve protocol buffer data from Memcached in Java)[2022-01-23]
我想到了。 我简单地将从MemcachedCleint获得的数据类型化为byte[] ,并将其作为我的Protobuf对象的pasreFrom方法的输入。 I figured it out. I simply typecasted the data I get from MemcachedCleint to byte[] and gave it as input to the pasreFrom method of my Protobuf object. -
将memcached与Java和ScheduledFuture对象一起使用(Using memcached with Java and ScheduledFuture objects)[2021-12-25]
垃圾收集器不能“太慢”并且内存不足。 在抛出OutOfMemoryError之前,垃圾回收器保证运行。 只有当它无法释放足够的内存时才会抛出错误。 您应该使用分析器来查看是否有内存泄漏,或者您是否只是挂在太多对象上。 之后,您可能需要调整GC以提高性能,例如,请参见: GC调整 The garbage collector can't be "too slow" and run out of memory. Before throwing an OutOfMemoryError, the garbage co ...