当调用xmemcached 客户端
public <T> boolean cas(final String key, final CASOperation<T> operation) throws TimeoutException, InterruptedException, MemcachedException方法时报错:
net.rubyeye.xmemcached.exception.MemcachedException: Null GetsResponse
at net.rubyeye.xmemcached.XMemcachedClient.cas0(XMemcachedClient.java:1639)
at net.rubyeye.xmemcached.XMemcachedClient.cas(XMemcachedClient.java:1674)
at net.rubyeye.xmemcached.XMemcachedClient.cas(XMemcachedClient.java:1767)
at aaa.util.OptimisticUpdateModification.execute(OptimisticUpdateModification.java:33)
at aa.util.CacheWriter.run(CacheWriter.java:36)
at java.lang.Thread.run(Thread.java:619)
BUG 详细描述文章地址:
解决方案,如下:
核心代码: @Override
public <T> T cas(String key, final AbsCASOpt<T> casOpt) {
try {
GetsResponse<T> response = client.gets(key);
T t = casOpt.initValue();
if (casOpt.isInitNewValue()){
t = casOpt.getNewValue(casOpt.initValue());
}
int max = casOpt.isRedoConflicts() ? AbsCASOpt.MAX_TRIES : 1;
if (response == null){
for (int i = 0; i < max; i++) {
if (client.add(key, casOpt.initExp(), t)){
return t;
}else{
try {
return cas(key, casOpt);
} catch (Exception e) {
}
}
}
}else{
XCASOperation<T> operation = new XCASOperation<T>() {
private T lastValue;
@Override
public int getMaxTries() {
return casOpt.isRedoConflicts() ? AbsCASOpt.MAX_TRIES : 0;
}
@Override
public T getNewValue(long currentCAS, T currentValue) {
lastValue = casOpt.getNewValue(currentValue);
return lastValue;
}
@Override
public T getLastValue(){
return this.lastValue;
}
};
boolean casFlag = client.cas(key, operation);
if (casFlag){
return operation.getLastValue();
}
}
throw new UnCaughtException("Couldn't get a CAS in " + max + " attempts.");
} catch (Exception e) {
throw new UnCaughtException(e);
}
}
辅助类:package yangz;
/**
* 缓存原子性操作接口.
*
* @author yangz
* @date 2013-9-3 上午9:55
*/
public abstract class AbsCASOpt<T> {
public static final int MAX_TRIES = 8192;
/**
* 初始值.
*
* @return
*/
public abstract T initValue();
/**
* 初始值过期时间, 0为永不过期.
*
* @return
*/
public int initExp(){
return 0;
}
/**
* 初始化后是否设置新值, 即调用getNewValue(initValue());
*
* @return
*/
public boolean isInitNewValue(){
return true;
}
/**
* 并发冲突时,是否重试。如果不重试,并且冲突时则抛异常。
* @return
*/
public boolean isRedoConflicts(){
return true;
}
/**
* 获取新值.
*
* @param current
* @return
*/
public abstract T getNewValue(T current);
}
辅助类:package yangz;
import net.rubyeye.xmemcached.CASOperation;
/**
* xmemcache 原子性操作.
* @author yangz
* @date 2013-9-3 下午4:50
*/
public interface XCASOperation<T> extends CASOperation<T>{
/**
* 操作成功后的值.
* @return
*/
public T getLastValue();
}
分享到:
相关推荐
**Xmemcached:分布式缓存解决方案** Xmemcached是一款基于Java编写的高性能、高可用性的Memcached客户端库,由Kafka的创始人Jay Kreps开发。它提供了丰富的功能和优秀的性能,使得在Java应用中集成和使用Memcached...
- **`add(String key, int exp, Object value)`**:只有当 key 不存在时,才添加 key-value 对。 - **`replace(String key, int exp, Object value)`**:只有当 key 已存在时,才替换其值。 - **`append(String key,...
3. 错误处理:xmemcached具有健全的错误处理机制,对于网络异常、超时等问题,它会自动重试或抛出异常,帮助开发者快速定位问题。 4. 支持压缩:xmemcached允许用户配置是否启用数据压缩,以减少网络传输的开销,...
**Xmemcached官方中文手册** 是一份非常宝贵的资源,它为开发者提供了全面的关于Xmemcached框架的指导和实例。Xmemcached是一个高性能、轻量级的Java客户端库,专门用于连接和操作Memcached分布式内存缓存系统。这份...
总结,xmemcached 2.4.6作为一个强大的Memcached客户端,为开发者提供了高效、可靠的分布式缓存解决方案。通过合理运用其特性和功能,可以在大型分布式系统中构建出高性能的缓存层,显著提升整体系统的响应速度和...
- **稳定可靠**:xmemcached支持自动故障切换和负载均衡,当连接到的Memcached服务器出现问题时,可以自动切换到其他健康的服务器,保证服务的稳定性。 - **丰富API**:提供了一套完整的Java API,包括基本的存取...
xmemcached-1.2.4的官方源码。 xmemcached XMemcached is a high performance, easy to use blocking multithreaded memcached client in java. It's nio based (using my opensource nio framework :yanf4j), ...
- 在特定情况下(如存储较小的数据时),XMemcached的表现优于Spymemcached,这可以从相关的基准测试中得到验证。 2. **支持完整的协议**: - 完全兼容memcached协议,包括二进制协议,这是从1.4.0版本开始引入的...
在实际应用中,确保正确配置和管理连接池至关重要,因为连接池能够提升并发处理能力,但需要保证数据之间的独立性,或者使用CAS(Check-And-Set)操作来保证操作的原子性。同时,监控JMX指标可以帮助了解系统运行状况...
spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> ${XMemcached_servers} <!-- ...
xmemcached-1.2.6.2
### Xmemcached用户指南知识点详解 #### 一、XMemcached简介 ...无论是对于希望减轻数据库负载的Web应用开发者,还是对于那些寻求高效内存缓存解决方案的专业人士而言,XMemcached都是一个值得考虑的强大工具。
此外,XMemcached还支持更复杂的操作,如批量操作、CAS(Compare and Swap)操作以及异常处理等。对于大型项目,可以通过配置连接池和一致性哈希策略来优化性能和数据分布。 总结,XMemcached作为Java环境下优秀的...
xmemcached.chm帮助文档
总的来说,memcache.spymemcached和xmemcached都是Java开发人员在使用Memcached时的重要工具,它们为Java应用程序提供了高效的缓存解决方案。了解并掌握这些客户端的特性和用法,对于提升应用程序性能和优化系统架构...
测试类包括Xmemcached客户端与memcached client for java两者,可运行比较性能。 XMemcached简介: XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下...
- **自动故障转移**: 当连接到的Memcached服务器出现问题时,Xmemcached能够自动切换到其他健康的服务器,确保服务的连续性。 - **支持持久化**: 可以通过配置实现数据的持久化,防止服务器重启或故障时数据丢失。...
3. 错误处理与异常机制:新版本增强了错误报告和异常处理机制,当与Memcached服务器通信出现问题时,能够更准确地定位问题,提供给开发者更友好的错误信息。 4. 序列化方式扩展:2.4.5版本可能增加了新的序列化器...
虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此并不能够充分发挥Java NIO的性能优势.... xmemcached的项目主页在:http://code.google.com/p/xmemcached/