tie*_*er1 45
DynamoDB不提供开箱即用的功能.您可以在应用程序中生成一些内容,例如对于大多数系统而言"应该"足够独特的UUID.
我注意到你使用的是Node.js(我删除了你的标签).这是一个提供UUID功能的库:node-uuid
自述文件的示例
var uuid = require('node-uuid');
var uuid1 = uuid.v1();
var uuid2 = uuid.v1({node:[0x01,0x23,0x45,0x67,0x89,0xab]});
var uuid3 = uuid.v1({node:[0, 0, 0, 0, 0, 0]})
var uuid4 = uuid.v4();
var uuid5 = uuid.v4();
Run Code Online (Sandbox Code Playgroud)
vla*_*man 37
这是DynamoDB中的反模式,可以跨多个分区/分片/服务器进行扩展.由于扩展限制,DynamoDB不支持自动增量主键,并且无法保证跨多个服务器.
更好的选择是从多个索引组装主键.主键最多可以为2048个字节.选项很少:
以下代码将在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
Run Code Online (Sandbox Code Playgroud)
我个人最喜欢的是在http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram上使用时间戳+随机灵感来自Instagram的Sharding ID代.
以下函数将为特定分片生成id(作为参数提供).这样你就可以得到唯一的密钥,它是从时间戳,分片编号组装而成的.和一些随机性(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 % 512);
}
var newPrimaryHashKey = "obj_name:" + generateRowId(4);
// output is: "obj_name:8055517407349240"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48659 次 |
| 最近记录: |