Riak 插入列表
Riak inserting Lists
如何在 Riak 中插入地图列表?我还可以通过 Solr 查询列表。
这是我的目标数据模型:
{
"id":"fa0b758cf8de4a40a54f215563bb483c",
"version":"g2wAAAABaAJtAAAADN4oTJvAfuENAAE8fWEBag==",
"creator":"ADMIN",
"creatorAppId":"RIAK_QA_APP1",
"creation":1470350862095,
"customerId":"68af96dae60ccac4e6",
"customerName":"John Appleseed",
"orders":[
{
"orderId":"238dhu38ehj",
"orderType":"sporting",
"orderDescription":"Baseball Batt",
"dateOfPurchase":"5470354262012",
"delivery":"2 day express",
"processTimeMS":56,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
},
{
"orderId":"9sdjh349hn",
"orderType":"furniture",
"orderDescription":"Sectional Couch",
"dateOfPurchase":"0970354262087",
"delivery":"Overnight",
"processTimeMS":78,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
},
{
"orderId":"1009shdj473",
"orderType":"gaming",
"orderDescription":"FIFA 2016 - XBox One",
"dateOfPurchase":"1470354342013",
"delivery":"UPS Ground",
"processTimeMS":68,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
}
]
}
当前的数据模型分别保存每个订单项,导致大量 Riak 写入。当我们的消息系统开始推送数千个 messages/sec 时,这就成为瓶颈。因此,这里的目的(某种 POC)是将每个客户的 所有 订单项目合并到一个 "orders"
列表中,并作为单个资源持续存在……类似于批处理。
关于这一点,Riak 是否支持任何类型的批量插入?我找不到解决方案,所以我通过合并数据来手动执行此操作。
您无需执行任何特殊操作即可在 Riak 中存储复杂的数据结构。 Java 客户端支持序列化为 JSON(Jackson 就此而言,因此您可以使用 Jackson 功能,例如注释)。
我建议使用 DTO 对数据建模,然后通过 Riak 的 StoreValue
命令发送它们。这样的代码将起作用:
public class CustomerData {
private String id;
private String version;
// other customer fields
private List<Order> orders;
}
public class Order {
private String orderId;
private String orderType;
// other order fields
}
CustomerData data = ...;
Location location = new Location(new Namespace(BUCKET_TYPE, BUCKET_NAME), key);
StoreValue storeCommand = new StoreValue.Builder(data).withLocation(location).build();
riakClient.execute(storeCommand);
或者,您可以将其建模为 Object's
的 Map's
和 List's
。
不过请记住,如果您想要更新、添加或删除单个订单,或者更改客户日期,您将必须阅读整个列表,更改一个项目,然后将整个列表写回,可能会增加发生冲突的可能性(同时更新同一键)。
Solr绝对支持复杂字段结构、多值和动态字段。看看 Creating Search Schemas。我需要知道你希望搜索你的数据的哪一部分来给你举个例子。
不,Riak 不支持批量插入。
更新:在您的案例中,用于按订单 ID 进行索引的自定义(非通用)Solr 模式应包括
<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" />
如何在 Riak 中插入地图列表?我还可以通过 Solr 查询列表。
这是我的目标数据模型:
{
"id":"fa0b758cf8de4a40a54f215563bb483c",
"version":"g2wAAAABaAJtAAAADN4oTJvAfuENAAE8fWEBag==",
"creator":"ADMIN",
"creatorAppId":"RIAK_QA_APP1",
"creation":1470350862095,
"customerId":"68af96dae60ccac4e6",
"customerName":"John Appleseed",
"orders":[
{
"orderId":"238dhu38ehj",
"orderType":"sporting",
"orderDescription":"Baseball Batt",
"dateOfPurchase":"5470354262012",
"delivery":"2 day express",
"processTimeMS":56,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
},
{
"orderId":"9sdjh349hn",
"orderType":"furniture",
"orderDescription":"Sectional Couch",
"dateOfPurchase":"0970354262087",
"delivery":"Overnight",
"processTimeMS":78,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
},
{
"orderId":"1009shdj473",
"orderType":"gaming",
"orderDescription":"FIFA 2016 - XBox One",
"dateOfPurchase":"1470354342013",
"delivery":"UPS Ground",
"processTimeMS":68,
"customerAttributes":[
{
"key":"lastSessionDuration",
"value":"1 day"
},
{
"key":"memberSince",
"value":"1470350862095"
}
]
}
]
}
当前的数据模型分别保存每个订单项,导致大量 Riak 写入。当我们的消息系统开始推送数千个 messages/sec 时,这就成为瓶颈。因此,这里的目的(某种 POC)是将每个客户的 所有 订单项目合并到一个 "orders"
列表中,并作为单个资源持续存在……类似于批处理。
关于这一点,Riak 是否支持任何类型的批量插入?我找不到解决方案,所以我通过合并数据来手动执行此操作。
您无需执行任何特殊操作即可在 Riak 中存储复杂的数据结构。 Java 客户端支持序列化为 JSON(Jackson 就此而言,因此您可以使用 Jackson 功能,例如注释)。
我建议使用 DTO 对数据建模,然后通过 Riak 的 StoreValue
命令发送它们。这样的代码将起作用:
public class CustomerData {
private String id;
private String version;
// other customer fields
private List<Order> orders;
}
public class Order {
private String orderId;
private String orderType;
// other order fields
}
CustomerData data = ...;
Location location = new Location(new Namespace(BUCKET_TYPE, BUCKET_NAME), key);
StoreValue storeCommand = new StoreValue.Builder(data).withLocation(location).build();
riakClient.execute(storeCommand);
或者,您可以将其建模为 Object's
的 Map's
和 List's
。
不过请记住,如果您想要更新、添加或删除单个订单,或者更改客户日期,您将必须阅读整个列表,更改一个项目,然后将整个列表写回,可能会增加发生冲突的可能性(同时更新同一键)。
Solr绝对支持复杂字段结构、多值和动态字段。看看 Creating Search Schemas。我需要知道你希望搜索你的数据的哪一部分来给你举个例子。
不,Riak 不支持批量插入。
更新:在您的案例中,用于按订单 ID 进行索引的自定义(非通用)Solr 模式应包括
<field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" />