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

标签 amazon-web-services amazon-dynamodb

我是 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/37072341/

相关文章:

java - 带 GSI 的 dynamodb 过滤器

Node.js、Socket.io 多用户应用程序——存储用户 session ?

amazon-dynamodb - 如何在 CloudFormation 中使用基础设施即代码实现 DynamoDB 全局二级索引

java - 具有复合键的重复主键,DynamoDB

amazon-web-services - AWS SAM/Cloudformation 配置 API Gateway 以指向 lambda 函数版本

amazon-web-services - 删除 X 天内未触及的 AWS 日志组

git - 通过 ssh 将 git repo 推送到远程服务器

amazon-web-services - Docker Compose 部署到 ECS 无法解析服务名称 (YELB)

amazon-web-services - 了解 Dynamo DB 中的热键

database - 如何获取 DynamoDB 列中的最大数量?