【问题标题】:Riak inserting ListsRiak 插入列表
【发布时间】:2016-08-15 18:34:37
【问题描述】:

如何在 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 写入。当我们的消息系统开始每秒推送数千条消息时,这将成为瓶颈。因此,此处的意图(某种 POC)是将每个客户的所有 订单项合并到一个"orders" 列表中,并作为单个资源持续存在......类似于批次。

关于这一点,Riak 是否支持任何类型的批量插入?我无法找到解决方案,所以我通过合并数据手动执行此操作。

【问题讨论】:

    标签: java solr riak batching


    【解决方案1】:

    您不必做任何特别的事情来在 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);
    

    或者,您可以将其建模为 Map'sList'sObject's

    但请记住,如果您要更新、添加或删除单个订单,或更改客户日期,则必须阅读整个列表,更改项目,然后将整个列表写回,可能增加发生冲突的机会(同时更新同一密钥)。

    Solr 绝对支持复杂的字段结构、多值和动态字段。看看Creating Search Schemas。我需要知道你希望搜索的数据的哪一部分给你一个例子。

    不,Riak 不支持批量插入。

    更新:在您的案例中,用于按订单 ID 进行索引的自定义(非通用)Solr 架构应包括

    <field name="orders.orderId" type="string" indexed="true" stored="false" multiValued="true" />
    

    【讨论】:

    • 谢谢。永远不需要更新单个订单。但是,应将新订单项目添加/添加到客户订单列表中。我想通过它的 orderId 搜索每个订单。正如您提到的,我有兴趣将其建模为对象的地图和列表。你能分享一些关于如何在 Riak 中建模的细节吗?
    • 同样的问题。当我写“更新个人订单”时,我的意思也是添加和删除。作为结构一部分的任何信息也是如此。通过 orderId 搜索很容易 - 您必须将 orders.orderId 索引为 string 并使其具有多值。
    • 我很困惑。您想整合数据还是将模型存储为单独的键值对?例如,每个订单都在一个单独的唯一键中,而一个订单列表在一个不同的键中链接到客户。 MapsLists 我指的是 Java 类,如果出于某种原因您不想创建 DTO 类来表示您的模型。
    • 是的,我想合并数据。我认为您使用 StoreValue 的解决方案适用于我的情况,所以我会先尝试一下。我只是希望 Jackson de/serializers 不会导致性能下降。
    • 如果您更喜欢使用 JSON 作为String,您也可以这样做。 Riak 不在乎您如何发送它,只需确保将内容类型设置为“application/json”,以便正确索引docs.basho.com/riak/kv/2.1.4/developing/getting-started/java/…。但是无论如何您都必须构建 JSON。而且我认为您没有比 JSON 更好的序列化替代方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    相关资源
    最近更新 更多