将数据存储在memcache中以供不同语言访问

时间:2011-09-30 11:52:33

标签: c# php c++ python memcached

我正在开发一个包含以下语言编写的组件的系统:

  • C
  • C ++
  • C#
  • PHP
  • 的Python

这些组件都使用(不经常更改)来自同一来源的数据,并且出于性能原因可以从内存缓存中缓存和加入这些数据。

因为不同的语言API可能会以不同的方式存储不同的数据类型到memcache,我想知道将所有数据存储为字符串是否更好(对象将存储为JSON字符串)。

然而,这本身可能会带来问题,因为字符串(几乎肯定会)在不同的语言中有不同的内部表示,所以我想知道这个决定是多么明智。

顺便说一下,我使用的是1作者,多个读者模式'所以并发不是问题。

任何人(最好有ACTUAL经验做类似的事情)都可以建议在memcache中存储数据的最佳格式/方式,以便它可以被不同的编程语言使用吗?

3 个答案:

答案 0 :(得分:3)

memcached我认为主要只理解byte []并且所有语言中byte的表示都是相同的。您可以使用protocol buffers或类似的库序列化对象,并以任何其他语言使用它。我在我的项目中做到了这一点。

答案 1 :(得分:1)

无论选择哪个后端,(memcached,mongodb,redis,mysql,运营商鸽子),在其中存储数据的最快速的方式是一个简单的数据块(所以后端没有知识) 。)stringbyte[]BLOB是否完全相同。

每种语言都需要一个商定的机制来将对象转换为可存储的数据格式并返回。你:

  • 不应该建立自己的机制,那只是重新发明轮子。
  • 应该考虑“无效”对象是否可能会在后端结束。 (由于编写器中的错误,或者因为先前修订版中的对象仍然存在)

在选择格式时,我建议使用两种格式:JSONProtocol Buffers。这是因为它们的编码大小和编码/解码速度是所有可用编码中最小/最快的。

比较

<强> JSON:

  • 可提供数十种语言的库,有时也是标准库的一部分。
  • 非常简单的格式 - 存储时人类可读,人类可写!
  • 不同系统之间不需要协调,只需就对象结构达成一致。
  • 许多语言都不需要设置,例如PHP:$data = json_encode($object); $object = json_decode($data);
  • 没有固有的架构,因此读者需要手动验证已解码的消息。
  • 比Protocol Buffers占用更多空间。

协议缓冲区:

  • 生成为多种语言提供的工具。
  • 最小尺寸 - 难以击败。
  • 通过.proto文件定义架构(外部)。
  • 用于编码/解码的自动生成的接口对象,例如C ++:person.SerializeToOstream(&output);
  • 支持不同版本的对象模式以添加新的optional成员,以便现有对象不一定无效。
  • 不是人类可读或可写的,因此可能更难调试。
  • 定义的架构引入了一些配置管理开销。

的Unicode

对于Unicode支持,两者都可以毫无问题地处理它:

  • JSON:通常会将字符串中的非ascii字符转义为\uXXXX,因此没有兼容性问题。根据库,也可以强制使用UTF-8编码。
  • 协议缓冲区:似乎使用UTF-8,虽然我没有在3英尺高的字母中找到谷歌文档中的信息。

摘要

您选择哪一个取决于系统的准确程度,数据结构发生变化的频率,以及上述所有方面对您的影响。

答案 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')))
    }
}