Dynamodb 学习
https://github.com/eugenp/tutorials/tree/master/persistence-modules
官方指南
https://docs.amazonaws.cn/amazondynamodb/latest/developerguide/CodeSamples.Java.html
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/best-practices.html
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.Java.01.html
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/LSIJavaDocumentAPI.Example.html
proxy
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-configure-proxy.html
DynamoDB 写入读取容量
https://blog.csdn.net/m0_37263637/article/details/80750399
数据偏移、分区陷阱……我们这样避开DynamoDB的5个坑
https://blog.csdn.net/qq_16229873/article/details/102595262
DynamoDB基本概念
https://zhuanlan.zhihu.com/p/72397412
Amazon DynamoDB 入门5:索引管理及创建
https://blog.csdn.net/czongxiao/article/details/100013120
Dynamodb 学习笔记一(主键、二级索引)
https://blog.csdn.net/wuzhong8809/article/details/91040543
AWS DynamoDB 常用操作
https://blog.csdn.net/m0_37263637/article/details/80523196
【AWS】 DynamoDB Java 高级API 实现增删改查 【附图】
https://blog.csdn.net/wenzhouxiaomayi77/article/details/105123494/
Download NoSQL Workbench
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/workbench.settingup.html
Deploying DynamoDB Locally on Your Computer
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html
import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.amazonaws.ClientConfiguration; import com.amazonaws.Protocol; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.AWSCredentialsProvider; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperConfig; /** * AWS Config. * */ @Configuration public class DynamoDbConfig { @Value("${spring.data.aws.access-key}") private String amazonAWSAccessKey; @Value("${spring.data.aws.secret-key}") private String amazonAWSSecretKey; @Value("${dynamodb.local.enable}") private Boolean dynamodbLocalEnable; public AWSCredentialsProvider amazonAWSCredentialsProvider() { return new AWSStaticCredentialsProvider(amazonAWSCredentials()); } @Bean public DynamoDBMapperConfig dynamoDBMapperConfig() { return DynamoDBMapperConfig.DEFAULT; } @Bean public DynamoDBMapper dynamoDBMapper(AmazonDynamoDB amazonDynamoDB, DynamoDBMapperConfig config) { return new DynamoDBMapper(amazonDynamoDB, config); } @Bean public AmazonDynamoDB amazonDynamoDB() { if (dynamodbLocalEnable) { return AmazonDynamoDBClientBuilder.standard().withCredentials(amazonAWSCredentialsProvider()) .withEndpointConfiguration(new EndpointConfiguration("http://127.0.0.1:8000/", "us-east-1")) .build(); } else { ClientConfiguration config = new ClientConfiguration(); config.setProtocol(Protocol.HTTPS); config.setProxyHost("xxx.xxx.xxx.xxx"); config.setProxyPort(80); config.setProxyUsername("xxxx"); config.setProxyPassword("xxxxx"); return AmazonDynamoDBClientBuilder.standard().withCredentials(amazonAWSCredentialsProvider()) .withClientConfiguration(config) .withRegion(Regions.US_EAST_2) .build(); } } @Bean public AWSCredentials amazonAWSCredentials() { return new BasicAWSCredentials(amazonAWSAccessKey, amazonAWSSecretKey); } }
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBIndexHashKey; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; import lombok.ToString; /** * xxxxxxxxxx. * */ @ToString @DynamoDBTable(tableName = "user_auth_info") public class UserAuthInfoDynEntity { // xxxxxxxxxx private String authToken; // xxxxxxxxxx private String accountId; // xxxxxxx private String sbscrbNo; // xxxxxxxxxxx private String lineId; // xxxxxxxxxxxx private String simLineId; // xxxxxxxxxxxx private String lineidId; // xxxxxxxxxxxx private String authType; // xxxxxxxxxxx private String accountStatus; // xxxxxxxxxxxx private String menberStatus; // xxxxxxxxx private String ekycStatus; // xxxxxxxxxxx private String expireDate; @DynamoDBHashKey(attributeName = "auth_token") public String getAuthToken() { return authToken; } public void setAuthToken(String authToken) { this.authToken = authToken; } @DynamoDBIndexHashKey(globalSecondaryIndexName = "index_acount_id", attributeName = "account_id") public String getAccountId() { return accountId; } public void setAccountId(String accountId) { this.accountId = accountId; } @DynamoDBAttribute(attributeName = "sbscrb_no") public String getSbscrbNo() { return sbscrbNo; } public void setSbscrbNo(String sbscrbNo) { this.sbscrbNo = sbscrbNo; } @DynamoDBAttribute(attributeName = "line_id") public String getLineId() { return lineId; } public void setLineId(String lineId) { this.lineId = lineId; } @DynamoDBAttribute(attributeName = "sim_line_id") public String getSimLineId() { return simLineId; } public void setSimLineId(String simLineId) { this.simLineId = simLineId; } @DynamoDBAttribute(attributeName = "lineid_id") public String getLineidId() { return lineidId; } public void setLineidId(String lineidId) { this.lineidId = lineidId; } @DynamoDBAttribute(attributeName = "auth_type") public String getAuthType() { return authType; } public void setAuthType(String authType) { this.authType = authType; } @DynamoDBAttribute(attributeName = "account_status") public String getAccountStatus() { return accountStatus; } public void setAccountStatus(String accountStatus) { this.accountStatus = accountStatus; } @DynamoDBAttribute(attributeName = "menber_status") public String getMenberStatus() { return menberStatus; } public void setMenberStatus(String menberStatus) { this.menberStatus = menberStatus; } @DynamoDBAttribute(attributeName = "ekyc_status") public String getEkycStatus() { return ekycStatus; } public void setEkycStatus(String ekycStatus) { this.ekycStatus = ekycStatus; } @DynamoDBAttribute(attributeName = "expire_date") public String getExpireDate() { return expireDate; } public void setExpireDate(String expireDate) { this.expireDate = expireDate; } }
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression; import com.amazonaws.services.dynamodbv2.model.AttributeValue; import com.amazonaws.services.dynamodbv2.model.Select; import com.xxxxx.common.dynamodb.entity.UserAuthInfoDynEntity; import java.util.HashMap; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * xxxxxxxxxxxx. * */ @Component public class UserAuthInfoDynRepository { @Autowired DynamoDBMapper dynamoDbMapper; static final String ACOUNT_INDEX_NAME = "index_acount_id"; /** * xxxxxxx. * @param authToken String * @return List(UserAuthInfoDynEntity) */ public UserAuthInfoDynEntity search(String authToken) { return dynamoDbMapper.load(UserAuthInfoDynEntity.class, authToken); } /** * xxxxxxxxxxxx. * @param data UserAuthInfoDynEntity */ public void save(UserAuthInfoDynEntity data) { dynamoDbMapper.save(data); } /** * xxxxxxxxxxxxxx * @param accountId String * @return List(UserAuthInfoDynEntity) */ public List<UserAuthInfoDynEntity> searchByAccountIdIndex(String accountId) { HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>(); eav.put(":account_id", new AttributeValue().withS(accountId)); DynamoDBQueryExpression<UserAuthInfoDynEntity> queryExpression = new DynamoDBQueryExpression<UserAuthInfoDynEntity>() .withIndexName(ACOUNT_INDEX_NAME) .withConsistentRead(false) .withKeyConditionExpression("account_id = :account_id") .withSelect(Select.ALL_PROJECTED_ATTRIBUTES) .withExpressionAttributeValues(eav); return dynamoDbMapper.query(UserAuthInfoDynEntity.class, queryExpression); } }
import java.util.ArrayList; import java.util.List; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; import com.amazonaws.services.dynamodbv2.document.Table; import com.amazonaws.services.dynamodbv2.model.AttributeDefinition; import com.amazonaws.services.dynamodbv2.model.CreateTableRequest; import com.amazonaws.services.dynamodbv2.model.CreateTableResult; import com.amazonaws.services.dynamodbv2.model.GlobalSecondaryIndex; import com.amazonaws.services.dynamodbv2.model.KeySchemaElement; import com.amazonaws.services.dynamodbv2.model.KeyType; import com.amazonaws.services.dynamodbv2.model.Projection; import com.amazonaws.services.dynamodbv2.model.ProjectionType; import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput; import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType; import lombok.extern.slf4j.Slf4j; @Slf4j @Component public class DynamodbInitConfig implements InitializingBean { @Autowired DynamoDBMapper dynamoDBMapper; @Autowired AmazonDynamoDB amazonDynamoDB; @Override public void afterPropertiesSet() throws Exception { log.info("DynamodbInitConfig afterPropertiesSet ..."); try { // List<String> tableNames = amazonDynamoDB.listTables().getTableNames(); // //// if (!tableNames.contains("user_auth_info")) { //// createTable_user_auth_info(); //// } //// if (!tableNames.contains("token_info")) { //// createTable_token_info(); //// } } catch(Exception e) { log.error("DynamodbInitConfig error ", e); } } // private void createTable() { // // List<KeySchemaElement> elements = new ArrayList<KeySchemaElement>(); // KeySchemaElement keySchemaElement = new KeySchemaElement() // .withKeyType(KeyType.HASH) // .withAttributeName("name"); // elements.add(keySchemaElement); // // List<AttributeDefinition> attributeDefinitions = new ArrayList<>(); // // attributeDefinitions.add(new AttributeDefinition() // .withAttributeName("name") // .withAttributeType(ScalarAttributeType.S)); // // CreateTableRequest createTableRequest = new CreateTableRequest() // .withTableName("Movies") // .withKeySchema(elements) // .withProvisionedThroughput(new ProvisionedThroughput() // .withReadCapacityUnits(5L) // .withWriteCapacityUnits(5L)) // .withAttributeDefinitions(attributeDefinitions); // // amazonDynamoDB.createTable(createTableRequest); // // private void createTable_user_auth_info() { // Attribute definitions ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>(); attributeDefinitions.add(new AttributeDefinition() .withAttributeName("auth_token") .withAttributeType("S")); attributeDefinitions.add(new AttributeDefinition() .withAttributeName("account_id") .withAttributeType("S")); // Table key schema ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>(); tableKeySchema.add(new KeySchemaElement() .withAttributeName("auth_token") .withKeyType(KeyType.HASH)); //Partition key // PrecipIndex GlobalSecondaryIndex precipIndex = new GlobalSecondaryIndex() .withIndexName("index_acount_id") .withProvisionedThroughput(new ProvisionedThroughput() .withReadCapacityUnits((long) 10) .withWriteCapacityUnits((long) 1)) .withProjection(new Projection().withProjectionType(ProjectionType.ALL)); ArrayList<KeySchemaElement> indexKeySchema = new ArrayList<KeySchemaElement>(); indexKeySchema.add(new KeySchemaElement() .withAttributeName("account_id") .withKeyType(KeyType.HASH)); //Partition key ; precipIndex.setKeySchema(indexKeySchema); CreateTableRequest createTableRequest = new CreateTableRequest() .withTableName("user_auth_info") .withProvisionedThroughput(new ProvisionedThroughput() .withReadCapacityUnits((long) 5) .withWriteCapacityUnits((long) 1)) .withAttributeDefinitions(attributeDefinitions) .withKeySchema(tableKeySchema) .withGlobalSecondaryIndexes(precipIndex); CreateTableResult table = amazonDynamoDB.createTable(createTableRequest); log.info(table.getTableDescription().toString()); } private void createTable_token_info() { // Attribute definitions ArrayList<AttributeDefinition> attributeDefinitions = new ArrayList<AttributeDefinition>(); attributeDefinitions.add(new AttributeDefinition() .withAttributeName("account_id") .withAttributeType("S")); // Table key schema ArrayList<KeySchemaElement> tableKeySchema = new ArrayList<KeySchemaElement>(); tableKeySchema.add(new KeySchemaElement() .withAttributeName("account_id") .withKeyType(KeyType.HASH)); //Partition key CreateTableRequest createTableRequest = new CreateTableRequest() .withTableName("token_info") .withProvisionedThroughput(new ProvisionedThroughput() .withReadCapacityUnits((long) 5) .withWriteCapacityUnits((long) 1)) .withAttributeDefinitions(attributeDefinitions) .withKeySchema(tableKeySchema); CreateTableResult table = amazonDynamoDB.createTable(createTableRequest); log.info(table.getTableDescription().toString()); } }