我正在开发一个包含以下语言编写的组件的系统:
这些组件都使用(不经常更改)来自同一来源的数据,并且出于性能原因可以从内存缓存中缓存和加入这些数据。
因为不同的语言API可能会以不同的方式存储不同的数据类型到memcache,我想知道将所有数据存储为字符串是否更好(对象将存储为JSON字符串)。
然而,这本身可能会带来问题,因为字符串(几乎肯定会)在不同的语言中有不同的内部表示,所以我想知道这个决定是多么明智。
顺便说一下,我使用的是1作者,多个读者模式'所以并发不是问题。
任何人(最好有ACTUAL经验做类似的事情)都可以建议在memcache中存储数据的最佳格式/方式,以便它可以被不同的编程语言使用吗?
答案 0 :(得分:3)
memcached我认为主要只理解byte []并且所有语言中byte的表示都是相同的。您可以使用protocol buffers或类似的库序列化对象,并以任何其他语言使用它。我在我的项目中做到了这一点。
答案 1 :(得分:1)
无论选择哪个后端,(memcached,mongodb,redis,mysql,运营商鸽子),在其中存储数据的最快速的方式是一个简单的数据块(所以后端没有知识) 。)string
,byte[]
,BLOB
是否完全相同。
每种语言都需要一个商定的机制来将对象转换为可存储的数据格式并返回。你:
在选择格式时,我建议使用两种格式:JSON或Protocol Buffers。这是因为它们的编码大小和编码/解码速度是所有可用编码中最小/最快的。
<强> JSON:强>
$data = json_encode($object); $object = json_decode($data);
协议缓冲区:
.proto
文件定义架构(外部)。person.SerializeToOstream(&output);
optional
成员,以便现有对象不一定无效。对于Unicode支持,两者都可以毫无问题地处理它:
\uXXXX
,因此没有兼容性问题。根据库,也可以强制使用UTF-8编码。您选择哪一个取决于系统的准确程度,数据结构发生变化的频率,以及上述所有方面对您的影响。
答案 2 :(得分:0)
不会说谎你可以用redis做。 Redis是一个为高性能而编写的键值数据库,它允许使用许多不同的客户端库在语言之间传输数据these are the client libraries这是java和python中的一个例子
编辑1:代码未经测试。如果您发现错误,请告诉我:)
编辑2:我知道我没有使用首选的redis客户端用于java,但重点仍然存在。
的Python
import redis
r = redis.Redis()
r.set('test','123')
爪哇
import org.jredis.RedisException;
import org.jredis.ri.alphazero.JRedisClient;
import static org.jredis.ri.alphazero.support.DefaultCodec.*;
class ExampleCode{
private final JRedisClient client = new JRedisClient();
public static void main(String[] args) throws RedisException {
System.out.println(toStr(client.get('test')))
}
}