Tokyo Cabinet是一个高效的DBM, 而Tokyo Tyrant是为Tokyo Cabinet的提供了一个网络结构使得Tokyo Cabinet可以实现Cluster。下面是官网的介绍。
引用
Tokyo Cabinet is a library of routines for managing a database. The database is a simple data file containing records, each is a pair of a key and a value. Every key and value is serial bytes with variable length. Both binary data and character string can be used as a key and a value. There is neither concept of data tables nor data types. Records are organized in hash table, B+ tree, or fixed-length array.
引用
Tokyo Tyrant is a package of network interface to the DBM called Tokyo Cabinet. Though the DBM has high performance, you might bother in case that multiple processes share the same database, or remote processes access the database. Thus, Tokyo Tyrant is provided for concurrent and remote connections to Tokyo Cabinet. It is composed of the server process managing a database and its access library for client applications.
http://1978th.net/tokyocabinet/spex-en.html#installation
http://1978th.net/tokyotyrant/spex.html#installation
因为Tokyo Tyrant是兼容memcached和http协议的,所以我们可以使用memcached client来操作tokyo cabinet。非常方便。 不过今天我在使用spy memcached测试tokyo cabinet的性能时,发现如果保存的value是一个比较大的string时,get出来的value变成乱码。经过调试发现,原来spy memcached在遇到超过compressionThreshold(默认是16384)时会对value进行压缩,但是当get value时压缩的flag却丢掉了。 所以get value并没有对value进行解压缩。 我想这应该是Tokyo Cabinet兼容memcache协议上的问题。 可能还不是完全兼容。 解决这个问题也是可以的就是把compressionThreshold设置大, 但是spy memcached并没有提供方法可以disable压缩/解压。 所以我想换个memcache client lib试试。
我打算试试
memcached client for java。试了下。 可以保存进去,但是却取不到值,看起来比spy memcached还差。
所以打算创建一个新的net.spy.memcached.transcoders.SerializingTranscoder,加上可以设置disableCompress参数即可。
public class MySerializingTranscoder extends BaseSerializingTranscoder implements Transcoder<Object> {
// General flags
static final int SERIALIZED = 1;
static final int COMPRESSED = 2;
// Special flags for specially handled types.
private static final int SPECIAL_MASK = 0xff00;
static final int SPECIAL_BOOLEAN = (1 << 8);
static final int SPECIAL_INT = (2 << 8);
static final int SPECIAL_LONG = (3 << 8);
static final int SPECIAL_DATE = (4 << 8);
static final int SPECIAL_BYTE = (5 << 8);
static final int SPECIAL_FLOAT = (6 << 8);
static final int SPECIAL_DOUBLE = (7 << 8);
static final int SPECIAL_BYTEARRAY = (8 << 8);
[b]private boolean disableCompress;[/b]
private final TranscoderUtils tu = new TranscoderUtils(true);
public boolean isDisableCompress() {
return disableCompress;
}
public void setDisableCompress(boolean disableCompress) {
this.disableCompress = disableCompress;
}/* (non-Javadoc)
* @see net.spy.memcached.Transcoder#decode(net.spy.memcached.CachedData)
*/
public Object decode(CachedData d) {
byte[] data = d.getData();
Object rv = null;
if (!disableCompress){
if ((d.getFlags() & COMPRESSED) != 0) {
data = decompress(d.getData());
}
}
int flags = d.getFlags() & SPECIAL_MASK;
if ((d.getFlags() & SERIALIZED) != 0 && data != null) {
rv = deserialize(data);
} else if (flags != 0 && data != null) {
switch (flags) {
case SPECIAL_BOOLEAN:
rv = Boolean.valueOf(tu.decodeBoolean(data));
break;
case SPECIAL_INT:
rv = new Integer(tu.decodeInt(data));
break;
case SPECIAL_LONG:
rv = new Long(tu.decodeLong(data));
break;
case SPECIAL_DATE:
rv = new Date(tu.decodeLong(data));
break;
case SPECIAL_BYTE:
rv = new Byte(tu.decodeByte(data));
break;
case SPECIAL_FLOAT:
rv = new Float(Float.intBitsToFloat(tu.decodeInt(data)));
break;
case SPECIAL_DOUBLE:
rv = new Double(Double.longBitsToDouble(tu.decodeLong(data)));
break;
case SPECIAL_BYTEARRAY:
rv = data;
break;
default:
getLogger().warn("Undecodeable with flags %x", flags);
}
} else {
rv = decodeString(data);
}
return rv;
}
/* (non-Javadoc)
* @see net.spy.memcached.Transcoder#encode(java.lang.Object)
*/
public CachedData encode(Object o) {
byte[] b = null;
int flags = 0;
if (o instanceof String) {
b = encodeString((String) o);
} else if (o instanceof Long) {
b = tu.encodeLong((Long) o);
flags |= SPECIAL_LONG;
} else if (o instanceof Integer) {
b = tu.encodeInt((Integer) o);
flags |= SPECIAL_INT;
} else if (o instanceof Boolean) {
b = tu.encodeBoolean((Boolean) o);
flags |= SPECIAL_BOOLEAN;
} else if (o instanceof Date) {
b = tu.encodeLong(((Date) o).getTime());
flags |= SPECIAL_DATE;
} else if (o instanceof Byte) {
b = tu.encodeByte((Byte) o);
flags |= SPECIAL_BYTE;
} else if (o instanceof Float) {
b = tu.encodeInt(Float.floatToRawIntBits((Float) o));
flags |= SPECIAL_FLOAT;
} else if (o instanceof Double) {
b = tu.encodeLong(Double.doubleToRawLongBits((Double) o));
flags |= SPECIAL_DOUBLE;
} else if (o instanceof byte[]) {
b = (byte[]) o;
flags |= SPECIAL_BYTEARRAY;
} else {
b = serialize(o);
flags |= SERIALIZED;
}
assert b != null;
if (!disableCompress && b.length > compressionThreshold) {
byte[] compressed = compress(b);
if (compressed.length < b.length) {
getLogger().info("Compressed %s from %d to %d",
o.getClass().getName(), b.length, compressed.length);
b = compressed;
flags |= COMPRESSED;
} else {
getLogger().info(
"Compression increased the size of %s from %d to %d",
o.getClass().getName(), b.length, compressed.length);
}
}
return new CachedData(flags, b);
}
}
分享到:
相关推荐
**Memcached 安装与使用详解** Memcached 是一款高性能的分布式内存缓存系统,用于在Web应用中减轻数据库负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcached 使用简单,可...
标题 "spring调用memcached client for java" 涉及的是如何在Java应用程序中,特别是Spring框架下,集成和使用Memcached作为缓存系统。Memcached是一个高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升...
它的使用通常包括初始化一个MemcachedClient实例,配置服务器节点,然后通过这个客户端对象进行get和set操作来存取数据。 其次,Xmemcached是另一个强大且高效的Java客户端,它支持多线程、NIO和Future模式,提供了...
虽然Memcached易于使用且高效,但在高并发场景下可能会遇到一些问题,如超时(timeout)现象。这可能是由于网络延迟或服务器资源限制等原因造成的。为了提高系统的健壮性和可用性,可以考虑以下几点: 1. **优化...
4. **故障恢复**:当 Memcached 服务端宕机后,Java 客户端可能会遇到连接问题,需要有适当的重试机制。 总之,Memcached 项目为开发者提供了一个高效、易用的缓存解决方案,通过 Java 客户端可以轻松地在 Java ...
Memcache java jar 包 java_memcached-release_2.5.1.jar import com.danga.MemCached.MemCachedClient; import net.spy.memcached.MemcachedClient;
MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211)); // 这里的"localhost"和"11211"是默认的Memcached服务器地址和端口 } catch (IOException e) { e.printStackTrace...
Java 使用 Memcached 演示 Memcached 是一个高性能、分布式的内存对象缓存系统,广泛应用于减轻数据库负载,提高Web应用的响应速度。在Java中,我们可以借助各种客户端库来与Memcached进行交互。本篇文章将深入探讨...
3. 创建Memcached缓存管理器:使用`SimpleCacheManager`并注入`MemcachedClient`。 ```xml ``` 4. 使用注解进行缓存控制:在需要缓存的方法上添加`@Cacheable`、`@CacheEvict`等注解,以决定何时...
memcache spy client,
此外,还可以测试并发操作,确保在高并发场景下,Memcached客户端能正确处理多线程环境中的数据一致性问题。 在实际项目中,可能需要对Memcached进行更复杂的操作,比如批量操作、设置过期时间、删除键值对等。...
MemcachedClient memcachedClient = new MemcachedClient(new InetSocketAddress("localhost", 11211)); // 存储数据 String key = "exampleKey"; String value = "exampleValue"; memcachedClient.set(key, ...
Java使用Memcached是一种...通过以上步骤,你可以在Java项目中成功地使用Memcached作为缓存系统。提供的源码和配置文件应能帮助你快速理解和实践这一过程。记住,优化和调整参数以适应你的特定应用需求是至关重要的。
例如,使用spymemcached,你可以创建一个`MemcachedClient`对象并指定服务器的IP和端口号。 ```java import net.spy.memcached.*; // 创建MemcachedClient实例 MemcachedClient client = new MemcachedClient(new ...
使用`spymemcached`库,首先通过Maven或Gradle添加依赖,然后创建MemcachedClient实例: ```java import net.spy.memcached.MemcachedClient; import net.spy.memcached.AddrUtil; MemcachedClient client = ...
MemcachedClient client = new MemcachedClient( new ConnectionFactoryBuilder().setProtocol(DefaultConnectionFactory.Protocol.BINARY) .build(), AddrUtil.getAddresses("127.0.0.1:11211")); // 假设...
本文主要介绍了如何在Java项目中集成和使用Memcached这一开源工具,涉及到源码级别的操作,如创建`MemcachedClient`,设置、获取和删除缓存项。这些都是实际开发中非常实用的技术点,可以帮助开发者有效地优化应用...
在这个版本的Java Memcached客户端中,它用于记录程序运行过程中的信息,便于调试和问题排查。 4. **slf4j-simple-1.6.1.jar**:SLF4J的简单实现,它提供了一个简单的日志记录机制。当不希望使用复杂的日志框架,...
Java连接Memcached服务器是开发过程中常见的一环,尤其是在构建分布式系统时,利用Memcached作为缓存服务可以显著提升数据访问速度。Memcached是一款高性能、分布式内存对象缓存系统,能够临时存储键值对数据,减轻...
MemcachedClient client = new MemcachedClient(new BinaryConnectionFactory(), AddrUtil.getAddresses("127.0.0.1:11211")); ``` 3. **存储数据** 使用`set`方法将键值对存储到Memcached。 ```java String ...