AWS DynamoDB 生存週期(TTL)使用
Mongodb 具有自動刪除某些過期資料的功能,同樣dynamodb也有相應功能,那就是timetolive(生存週期),我們可以用它來刪除一些oauth2認證中過期的oauth_code 和oauth_token。
環境:aws sdk(nodejs)
1 基本概念
DynamoDB的生存時間(TTL)允許您定義表中的某個專案(Item)何時到期,以便可以從資料庫中自動刪除它們。
TTL是免費提供的,可以在不使用預配置吞吐量的情況下減少儲存使用並降低儲存不相關資料的成本。在表上啟用TTL後,您可以基於每個專案設定刪除時間戳,從而允許您將儲存使用限制為僅限於相關的記錄。
2 TTL 工作過程
TTL將時期格式的當前時間與專案(item)的生存時間屬性中儲存的時間進行比較。如果儲存在屬性中的紀元時間值小於當前時間,則該專案被標記為已過期並隨後被刪除。此處理在後臺自動進行,不會影響對錶的讀取或寫入流量。
紀元時間:紀元時間是UTC時間1970年1月1日凌晨12:00:00之後經過的秒數。注意不是毫秒數
重要:
DynamoDB通常會在到期後48小時內刪除過期的專案,所以有一定隨機性。到期後項目真正被刪除的確切持續時間特定於工作負載的性質和表的大小。已過期但尚未刪除的專案仍將顯示在讀取,查詢和掃描中。這些專案仍然可以更新,並且將成功更新以更改或刪除到期屬性。當專案被刪除時,它們將立即以與標準刪除操作相同的最終一致方式從任何本地二級索引和全域性二級索引中刪除。
3 如何使用
AWS SDK 提供了updateTimeToLive 介面。
updateTimeToLive
意義:
updateTimeToLive方法將啟用或禁用指定表的TTL。成功UpdateTimeToLive通話會返回當前通話TimeToLiveSpecification;
更改可能需要一個小時才能完全處理。UpdateTimeToLive在這一小時的持續時間內對同一個表的任何其他呼叫都會導致a ValidationException 錯誤。
var params = {
TableName: 'STRING_VALUE', /* required */
TimeToLiveSpecification: { /* required */
AttributeName: 'STRING_VALUE', /* required */
Enabled: true || false /* required */
}
};
dynamodb.updateTimeToLive(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
- TableName:要配置的表的名稱。
- AttributeName:用於儲存表中專案的到期時間的生存時間屬性的名稱。number類,是UTC時間1970年1月1日凌晨12:00:00之後經過的秒數
- Enabled:指示是否要在表上啟用(true)或禁用(false)生存時間。
4 Sample Code
var AWS = require('aws-sdk');
var DataSchema = require('./dynamodb_schema.json');
AWS.config.loadFromPath('./config/models/aws_config.json');
AWS.config.update({region : DataSchema.region});
var DynamoDBClinet = new AWS.DynamoDB.DocumentClient({ endpoint: new AWS.Endpoint(DataSchema.url) });
var dynamodb = new AWS.DynamoDB({ endpoint: new AWS.Endpoint(DataSchema.url)});
let params = {
TableName: 'oauth_code', /* required */
TimeToLiveSpecification: { /* required */
AttributeName: 'expires_at', /* required */
Enabled: true/* required */
}
};
dynamodb.updateTimeToLive(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});