为了理解数据在Ignite中的存储和使用,区分集群中数据的物理存储和数据的逻辑表示,即用户如何在他们的应用程序中查看他们的数据,是非常有用的。
物理存储
在物理层面上,每个数据条目(无论是缓存条目还是表行)都以二进制对象的形式存储,整个数据集被划分为多个分区。分区通过分区算法分布在集群的节点上。数据通过分区分布到不同节点的方式是由亲和函数(affinity function)控制的。
这种二进制对象存储提供了几个优势:
1. 你可以从一个序列化的对象中读取任意字段,而不需要对对象进行完全的反序列化。这完全消除了在服务器节点的classpath上部署键和值类的要求。
2. 你可以从相同类型的对象中添加或删除字段。鉴于服务器节点没有模型类的定义,这种能力允许动态改变对象的结构,甚至允许具有不同版本类定义的多个客户端并存。
3. 它使你能够在完全没有类定义的情况下根据类型名称构造新的对象,因此允许动态类型创建。
4. 它允许Java、.NET和C++平台之间的无缝互操作性。
Note:二进制对象只有在使用默认的二进制marshaller时才能使用(即在配置中没有设置其他marshaller)
逻辑表示
Ignite提供两种不同的数据逻辑表示:键值缓存和SQL表(schema)。虽然这两种表示方式看起来不同,但实际上它们是等价的,可以表示同一组数据。
1.键值缓存
缓存是一个键值对的集合,可以通过键值API访问。缓存API支持以下feature:
Support for JCache (JSR 107) specification
ACID Transactions
Continuous Queries
Events
2.SQL表
与传统RDBMS中的表的概念相对应,有一些额外的约束;例如,每个SQL表必须有一个主键,一个有主键的表可以表现为一个键值缓存,其中主键列作为键,表的其他列代表对象的字段(值)。
这两种表现形式的区别在于你访问数据的方式。键值缓存允许你通过支持的编程语言来处理对象。SQL表支持传统的SQL语法,可以从现有的数据库迁移。你可以把这两种方法结合起来,根据你的使用情况,使用其中一种或者两种。