aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作

news2024/12/23 1:43:50

总结一下

  • dynamodb通常和java等后端sdk结合使用
  • 使用的形式可以是api或partiql语法调用
  • dynamodb的用法不难,更重要的是维护成本,所需的服务集成,技术选型等
  • 和大数据结合场景下有独特优势

之后可能再看看java sdk中DynamoDBMapper的写法,以及对标产品documentdb的比较

创建dynamodb表

创建表

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/create-table.html

  • 主键可包含一个属性(分区键)或两个属性(分区键和排序键)。需要提供每个属性的属性名称、数据类型和角色:HASH (针对分区键) 和 RANGE (针对排序键)
  • 使用预置模式,则必须指定表的初始读取和写入吞吐量设置
/// 预配置表
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --provisioned-throughput \
        ReadCapacityUnits=5,WriteCapacityUnits=5 \
    --table-class STANDARD
    # --table-class STANDARD_INFREQUENT_ACCESS
    
// 按需表
aws dynamodb create-table \
    --table-name Music \
    --attribute-definitions \
        AttributeName=Artist,AttributeType=S \
        AttributeName=SongTitle,AttributeType=S \
    --key-schema \
        AttributeName=Artist,KeyType=HASH \
        AttributeName=SongTitle,KeyType=RANGE \
    --billing-mode=PAY_PER_REQUEST

控制台创建默认表的配置如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hGso1Yks-1678515745623)(assets/image-20230311111037435.png)]

查看表

  • 对按需表调用 DescribeTable 时,读取容量单位和写入容量单位设置为 0
aws dynamodb describe-table --table-name Music

此时的最佳实践是开启Point-in-time recovery(dynamodb的自动备份),避免意外的写入和删除

  • 可以按需恢复到最近35天(无法修改,禁用在开启需要从0开始计算天数)中的任意时间点

  • 备份方式为增量备份

  • 开启时间点恢复不影响api的性能

  • 支持跨region还原表

  • 删除开启时间点还原的表,会自动创建一个备份快照(保留 35 天)

aws dynamodb update-continuous-backups \ 
    --table-name Music \ 
    --point-in-time-recovery-specification \ 
        PointInTimeRecoveryEnabled=true

写入item

插入item有两种视图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iiqkYI07-1678515745625)(assets/image-20230311112037750.png)]

dynamodb api插入item

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/put-item.html#examples

cat > item.json << EOF
{
    "Artist": {"S": "No One You Know"},
    "SongTitle": {"S": "Howdy"},
    "AlbumTitle": {"S": "Somewhat Famous"},
    "Awards": {"N": "0"}
}
EOF
aws dynamodb put-item \
    --table-name MusicCollection \
    --item file://item.json \
    --return-consumed-capacity TOTAL \
    --return-item-collection-metrics SIZE
// output
{
    "ConsumedCapacity": {
        "TableName": "Music",
        "CapacityUnits": 1.0
    }
}

PartiQL插入item

aws dynamodb execute-statement --statement "INSERT INTO Music \
											VALUE  {'Artist':'Oh My Hony','SongTitle':'Call Me Today', 'AlbumTitle':'Somewhat Famous', 'Awards':'1'}"

读取item

dynamodb api读取item

https://docs.aws.amazon.com/cli/latest/reference/dynamodb/get-item.html

--consistent-read | --no-consistent-read (boolean)

Determines the read consistency model: If set to true , then the operation uses strongly consistent reads; otherwise, the operation uses eventually consistent reads.

aws dynamodb get-item \
	--consistent-read \
    --table-name Music \
    --key '{ "Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}'

PartiQL读取item

aws dynamodb execute-statement --statement "SELECT * FROM Music   \
                                            WHERE Artist='Acme Band' AND SongTitle='Happy Day'"

更新item

dynamodb api更新item,逻辑上先查询再修改

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/dynamodb/update-item.html

aws dynamodb update-item \
    --table-name Music \
    --key '{ "Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}' \
    --update-expression "SET AlbumTitle = :newval" \
    --expression-attribute-values '{":newval":{"S":"Updated Album Title1"}}' \
    --return-values ALL_NEW

PartiQL更新item

aws dynamodb execute-statement --statement "UPDATE Music  \
                                            SET AlbumTitle='Updated Album Title'  \
                                            WHERE Artist='Acme Band' AND SongTitle='Happy Day' \
                                            RETURNING ALL NEW *"

查询item

dynamodb api查询item

aws dynamodb query \
    --table-name Music \
    --key-condition-expression "Artist = :name" \
    --expression-attribute-values  '{":name":{"S":"Acme Band"}}'

这里必须指定key表达式,否则会报错

An error occurred (ValidationException) when calling the Query operation: ExpressionAttributeValues can only be specified when using expressions: FilterExpression and KeyConditionExpression are null

PartiQL查询item

aws dynamodb execute-statement --statement "SELECT * FROM Music   \
                                            WHERE Artist='Acme Band'"

更新dynamodb表

支持的操作有

  • 修改表的预置吞吐量设置
  • 更改表的读/写容量模式。
  • 在表上操作全局二级索引
  • 在表上启用或禁用 DynamoDB Streams

修改读写模式

https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/switching.capacitymode.html

类型位置模式转换
按需模式 => 预置模式
读写模式控制台根据表和全局二级索引在过去 30 分钟内占用的读写容量估计初始预配置容量值
读写模式CLI 或 SDK用户通过cw查看历史使用情况(ConsumedWriteCapacityUnitsConsumedReadCapacityUnits 指标)以确定新的吞吐量设置
按需模式 <= 预置模式
读写模式任意无需指定预期应用程序执行的读取和写入吞吐量
预置模式 => 按需模式
自动扩缩CLI 或 SDK可能会保留自动扩缩设置
自动扩缩控制台会删除自动扩缩设置
按需模式 <= 预置模式
自动扩缩CLI 或 SDK保留先前的 Auto Scaling 设置
自动扩缩控制台建议设置,目标利用率:70%,最小预置容量:5 个单位,最大预置容量:区域最大值
  • 从按需模式更新为预置模式

    • 控制台修改,根据表和全局二级索引在过去 30 分钟内占用的读写容量估计初始预配置容量值
    • CLI 或 SDK,用户通过cw查看历史使用情况(ConsumedWriteCapacityUnitsConsumedReadCapacityUnits 指标)以确定新的吞吐量设置
  • 从预置模式更新为按需模式

    • 无需指定预期应用程序执行的读取和写入吞吐量

关于自动扩缩

  • 从预置模式更新为按需模式

    • 控制台会删除自动扩缩设置

    • cli则可能会保留自动扩缩设置

  • 从按需模式更新为预置模式

    • 控制台建议设置,目标利用率:70%,最小预置容量:5 个单位,最大预置容量:区域最大值
    • cli保留先前的 Auto Scaling 设置

创建全局二级索引

创建全局二级索引是更新表操作的一种

dynamodb api创建索引

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/dynamodb/update-table.html#examples

If you are adding a new global secondary index to the table, AttributeDefinitions must include the key element(s) of the new index.

cat > gsi-updates.json << EOF
[
    {
        "Create": {
            "IndexName": "AlbumTitle-index",
            "KeySchema": [
                {
                    "AttributeName": "AlbumTitle",
                    "KeyType": "HASH"
                }
            ],
            "ProvisionedThroughput": {
                "ReadCapacityUnits": 10,
                "WriteCapacityUnits": 5
            },
            "Projection": {
                "ProjectionType": "ALL"
            }
        }
    }
]
EOF
aws dynamodb update-table \
    --table-name Music \
    --attribute-definitions AttributeName=AlbumTitle,AttributeType=S \
    --global-secondary-index-updates file://gsi-updates.json

控制台查看

 aws dynamodb describe-table --table-name Music | grep IndexStatus

在这里插入图片描述

查询全局二级索引

dynamodb api查询GSI

aws dynamodb query \
    --table-name Music \
    --index-name AlbumTitle-index \
    --key-condition-expression "AlbumTitle = :name" \
    --expression-attribute-values  '{":name":{"S":"Somewhat Famous"}}'

PartiQL查询GSI

aws dynamodb execute-statement --statement "SELECT * FROM ‘Music’.‘AlbumTitle-index’  \
                                            WHERE AlbumTitle='Somewhat Famous'"

删除表

aws dynamodb delete-table --table-name Music

查看吞吐量配额

https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/ServiceQuotas.html#default-limits-throughput

  • 预置吞吐量配额是表容量加上其所有全局二级索引容量的总和
$ aws dynamodb describe-limits
{
    "AccountMaxReadCapacityUnits": 80000,
    "AccountMaxWriteCapacityUnits": 80000,
    "TableMaxReadCapacityUnits": 40000,
    "TableMaxWriteCapacityUnits": 40000
}

相关问题

节流问题

https://docs.aws.amazon.com/zh_cn/amazondynamodb/latest/developerguide/ProvisionedThroughput.html#ProvisionedThroughput.Troubleshooting

  • DynamoDB 仅向 CloudWatch 报告分钟级指标,然后将这些指标计算为一分钟的总和并取平均值。但是 DynamoDB 本身会应用每秒的速率限制。可能由于微突增产生限流

  • 当 2 个数据点在 1 分钟内超过所配置的目标利用率值时,可以触发自动扩缩,如果峰值间隔超过 1 分钟,则可能无法触发自动扩缩。在触发自动扩缩之后,都会调用 UpdateTable API

    img

  • 对于按需表,如果吞吐量在 30 分钟内超出先前峰值的两倍,则可能发生节流

  • 生成的“热分区”超过了每分区每秒 3000 RCU 或 1000 WCU 的限制,这可能会导致节流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/404184.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

登入vCenter显示503,证书过期解决办法

登入vCenter显示503 原因&#xff1a;当安全令牌服务 &#xff08;STS&#xff09; 证书已过期时&#xff0c;会出现这些问题。这会导致内部服务和解决方案用户无法获取有效令牌&#xff0c;从而导致无法按预期运行&#xff08;证书两年后就会过期&#xff09;。 解决办法&…

Yocto系列讲解[技巧篇]90 - toolchain交叉编译器SDK中安装的软件

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 问题背景toolchain生成回顾toolchain sdk安装方法1:安装libmyapi到SDK方法2:安装libmyapi到SDK演示过程返回总目录:Yocto开发讲解系…

Linux 学习笔记——二、主机规划与磁盘分区

一、Linux 与硬件的搭配 Linux 中所有设备均被视为文件&#xff0c;其命名规则如下&#xff1a; 设备文件名SCSI/SATA/USB 硬盘机/dev/sd[a-p]USB 闪存盘/dev/sd[a-p]&#xff08;与 SATA 相同&#xff09;Virtl/O 界面/dev/vd[a-p]&#xff08;用于虚拟机内&#xff09;软盘…

RabbitMQ高级特性

RabbitMQ高级特性 消息可靠性投递 Consumer ACK 消费端限流 TTL 死信队列 延迟队列 日志与监控 消息可靠性分析与追踪 管理 消息可靠性投递 在使用 RabbitMQ 的时候&#xff0c;作为消息发送方希望杜绝任何消息丢失或者投递失败场景。RabbitMQ 为我们提供了两种方式用来控制…

docker基本命令-容器

容器 基本概念 镜像&#xff08;Image&#xff09;和容器&#xff08;Container&#xff09;的关系&#xff0c;就像是面向对象程序设计中的 类 和 实例 一样&#xff0c;镜像是静态的定义&#xff0c;容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 容…

.NET Framework .NET Core与 .NET 的区别

我们在创建C#程序时,经常会看到目标框架以下的选项,那么究竟有什么区别? 首先 .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体…

搭建一个中心化的定时服务

1. 背景 在物联网络&#xff0c;很多设备之间都在进行交互&#xff0c;其中云端在远程交流中起到了很重要的作用。比如&#xff0c;一台设备想进行调温&#xff0c;但是需要知道此时房间的温度&#xff0c;那就需要定时去查询传感器测出来的房间温度&#xff0c;如果温度过高&a…

【C++学习】【STL】list容器

list 容器&#xff0c;又称双向链表容器&#xff0c;即该容器的底层是以双向链表的形式实现的。这意味着&#xff0c;list 容器中的元素可以分散存储在内存空间里&#xff0c;而不是必须存储在一整块连续的内存空间中。可以看到&#xff0c;list 容器中各个元素的前后顺序是靠指…

【NodeJs】使用ffmpeg将视频webm转换为mp4

使用Chrome浏览器录制视频文件是webm格式&#xff0c;但是很多媒体播放器是不支持的&#xff0c;不利于分享&#xff0c;需要转换为mp4格式才行&#xff0c;接下来给大家讲 ffmpeg ffmpeg是什么呢&#xff0c; 一个免费开源的视频转换工具&#xff0c;一款音视频编解码工具&…

日志与可视化方案:从ELK到EFK,再到ClickHouse

EFK方案 从ELK谈起 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch&#xff0c;Logstash&#xff0c;Kibana。新增了一个FlieBeat&#xff0c;它是一个轻量级的日志收集处理工具&#xff0c;FlieBeat占用资源少&#xff0c;适用于在各个服务器上搜集…

JS语法(扫盲)

文章目录一、初识JavaScript二、第一个JS程序JS代码的引入JS程序的输出三、语法变量使用动态类型内置类型运算符强类型语言&弱类型语言条件语句循环语句数组创建数组获取数组元素新增数组元素删除数组元素函数语法格式形参实参个数的问题匿名函数&函数表达式作用域作用…

PHP 的运行方式有哪些?

PHP本质上的运行方式可以分为两种&#xff1a; 基于命令行的基于PHP-FPM的 但实际上&#xff0c;PHP能做的事很多&#xff0c;很多场景下&#xff0c;不同的运行方式能让开发更方便&#xff0c;减轻各种工作。 测试开发 PHP内置了一个HTTP 的server。这意味着&#xff0c;很…

stm32外设-GPIO

0. 写在最前 本栏目笔记都是基于stm32F10x 1. GPIO基本介绍 GPIO—general purpose intput output 是通用输入输出端口的简称&#xff0c;简单来说就是软件可控制的引脚&#xff0c; STM32芯片的GPIO引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的…

java Date 和 Calendar类 万字详解(通俗易懂)

Date类介绍及使用关于SimpleDateFormat类Calendar类介绍及使用LocalDateTime类介绍及使用关于DateTimeFormatter类一、前言本节内容是我们《API-常用类》专题的第五小节了。本节内容主要讲Date 类 和 Calendar 类&#xff0c;内容包括但不限于Date类简介&#xff0c;Date类使用…

【微信小程序】-- 自定义组件 - 数据监听器 (三十四)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

传奇开服流程—传奇单机架设教程

现在传奇私服还是那么的火爆&#xff0c;上次有报道发布站一年盈利几个亿&#xff0c;还是有很大的机会&#xff0c;很多玩家因为GM开服关服给折腾&#xff0c;刚充的钱服务器就关了&#xff0c;很是恼火&#xff0c;于是都想自己整个服开开&#xff0c;但又不知道从何下手&…

三菱FX5U之数据处理类指令的使用

本课程使用三菱PLC works3编程软件进行教学&#xff0c;并使用works3的仿真功能进行PLC仿真&#xff0c;学习的时候不需要有实物PLC。 补充说明&#xff1a;三菱 FX 5U系列PLC使用的是GX works3编程软件&#xff0c;FX 3U、Q系列PLC使用的是GX works3编程软件。 第一章 八个案…

YUV实践记录

文章目录YUV基础介绍&#xff1a;不同采样YUV格式的区别为什么要使用YUV格式呢&#xff1f;YUV的存储方式Android中的YUV_420_888附录&#xff1a;YUV基础介绍&#xff1a; YUV在做手机图像或者视频处理的时候会经常用到的一个格式&#xff0c;用此文来记录YUV相关介绍&#xf…

hibernate学习(五)

hibernate学习&#xff08;五&#xff09; hibernate的一对多关联映射&#xff1a; 一、数据库表与表之间关系 一对多建表原则&#xff1a; 多对多的建表原则&#xff1a; 一对一建表原则&#xff1a; &#xff08;1&#xff09;唯一外键对应&#xff1a; &#xff08;…

时间复杂度和空间复杂度的计算

目录 算法的复杂度 时间复杂的的概念 时间复杂度计算方法 大O的渐进表示法 空间复杂的概念 空间复杂的的计算方法 时间和空间复杂度的应用 消失的数字 轮转数组 算法的复杂度 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间&#xff08;内存&…