gpt4 book ai didi

amazon-web-services - 如何在dynamodb中使用自动递增主键id

转载 作者:行者123 更新时间:2023-12-02 23:53:05 25 4
gpt4 key购买 nike

我是 dynamodb 的新手。当我将 putitem 与 dynamodb 一起使用时,我想自动递增 id 值。

可以这样做吗?

最佳答案

这是 DynamoDB 中的反模式,它是为了跨多个分区/分片/服务器进行扩展而构建的。由于扩展限制,DynamoDB 不支持自动递增主键,并且无法保证跨多个服务器。

更好的选择是从多个索引组装主键。主键最大可达 2048 字节。有几个选项:

  1. 使用UUID作为您的 key - 可能是基于时间的 UUID,这使其具有唯一性、均匀分布并具有时间值(value)
  2. 使用随机生成的数字或时间戳 + 随机(可能是位移位),例如:ts << 12 + random_number
  3. 使用其他服务或 DynamoDB 本身生成增量唯一 ID(需要额外调用)

以下代码将自动递增 DynamoDB 中的计数器,然后您可以将其用作主键。

var documentClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: 'sampletable',
Key: { HashKey : 'counters' },
UpdateExpression: 'ADD #a :x',
ExpressionAttributeNames: {'#a' : "counter_field"},
ExpressionAttributeValues: {':x' : 1},
ReturnValues: "UPDATED_NEW" // ensures you get value back
};
documentClient.update(params, function(err, data) {});
// once you get new value, use it as your primary key

我个人最喜欢的是使用时间戳+随机,灵感来自 Instagram 的分片 ID 生成 http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram

以下函数将为特定分片生成 id(作为参数提供)。这样你就可以拥有唯一的 key ,它是由时间戳、分片号组装而成的。和一些随机性(0-512)。

var CUSTOMEPOCH = 1300000000000; // artificial epoch
function generateRowId(shardId /* range 0-64 for shard/slot */) {
var ts = new Date().getTime() - CUSTOMEPOCH; // limit to recent
var randid = Math.floor(Math.random() * 512);
ts = (ts * 64); // bit-shift << 6
ts = ts + shardId;
return (ts * 512) + randid;
}
var newPrimaryHashKey = "obj_name:" + generateRowId(4);
// output is: "obj_name:8055517407349240"

关于amazon-web-services - 如何在dynamodb中使用自动递增主键id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40989139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com