华为云用户手册

  • 使用Sentinel模式连接实例 样例代码: import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import static org.redisson.config.ReadMode.MASTER; public class SingleServerTests { public static void testSentinel() { Config config = new Config(); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String password = System.getenv("EXAMPLE_PASSWORD_ENV"); config.useSentinelServers() .setMasterName(master_name) .setCheckSentinelsList(false) .setReadMode(MASTER) .setPassword(password) .addSentinelAddress("redis://172.xx.xx.xx:8635"); RedissonClient redisson = Redisson.create(config); execute(redisson); // send requests to database redisson.shutdown(); } public static void main(String[] args) { testSentinel(); } } 上述代码中“172.xx.xx.xx”为待连接GeminiDB Redis实例的负载均衡地址。 您可以单击实例名称,进入“基本信息”页面,在网络信息区域获取“负载均衡地址”。 图2 查看负载均衡地址 上述代码中的“8635”为待连接GeminiDB Redis实例的端口,具体请以实际端口为准。获取端口的方法请参见查看IP地址和端口。 GeminiDB Redis只是实现了Sentinel模式的接入方式,不采用原生sentinel的可用性功能。所以样例代码中,master_name固定为“mymaster”,必须设置“CheckSentinelsList”为fasle,必须设置ReadMode为MASTER。 GeminiDB Redis支持与限制的命令,详情请参见开发运维规范。 由于GeminiDB Redis和开源Redis集群计算hash算法不同,因此GeminiDB Redis的部分命令需要给对应的key打上hash tag,否则会出现非预期的行为。hash tag使用建议参考开发运维规范。
  • 使用ClusterServer模式连接实例 样例代码: import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; public class ClusterServerTests { private static void testClusterServer() { Config config = new Config(); config.useClusterServers() .addNodeAddress("172.xx.xx.xx:8635").setPassword(password); RedissonClient redisson = Redisson.create(config); execute(redisson); // send requests to database redisson.shutdown(); } public static void main(String[] args) { testClusterServer(); } } 上述代码中“172.xx.xx.xx”为待连接GeminiDB Redis实例的负载均衡地址。 您可以单击实例名称,进入“基本信息”页面,在网络信息区域获取“负载均衡地址”。 图3 查看负载均衡地址 上述代码中的“8635”为待连接GeminiDB Redis实例的端口,具体请以实际端口为准。获取端口的方法请参见查看IP地址和端口。 GeminiDB Redis支持与限制的命令,详情请参见开发运维规范。 由于GeminiDB Redis和开源Redis集群计算hash算法不同,因此GeminiDB Redis的部分命令需要给对应的key打上hash tag,否则会出现非预期的行为。hash tag使用建议参考开发运维规范。
  • GeminiDB运维管理命令 GeminiDB在社区Redis的INFO/CLIENT/SLOW LOG /MONITOR/CONFIG等运维管理命令能力基础上,提供全面服务化且高度易用的DBA运维能力。 表2 GeminiDB Redis接口运维功能介绍 GeminiDB运维功能 GeminiDB运维功能简介 社区Redis同类命令/能力 监控指标 提供命令级别QPS/平均时延/P99时延指标。提供丰富节点级指标以及实例级汇聚指标。 INFO 实例会话 展示客户端IP信息以及Top会话统计,支持一键批量Kill会话。 CLIENT 参数配置 展示慢日志及诊断信息。 CONFIG 慢日志 审计高危命令操作。 SLOWLOG 用户权限管理 支持账号管理功能 ACL (Access Control List) 审计日志 支持一键查询与修改内核参数。是社区Redis CONFIG命令的能力加强版。 MONITOR 实时大Key诊断 实时观测大Key信息,不影响业务。 不支持 实时热Key诊断 实时观测热Key情况,不影响业务。 不支持 实时前缀Key分析 实时观测前缀Key分布,不影响业务。 不支持 高危命令重命名 支持修改命令别名以及查看重命名记录。 通过手动修改配置文件实现 异常Key熔断 一键屏蔽指定Key,拒绝被业务访问。用于快速恢复。 不支持
  • GeminiDB高级命令 exHASH类型 使用场景:GeminiDB支持为Hash Key的每个Field设置过期时间,适用于构建频控、购物车等业务。 命令列表:请参考exHash命令列表。 使用方式:请参考广告频控业务exHash方案。 布隆过滤器(BloomFilter)类型 功能介绍:布隆过滤器(BloomFilter)可用于检索某个元素是否存在于某个海量集合中,适用于Web拦截器、防缓存穿透等场景。 命令列表:请参考布隆过滤器(Bloom Filter)介绍。 使用方式:请参考布隆过滤器(Bloom Filter)命令说明。
  • GeminiDB基础命令 针对社区Redis提供的全部命令类型,GeminiDB 5.0、6.2(包含6.2.x)和7.0兼容情况如下: 表1 GeminiDB Redis接口命令兼容度 Redis命令分类 命令详情 GeminiDB Redis 5.0兼容情况 GeminiDB Redis 6.2(包含6.2.x)兼容情况 GeminiDB Redis 7.0兼容情况 String String命令列表 100%兼容 100%兼容 100%兼容 Hash Hash命令列表 100%兼容 100%兼容 100%兼容 List List命令列表 100%兼容 100%兼容 100%兼容 Sorted set Sorted set命令列表 100%兼容 100%兼容 100%兼容 Set Set命令列表 100%兼容 100%兼容 100%兼容 Bitmap Bitmap命令列表 100%兼容 100%兼容 100%兼容 Stream Stream命令列表 100%兼容 暂不支持xgroup子命令createconsumer 暂不支持7.0特性 Geo Geo命令列表 100%兼容 100%兼容 100%兼容 Hyperloglog Hyperloglog命令列表 100%兼容 100%兼容 100%兼容 发布订阅(Pub/Sub) 发布订阅命令列表 100%兼容 100%兼容 100%兼容 Lua脚本(Scripting) Lua脚本命令列表 100%兼容 100%兼容 暂不支持7.0特性 事务(Transactions) 事务命令列表 100%兼容 100%兼容 100%兼容 其他通用Key操作 其他通用Key操作 暂不支持2个命令: SWAPDB、MOVE 暂不支持2个命令: SWAPDB、MOVE 100%兼容
  • 使用须知 目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。 弹性云服务器必须处于目标实例所属安全组允许访问的范围内。 场景一:如果目标实例所属安全组为默认安全组, 则无需设置安全组规则。 场景二:如果目标实例所属安全组非默认安全组,请查看安全组规则是否允许该弹性云服务器访问。 如果安全组规则允许弹性云服务器访问,即可连接实例。 如果安全组规则不允许弹性云服务器访问,需要在实例安全组添加一条“入”的访问规则。 设置安全组的具体操作请参考配置节点安全组规则。
  • 新建独享型负载均衡器并进行配置 购买独享型负载均衡器,详情参考创建独享型负载均衡器。需要注意以下事项: 选择“规格”时,需要选择网络型(TCP/UDP)。 在网络配置中,必须开启‘跨VPC后端’, 以支持负载均衡器添加后端IP。 需要使用新创建或者已有的“弹性公网IP”,以支持公网访问。 添加监听器,详情参考添加TCP监听器。需要注意以下事项: 图1 添加监控器 在“配置监听器”时,前端协议选择TCP,前端端口建议设置为Redis常用端口6379。 在配置“添加后端服务器”时,选择“跨VPC后端”,单击“添加跨VPC后端”。在跨VPC后端IP,配置GeminiDB Redis实例的负载均衡地址、端口信息。 “配置健康检查”保持开启即可。 创建对等连接 ,选择“本端VPC”和“对端VPC”。 “本端VPC”选择ELB所在的VPC。 若选择的“所属VPC”和GeminiDB Redis在同一个虚拟私有云(VPC)中,“对端VPC”选择任一个非ELB所在的VPC。 若选择的“所属VPC”和GeminiDB Redis不在同一个虚拟私有云(VPC)中,“对端VPC”选择GeminiDB Redis实例所在的VPC。 详情参考创建相同账户下的对等连接。 单击创建好的对等连接名称,进入对等连接基本信息页面。 图2 对等连接 单击“路由表”,进入路由表基本信息页面。 图3 路由表 配置对等连接的本端路由、对端路由。 添加本端路由:单击“添加路由”,弹出“添加路由”窗口,“目的地址”输入对等连接中“对端VPC网段”值,“下一跳类型”选择“对等连接”,“下一跳”选择4中创建的对等连接,单击“确定”。 添加对端路由:单击“添加路由”,弹出“添加路由”窗口,“目的地址”输入对等连接中“本端VPC网段”值,“下一跳类型”选择“对等连接”,“下一跳”选择4中创建的对等连接,单击“确定”。 对添加的GeminiDB Redis的负载均衡地址进行健康检查,单击“监听器”,当健康检查结果为“正常”时,表示正常使用。
  • 运维规范 在日常运维工作中需关注以下运维规范,预防潜在风险并掌握关键应急方案。 表2 GeminiDB Redis运维规范 编号 运维规范 说明 1 确保您的华为云账号绑定的电话号码、电子邮箱等联系方式有效,以便及时收到服务相关通知信息。 华为云服务会在变更、升级、故障通知等必要场景通过网站、邮箱、短信、站内信等方式向您送达通知信息,请确保账号绑定的联系方式有效。 2 订阅重要告警 订阅例如大Key访问、存储容量高、连接数使用率高、CPU使用率高等告警,从而在数据库实例出现风险时提早发现并及时处理。 推荐告警配置请参考设置告警规则。 3 使用负载均衡地址访问时,需要配置访问控制管理,而不是安全组。 负载均衡地址不支持安全组,创建完成后请配置IP访问控制,如未配置白名单,所有与VPC互通的IP地址均可访问实例。具体操作请参考设置负载均衡内网访问控制。 4 配置实例自动扩容 GeminiDB Redis支持自动扩容,可以有效避免数据量突增问题。建议参见存储空间自动扩容开启自动扩容。 5 保持负载处于健康水位 如业务数据量长期高于80%,建议及时扩容。 如业务流量超过实例QPS基准,或CPU利用率长期高于80%,建议及时升级规格或增加节点,避免过载影响业务访问。 在业务流量、连接数等指标突增导致实例算力资源超载的紧急场景,应通过水平添加节点快速提升集群算力。垂直升配CPU规格为滚动模式,耗时较长,不建议用于紧急场景。 6 重命名高危命令 对于高危命令(如flushall、keys),建议您禁用或重命名,以增强实例的安全性。具体操作请参考文档命令重命名。 7 慎用账号管理中的flushall操作 具有读写权限的子账号在执行flushall时,会清空实例所有的数据。 请禁用flushall操作,确认DB后可执行flushdb操作(慎用)。 8 定期进行大key在线诊断 大Key访问是Redis使用中的常见问题。建议在控制台定期查看实例的大Key诊断报告。具体操作请参考大Key诊断。 9 割接结束后执行dbsize dbsize可以保证最终一致性,例如,在割接场景,无过期key,数据导入完成后的的数分钟执行,可得到准确值,确保数据导入前后的一致。
  • 开发规范 在开发业务程序时需重点关注以下开发规范,避免因使用方式不当影响业务稳定。 表1 GeminiDB Redis开发规范 编号 开发规范 说明 1 业务程序需具备合理的自动重连机制。 在规格变更、补丁升级、HA倒换、网络链路抖动或丢包等场景中,业务程序与数据库实例的连接可能出现短暂中断。业务程序应当支持自动重连。 说明: 尽量避免使用Lettuce客户端,因为该客户端在请求多次超时后,不再发起自动重连。建议使用更稳定的Jedis客户端替换Lettuce客户端。 2 业务程序需使用连接池并配置足够连接数。 为避免并发激增时程序获取不到连接,建议业务程序使用连接池,并配置合理的连接池参数。客户端的连接池推荐配置请参考客户端连接池参数配置。 3 针对部分重要操作,业务程序需要具备合理的命令重试机制。 在连接中断或请求超时等场景,业务程序请求可能会短时内执行失败。因此,针对部分重要操作需要设计业务容错机制,使用合理的命令重试间隔和次数,确保重要数据写入或修改成功。 4 使用正确的高可用连接地址,避免单点故障场景影响业务。 业务程序内网连接数据库时,应使用负载均衡地址,实现高可用。应避免将业务程序直连到某个单独的计算节点。 说明: 针对公网访问数据库的场景,同样应避免将业务程序直连到某个单独的计算节点,请参考通过弹性负载均衡绑定弹性公网IP连接实例使用外置ELB进行配置。 5 使用连接池,避免使用单连接以及大量短连接。 由于单连接有高可用风险,而短连接性能差且会消耗大量数据库CPU和网络资源,容易造成瓶颈,因此建议业务程序使用主流SDK的连接池连接GeminiDB Redis实例。 6 当实例中Key数量大于1000个时,禁止执行Keys命令 Keys命令是典型的高危命令,会一次性获取整个实例中的全部数据内容并返回给客户端。当实例中Key数量较多时,执行Keys命令会引起请求阻塞或实例状态异常。 7 避免元素Value过大,避免单Key包含的元素数量过多。 根据最佳实践,建议String类型Key的Value小于10KB,Hash/List/Zset/Set等类型Key中包含元素数小于5000,且单个元素Value小于1KB。 说明: 与社区Redis一样,GeminiDB Redis对大Key存储并不做严格约束,因此需要用户根据规范合理开发业务程序。 8 避免单个命令中一次性操作过多元素或产生过大的网络收发包。 建议MSET/MGET等批量操作Key命令中同时操作的Key数量小于1000。 建议HMSET、HGETALL、LRANGE、ZADD、ZRANGE等同时操作Key中多元素的命令同时操作元素数量小于1000。 由于社区Redis语法中ZREMRANGEBYSCORE命令不提供limit参数,无法控制单次删除的元素数量,建议使用ZRANGEBYSCORE (带limit)+ZREM的先查后删方式替代。 说明: 与社区Redis一样,GeminiDB Redis对大Key访问并不做严格约束,因此需要用户根据规范合理开发业务程序。 9 合理打散Key分布,避免出现热点Key或热点hashtag瓶颈。 对单个Key或具有同hashtag的一组Key的高频访问依赖会产生热Key问题,容易引发计算资源倾斜,请求排队,响应变慢等瓶颈问题。热Key的产生往往来自业务设计对Key的拆分程度不足,需要业务拆分优化。 说明: 反面案例: 对全局超大排行榜高频集中访问。 全实例中仅保存几个Hash Key,每个Key用于存储一整张表格的信息量。 商品库存业务中,全实例Key仅使用少量hashtag分桶,导致热点hashtag查询排队。 10 单次Pipeline中打包命令数量建议小于100条。 使用Pipeline时应遵循“单次少量,分多次”原则。 根据使用经验,并非Pipeline打包数量越大性能越好,不合理的Pipeline用法将可能导致实例CPU、带宽等资源瓶颈,甚至引起请求阻塞。 说明: 与社区Redis相比,GeminiDB Redis对Pipeline的使用并不做严格约束,因此需要用户根据规范合理开发业务程序。 11 避免在Lua脚本中引入高耗时代码。 使用Lua脚本时应遵循轻量化原则,避免引入执行命令次数过多、长时间sleep、大的循环语句等不合理用法。 12 避免在事务中打包过多命令。 使用事务时应遵循轻量化原则,避免单次事务中打包过多命令或复杂度过高的命令。执行的事务中包含命令过多会引起请求阻塞或实例状态异常。 13 避免在不同数据类型下使用相同的Key名称。 社区Redis强制禁止在不同数据类型下使用相同的Key名称。虽然GeminiDB Redis对此不做强制约束,但开发时应当避免此类用法,保持程序清晰和易维护。 14 谨慎使用批量删除命令 若针对一个包含大量元素的LIST/ZSET对象使用批量删除命令(例如LREM/LTRIM/ZREMBYSCORE等),要避免在单条命令中删除过多的数据(比如删除数万或者数十万元素)。过多的数据删除可能导致该条删除命令耗时过长,影响其它正常命令,或者导致系统内存OOM进程重启,实例异常;极端场景下,造成服务进程反复拉起失败。
  • 设置了安全组,还需要设置负载均衡内网访问控制吗? 用户可以通过节点和负载均衡两种方式访问GeminiDB Redis实例, 因此需要同时设置安全组和负载均衡内网访问控制,以保证实例的安全性: 安全组仅对节点生效。安全组是一个逻辑上的分组,为同一个虚拟私有云内具有相同安全保护需求,并相互信任的弹性云服务器和GeminiDB Redis实例提供访问策略。具体操作步骤请参考配置节点安全组规则。 安全组无法对负载均衡生效。在默认未配置的状态下,所有与所在VPC互通的IP地址均可通过负载均衡地址访问实例。因此,同时需要合理配置,具体配置操作请参考设置负载均衡内网访问控制。 父主题: 数据库连接
  • 迁移场景 表1 迁移场景 序号 源端 目标端 迁移方案 1 阿里云Redis/Tair GeminiDB Redis 阿里云数据库Redis/Tair到GeminiDB Redis的迁移 2 腾讯云Redis GeminiDB Redis 腾讯云Redis到GeminiDB Redis的迁移 3 自建Redis/Codis GeminiDB Redis 自建Redis到GeminiDB Redis的迁移 4 RDB GeminiDB Redis RDB文件恢复到GeminiDB Redis(推荐) 5 自建Kvrocks GeminiDB Redis Kvrocks到GeminiDB Redis的迁移 6 自建Pika GeminiDB Redis Pika到GeminiDB Redis的迁移 7 自建SSDB GeminiDB Redis SSDB到GeminiDB Redis的迁移 8 自建LevelDB GeminiDB Redis LevelDB到GeminiDB Redis的迁移 9 自建RocksDB GeminiDB Redis RocksDB到GeminiDB Redis的迁移 10 AWS ElasticCache for Redis GeminiDB Redis AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移 11 GeminiDB Redis 自建Redis/GeminiDB Redis 使用DRS服务将GeminiDB Redis迁移到Redis(推荐)
  • 迁移工具 DRS服务:华为云 数据复制服务 DRS(Data Replication Service)提供数据库零停机的迁移上云体验,支持全量数据迁移和增量数据迁移,为您提供安全稳定高可靠的迁移链路,详情请参考迁移方案概览。 Redis-Shake工具:Redis-Shake是一款开源迁移工具,支持全量扫描(rump)、数据恢复(restore)、增量同步(sync)等迁移方式,灵活方便。将工具下载到一台E CS 上即可用命令行形式方便迁移。
  • 使用须知 目标实例必须与弹性云服务器在同一个虚拟私有云和子网内才能访问。 弹性云服务器必须处于目标实例所属安全组允许访问的范围内。 场景一:如果目标实例所属安全组为默认安全组, 则无需设置安全组规则。 场景二:如果目标实例所属安全组非默认安全组,请查看安全组规则是否允许该弹性云服务器访问。 如果安全组规则允许弹性云服务器访问,即可连接实例。 如果安全组规则不允许弹性云服务器访问,需要在实例安全组添加一条“入”的访问规则。 设置安全组的具体操作请参考配置节点安全组规则。
  • 操作步骤 获取GeminiDB Redis实例的负载均衡地址和端口信息。 负载均衡地址的查看方法请参见查看负载均衡地址及端口。 端口信息的获取方法请参见查看实例节点端口。 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“登录弹性云服务器”。 使用Golang客户端连接GeminiDB Redis实例,本文以使用go-redis SDK为例。 go-redis的下载地址为:https://github.com/go-redis/redis。 使用单机方式连接GeminiDB Redis集群 package main import ( "fmt" "github.com/go-redis/redis" "os" ) func main() { // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 password = os.Getenv("EXAMPLE_PASSWORD_ENV") client := redis.NewClient(&redis.Options{ Addr: "xx.xx.xx.xx:8635", //步骤1获取到的负载均衡地址 Password: password, DB: 0, // 使用默认的0号数据库 }) pong, err := client.Ping().Result() fmt.Println(pong, err) err = client.Set("key1", "value1", 0).Err() if err != nil { panic(err) } val, err := client.Get("key1").Result() if err != nil { panic(err) } fmt.Println("key1", val) } 预期输出为: PONG key1 value1 使用go-redis连接GeminiDB Redis时,需要使用普通模式,不能使用集群模式,如上示例代码所示。 上述实例代码中的GeminiDB Redis地址和密码,请根据实际情况填写。 使用集群方式连接GeminiDB Redis集群 package main import ( "fmt" "github.com/go-redis/redis" ) func main() { client := redis.NewClusterClient(&redis.ClusterOptions{ Addrs: []string{ // 步骤1获取到的负载均衡地址 " xx.xx.xx.xx:8635", }, Password: "xx", // 密码 }) pong, err := client.Ping().Result() fmt.Println(pong, err) err = client.Set("key1", "value1", 0).Err() if err != nil { panic(err) } val, err := client.Get("key1").Result() if err != nil { panic(err) } fmt.Println("key1", val) }
  • 操作步骤 获取GeminiDB Redis实例的负载均衡地址和端口信息。 负载均衡地址的查看方法请参见查看查看负载均衡地址及端口。 端口信息的获取方法请参见查看查看实例节点端口。 各实例地址的查看方法请参见查看查看内网IP地址或弹性公网IP。 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“登录弹性云服务器”。 安装.Net。Windows主机前往进入.NET官网下载,Linux主机需要安装 .NET Core 的密钥和存储库,再安装.Net运行时和SDK: sudo rpm -Uvh https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm sudo yum install dotnet-sdk-7.0 sudo yum install dotnet-runtime-7.0 运行 dotnet --version 您将会看到您的.Net版本信息。 使用StackExchange.Redis客户端连接GeminiDB Redis实例。 创建项目 在命令行窗口中运行以下命令创建一个新的C#控制台应用程序;或者在Visual Studio中创建一个新的C#控制台应用程序。 dotnet new console -o redisdemo 安装Redis的C#客户端 StackExchange.Redis包。Visual Studio中您可以从NuGet包管理器中安装StackExchange.Redis。或者dotnet项目所在的命令行窗口,运行以下命令: dotnet add package StackExchange.Redis 使用单机方式连接GeminiDB Redis using System; using StackExchange.Redis; namespace redisdemo { class Program { static void Main(string[] args) { // 创建一个连接到Redis服务器的ConnectionMultiplexer对象 string redisConnectionString = " 192.xx.xx.xx:6379"; // 步骤1获取到的负载均衡地址 ConfigurationOptions options = ConfigurationOptions.Parse(redisConnectionString); // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 string password = Environment.GetEnvironmentVariable("EXAMPLE_PASSWORD_ENV"); options.Password = password; ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options); // 获取Redis数据库对象 IDatabase redisDb = redis.GetDatabase(); // 设置一个键值对 string key = "mykey"; string value = "myvalue"; redisDb.StringSet(key, value); string valueGet = redisDb.StringGet(key); Console.WriteLine($"键 {key} 对应的值为:{valueGet}"); } } } 预期输出 键 mykey 对应的值为:myvalue 使用集群方式连接GeminiDB Redis集群 using System; using StackExchange.Redis; namespace redisdemo { class Program { static void Main(string[] args) { ConfigurationOptions options = new ConfigurationOptions(); options.EndPoints.Add("192.xx.xx.xx:6379"); // 步骤1获得的实例集群节点1的地址和端口号 options.EndPoints.Add("192.xx.xx.xx:6379"); // 步骤1获得的实例集群节点2的地址和端口号 options.Password = "your_password"; // 设置密码 ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(options); // 获取Redis数据库对象 IDatabase redisDb = redis.GetDatabase(); // 设置一个键值对 string key = "mykey"; string value = "myvalue"; redisDb.StringSet(key, value); string valueGet = redisDb.StringGet(key); Console.WriteLine($"键 {key} 对应的值为:{valueGet}"); } } } 预期输出 键 mykey 对应的值为:myvalue
  • 注意事项 该功能需升级到特定版本,您可以提工单联系客服咨询实例版本是否支持该功能。 由于APPEND命令对顺序有要求,因此整个流程要避免出现APPEND乱序(并发APPEND的场景)。 可以使⽤PIPELINE模式加速,PIPELINE本⾝也是保证执⾏顺序的,因此不会有乱序的问题。 拆分的粒度可以根据实际情况选择,拆的越细,产⽣的时延⽑刺就越⼩,但是初始化时间就越⻓,通常建议256KB-1MB左右的值。
  • 入门实践 当您购买并连接了GeminiDB Redis数据库实例后,可以根据自身的业务需求使用GeminiDB Redis提供的一系列常用实践。 表1 常用最佳实践 实践 描述 数据迁移 阿里云数据库Redis/Tair到GeminiDB Redis的迁移 本实践主要介绍阿里云数据库Redis/Tair到GeminiDB Redis的迁移方案。使用阿里云的数据迁移工具DTS中的数据迁移功能,该功能支持将阿里云Redis服务的数据迁移至其他Redis服务中,利用该工具避开阿里云 Redis服务屏蔽sync和psync命令限制,实现数据从阿里云Redis服务迁移至华为云GeminiDB Redis中。 腾讯云Redis到GeminiDB Redis的迁移 本实践主要介绍腾讯云Redis到GeminiDB Redis的迁移方案。使用腾讯云的数据迁移工具DTS中的数据同步功能,该功能支持将腾讯云 Redis服务的数据迁移至ECS自建Redis中,利用该工具避开腾讯云 Redis服务屏蔽分片实际IP,实现数据从腾讯云 Redis服务迁移至华为云GeminiDB Redis中。 自建Redis到GeminiDB Redis的迁移 本实践主要介绍自建Redis到GeminiDB Redis的迁移方案。使用Redis-Shake迁移工具进行源端Redis到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移,支持单机/主从/Cluster集群/RDB文件等多种Redis数据源。 RDB文件恢复到GeminiDB Redis(推荐) 本实践主要介绍RDB到GeminiDB Redis的迁移方案。使用Redis-Shake迁移工具进行源端RDB到目标端GeminiDB Redis的迁移。迁移过程支持全量+增量迁移。 Kvrocks到GeminiDB Redis的迁移 本实践主要介绍Kvrocks到GeminiDB Redis的迁移方案。使用开源工具kvrocks2redis进行Kvrocks到GeminiDB Redis的迁移,在此基础上,从GeminiDB Redis源码层面对Kvrocks的namespace功能进行适配。 Pika到GeminiDB Redis的迁移 本实践主要介绍Pika到GeminiDB Redis的迁移方案。pika-port伪装成Pika的从节点运行,通过主从复制的方式进行数据迁移。Pika主节点通过比较pika-port和自己的binlog偏移量判断做全量迁移还是增量迁移。如果需要做全量迁移,Pika主节点会将全量数据快照发送给pika-port,pika-port将解析后的快照数据发送给GeminiDB Redis。全量迁移结束后进入增量迁移,pika-port将增量数据解析后以redis命令的形式发送给GeminiDB Redis。 SSDB到GeminiDB Redis的迁移 本实践主要介绍SSDB到GeminiDB Redis的迁移方案。ssdb-port作为源端SSDB数据库的主节点的从节点(replica)运行,通过主从复制的方式进行数据迁移。将获取到的数据解析、转换为Redis支持的格式,并发送到配置文件中指定的Redis实例。全量同步完成后,SSDB中新增的数据也会同步到Redis实例中。 LevelDB到GeminiDB Redis的迁移 本实践主要介绍LevelDB到GeminiDB Redis的迁移方案。使用自研迁移工具leveldb-port,和LevelDB部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。 RocksDB到GeminiDB Redis的迁移 本实践主要介绍RocksDB到GeminiDB Redis的迁移方案。使用自研迁移工具rocksdb-port,和RocksDB部署在相同机器上,准备好配置文件,启动迁移即可自动完成全量与增量的迁移。 AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移 本实践主要介绍AWS ElasticCache for Redis到GeminiDB Redis的迁移方案。AWS ElasticCache for Redis通过备份导出RDB文件后,通过Redis-Shake迁移工具的数据恢复(restore)将数据迁移到GeminiDB Redis。 数据备份 管理自动备份 介绍如何在数据库实例的备份时段中创建数据库实例的自动备份,系统根据您指定的备份保留期保存数据库实例的自动备份。 管理手动备份 介绍如何为数据库实例手动备份数据,用户可以通过手动备份恢复数据,从而保证数据可靠性。 数据恢复 恢复备份到新实例 介绍如何使用已有的自动备份或手动备份恢复实例数据到新建实例,恢复后的数据与该备份生成时的实例数据一致。 日志管理 慢日志 GeminiDB Redis支持查看数据库级别的慢日志,执行时间的单位为ms。通过该日志,可查找出执行效率低的语句,以便优化。 父主题: 快速入门
  • 迁移原理 使用开源工具kvrocks2redis进行Kvrocks到GeminiDB Redis的迁移,在此基础上,从GeminiDB Redis源码层面对Kvrocks的namespace功能进行适配。 迁移过程分为全量和增量两个阶段:迁移开始后,先进行全量迁移,此时对kvrocks打快照,并记录对应的数据版本(seq)。然后解析全量数据文件成redis命令写入GeminiDB Redis。全量迁移完成后进入持续的增量迁移过程,迁移工具循环给Kvrocks发送PSYNC命令,将获取到的增量数据不断转发给GeminiDB Redis,完成增量迁移 。
  • 计费模式概述 GeminiDB Redis提供包年/包月和按需计费两种计费模式,以满足不同场景下的用户需求。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。购买周期越长,享受的折扣越大。一般适用于设备需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照实例实际使用时长计费,秒级计费,按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用,无需提前预置资源,从而降低预置过多或不足的风险。一般适用于电商抢购等设备需求量瞬间大幅波动的场景。 表1列出了两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费。 按照订单的购买周期结算。 后付费。 按照实例实际使用时长计费。 计费周期 按订单的购买周期计费。 秒级计费,按小时结算。 适用计费项 实例规格(vCPU和内存)、存储空间、备份空间、弹性公网IP 实例规格(vCPU和内存)、存储空间、备份空间、弹性公网IP 变更计费模式 支持变更为按需计费模式。但包年/包月资费模式到期后,按需的资费模式才会生效。详情请参考包年/包月转按需。 支持变更为包年/包月计费模式。详情请参考按需转包年/包月。 变更规格 支持变更实例规格。 支持变更实例规格。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于计算资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 使用JedisPool访问(推荐) 样例代码 import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class JedisPoolTests { private static void testPool() { // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String pwd = System.getenv("EXAMPLE_PASSWORD_ENV"); JedisPool pool = new JedisPool(new GenericObjectPoolConfig(), "172.xx.xx.xx", 8635, 2000, pwd); Jedis jedis = pool.getResource(); try { System.out.println(jedis.hgetAll("676296")); System.out.println(jedis.set("key1", "value1")); } finally { jedis.close(); } pool.destroy(); } public static void main(String[] args) { testPool(); } }
  • 使用JedisCluster访问 样例代码 import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; public class ClusterTests { private static void testCluster() { String pwd = "a"; JedisCluster cluster = new JedisCluster(new HostAndPort("172.xx.xx.xx", 8635), 200, 2000, 5, pwd, new GenericObjectPoolConfig()); System.out.println(cluster.hgetAll("676296")); System.out.println(cluster.set("key1", "value1")); } public static void main(String[] args) { testCluster(); } }
  • 使用须知 默认情况下,一个租户可以创建500条安全组规则。 为一个安全组配置过多的安全组规则会增加首包延时,因此,建议一个安全组内的安全组规则不超过50条。 目前一个GeminiDB Redis实例仅允许绑定一个安全组。 内网和公网连接实例时,需要配置的安全组规则请参见表1。 表1 安全组规则说明 场景 配置的安全组规则说明 内网连接实例 使用内网连接GeminiDB Redis实例时,配置安全组规则分为以下两种情况: 若用户有一个GeminiDB Redis实例,想用一个ECS连接时,此ECS与GeminiDB Redis实例在相同安全组时,默认ECS与GeminiDB Redis实例互通,无需配置安全组规则。 ECS与GeminiDB Redis实例在不同安全组时,需要为GeminiDB Redis和ECS分别配置安全组规则。 配置GeminiDB Redis安全组规则:为GeminiDB Redis所在安全组配置相应的入方向规则,具体操作请参见操作步骤。 配置ECS安全组规则:安全组默认规则为出方向上数据报文全部放行,此时,无需对ECS配置安全组规则。当在ECS所在安全组为非默认安全组且出方向规则非全放通时,需要为ECS所在安全组配置相应的出方向规则。具体操作请参见《弹性云服务器用户指南》中“配置安全组规则”章节。 公网连接实例 使用公网连接GeminiDB Redis实例时,需要为GeminiDB Redis所在安全组配置相应的入方向规则。具体操作请参见操作步骤。
  • 异地双活原理介绍 GeminiDB Cassandra提供了异地双活功能,通过异地实例间数据的双向同步和业务灵活调度能力,实现了业务恢复和故障恢复解耦,保障了故障场景下业务的连续性。 异地双活是一种多活容灾架构的解决⽅案,即部署在不同数据中心的GeminiDB Cassandra数据库可以同时为用户业务提供服务。当一个数据中心发生故障而另一个数据中心正常运行时,可以通过业务层的调度将故障区域的业务切换到正常区域,因为配置了异地双活,您可以在数据中心运行正常的区域继续处理数据。在业务不中断的前提下实现故障场景下业务的快速恢复,保证了故障场景下业务的连续性。 配置异地双活功能的具体操作请参见搭建双活关系。 父主题: 异地双活
  • 大key问题 可能原因: 大key的产生,最主要的原因是主键设计不合理,使得单个分区的记录数或数据量过大。一旦某一个分区出现极大时,对该分区的访问,会造成分区所在服务器的负载变高,甚至造成节点内存溢出(OOM)等。 处理思路: 针对大key问题,一般采取如下两种处理思路。 增加缓存,优化表结构。 基于现有分区键,增加分区键散列。对数据进行打散,避免单个分区的记录过大。 检测方法: 通过长时间的业务观察,我们规定以下阈值,超过任何一个条件的阈值即为大key。 单个分区键的行数不能超过10万。 单个分区的大小不超过100MB。 GeminiDB Cassandra支持了大key的检测与告警。在 CES 界面,可以配置实例的大key告警,具体方法请参见设置告警规则。 当发生大key事件时,系统会第一时间发送预警通知,您可以前往CES界面查看监控事件数据,及时处理,避免业务波动。 图1 大key告警查看事件 告警字段说明如下: [ { "partition_size": "1008293497", //超大分区键的总大小 "timestamp": "2021-09-08 07:08:18,240", //大key产生时间 "partition_num": "676826", //超大分区键的总行数 "keyspace_name": "ssss", //keyspace名称 "node_id": "ae342330ded14605b6304e80e6a6efeeno06", //节点id "table_name": "zzzz", //表名称 "table_id": "024a1070-0064-11eb-bdf3-d3fe5956183b", //表id "partition_key": "{vin=TESTW3YWZD2021003}" //分区键 } ] 常见案例及解决方案: 案例1:某集群的数据量过大,导致集群存在大分区键(排查数量大概为2000+),最大的分区键达到38GB。当业务频繁访问这部分大的分区键时,会导致节点持续高负载,影响业务请求成功率。 该案例中表结构设计如下: 表设计分析: 上述movie表保存了短视频的相关信息,分区键为movieid,并且保存了用户信息(uid)。如果movieid是一个热门短视频,有几千万甚至上亿用户点赞此短视频,则该热门短视频所在的分区非常大(当前发现有38GB)。 解决方法: 针对上述案例中问题,可以通过如下方法解决。 优化表结构。 创建新表保存热门短视频信息,只保留短视频公共信息,不包含用户信息,确保该表不会产生大的分区键。热门短视频信息写入该表中。 增加缓存 业务应用先从缓存中读取热门文件信息,没有查询到,则从数据库中查询,减少数据库查询次数。 整体优化逻辑如下: 先查缓存,当缓存存在,直接返回结果。 当缓存不存在,查询热门视频缓存(缓存不存在,则查询hot表),当视频为为热门视频时,查询hotmovieaccess表。 当hotmovieaccess表存在结果时,直接返回。当hotmovieaccess表不存在记录时,查询movie表。 并缓存查询结果。 案例2:movie_meta以月度建表,每个表只存当月的数据,初始的这种设计是可以减轻或规避分区键过大问题的。由于业务频繁写入,热门视频存储的记录非常多,还是形成了大的数据分区。 解决方法: 新分区键增加一个随机数(0~999):将原来一个分区存储的信息随机离散存储到1000个分区中。采用新的分区键之后,没有形成新超过100MB的分区键,旧的超过100MB的分区键数据,随着时间过期即可。
  • 热key问题 热key的危害: 在日常生活中,经常会发生各种热门事件,应用中对该热点新闻进行上万次的点击浏览和评论时,会形成一个较大的请求量。这种情况下会造成短时间内对同一个key频繁操作,会导致key所在节点的CPU和负载突然升高,从而影响落在该节点的其他请求,导致业务成功率下降。诸如此类的还有热门商品促销,网红直播等场景,这些典型的读多写少的场景也会产生热点问题。 热key问题会产生如下危害: 流量集中,达到物理网卡上限。 请求过多,缓存分片服务被打垮。 数据库击穿,引起业务雪崩。 处理思路: 针对热key问题,一般采取如下处理思路。 设计上需要考虑热key的问题,避免在数据库上产生热key。 业务侧通过增加缓存来减少热key出现的情况。考虑多级缓存解决热key问题(如Redis + 本地二级缓存) 屏蔽热点key。 比如:在业务侧进行定制,支持热key黑白名单能力,可以将热key临时屏蔽。 检测方法: 我们定义访问频率大于100000 次/min的key为热key。 热key事件分为两种类型。一种是Writes事件,代表写热点,一种是Reads事件,表示读热点。 GeminiDB Cassandra提供了热key的监测与告警。在CES界面,可以配置实例的热key告警,具体方法请参见设置告警规则。 当发生热key事件时,系统会第一时间发送预警通知,您可以前往CES界面查看监控事件数据,及时处理,避免业务波动。 图2 热key告警 热key告警字段说明: { "sampler_type": "WRITES", //采样类型。取值有WRITES,READS;WRITES代表写,READS代表读。 "partition_num": "2969", //分区键的热点次数 "keyspace_name": "performance", //keyspace名称 "table_id": "a10f3bb0-3626-11ec-bbdf-63e05bbb4391", //表id "table_name": "stresstable", //表名 "partition_key": "85897376" //产生热点分区键的值 }
  • 总结 在线业务在使用Cassandra时,必须执行相关的开发规则和使用规范,在开发设计阶段就降低使用风险,合理的设计会降低大部份风险发生的概率。 任何表的设计都要考虑是否会造成热key或者大key的产生,是否会造成负载倾斜的问题。 建立数据过期机制,表中的数据不能无限制的增长而不删除或者过期。 针对读多写少的场景,要增加缓存机制,来应对读热点问题,并提升查询性能。 对于每个PK以及每行Row的大小,要控制大小,否则将影响性能和稳定性。超出后要及时优化。
  • 数据模型建立建议和原则 在操作GeminiDB Cassandra之前,需要进行业务建模,基于应用的特性来组织数据(设计primary key)以及存取数据。 No JOIN:GeminiDB Cassandra不支持JOIN,如果您需要用到JOIN,需要自己在客户端处理,或者在新建一个表进行处理。 No referential integrity:不支持跨表引用完整性的概念,不支持在某个表中通过外键引用另一张表数据。 Denormalization:反范式化。 Query-first的设计:和RDBMS不同的是,优先考虑基于查询进行设计,而不是类似关系数据库,需要优先设计模型。 Designing for optimal storage:关系型数据库表如何存储是对用户透明的,但是GeminiDB Cassandra的建模需要考虑到数据在磁盘上的存储规则,需要尽量让数据分布的partition少。 Sorting is a design decision:查询上的排序是在建表时候设定好的。
  • 计费模式概述 GeminiDB Cassandra提供包年/包月和按需计费两种计费模式,以满足不同场景下的用户需求。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。购买周期越长,享受的折扣越大。一般适用于设备需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照实例实际使用时长计费,秒级计费,按小时结算。按需计费模式允许您根据实际业务需求灵活地调整资源使用,无需提前预置资源,从而降低预置过多或不足的风险。一般适用于电商抢购等设备需求量瞬间大幅波动的场景。 表1列出了两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费。 按照订单的购买周期结算。 后付费。 按照实例实际使用时长计费。 计费周期 按订单的购买周期计费。 秒级计费,按小时结算。 适用计费项 实例规格(vCPU和内存)、存储空间、备份空间、弹性公网IP 实例规格(vCPU和内存)、存储空间、备份空间、弹性公网IP 变更计费模式 支持变更为按需计费模式。但包年/包月资费模式到期后,按需的资费模式才会生效。详情请参考包年/包月转按需。 支持变更为包年/包月计费模式。详情请参考按需转包年/包月。 变更规格 支持变更实例规格。 支持变更实例规格。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于计算资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 兼容的接口列表 表1 接口列表 接口名称 CreateTable UpdateTable DescribeTable ListTables DeleteTable PutItem UpdateItem GetItem DeleteItem BatchWriteItem BatchGetItem Query Scan UpdateTimeToLive 表2 CreateTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 CreateTable 请求参数 AttributeDefinitions 是 是 - KeySchema 是 是 - TableName 是 是 Table Name 字符长度3~48,正则表达式([\w-]+)。 BillingMode 否 否 计费属性,暂不支持。 GlobalSecondaryIndexes 否 是 - LocalSecondaryIndexes 否 是 - ProvisionedThroughput 否 是 - SSESpecification 否 否 当前版本不支持,规划中。 StreamSpecification 否 否 当前版本不支持,规划中。 Tags 否 否 当前版本不支持,规划中。 返回参数 TableDescription - 是 - 表3 UpdateTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 UpdateTable 请求参数 AttributeDefinitions 否 是 - BillingMode 否 否 计费属性,不予支持。 GlobalSecondaryIndexesUpdates 是 是 支持Create和Delete,不支持Update。 ProvisionedThroughput 否 否 计费属性,不予支持。 ReplicaUpdates 否 否 默认强一致性。 SSESpecification 否 否 当前版本不支持,规划中。 StreamSpecification 否 否 当前版本不支持,规划中。 TableName 是 是 - 返回参数 TableDescription - 是 - 表4 DescribeTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 DescribeTable 请求参数 TableName 是 是 - 返回参数 Table - 是 不支持itemCount字段。 表5 ListTables接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 ListTables 请求参数 ExclusiveStartTableName 否 是 - Limit 否 是 - 返回参数 LastEvaluatedTableName - 是 - TableNames - 是 - 表6 DeleteTable接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 DeleteTable 请求参数 TableName 是 是 - 返回参数 TableDescription - 是 - 表7 PutItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 PutItem 请求参数 Item 是 是 - TableName 是 是 - ConditionalOperator 否 否 遗弃参数,见ConditionExpression。 ConditionExpression 否 是 - Expected 否 否 遗弃参数,见该接口中ConditionExpression字段。 ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 ReturnValues 否 是 - 返回参数 Attributes - 是 - ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 表8 UpdateItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 UpdateItem 请求参数 Key 是 是 - TableName 是 是 - AttributeUpdates 否 否 遗弃参数,见该接口中UpdateExpression字段。 ConditionalOperator 否 否 遗弃参数,见该接口中UpdateExpression字段。 ConditionExpression 否 是 - Expected 否 否 遗弃参数,见该接口中UpdateExpression字段。 ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 ReturnValues 否 是 - UpdateExpression 否 是 - 返回参数 Attributes - 是 - ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 表9 GetItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 GetItem 请求参数 Key 是 是 - TableName 是 是 - AttributesToGet 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConsistentRead 否 否 默认强一致性。 ExpressionAttributeNames 否 是 - ProjectionExpression 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 返回参数 ConsumedCapacity - 否 计费属性,暂不支持。 Item - 是 - 表10 DeleteItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 DeleteItem 请求参数 Key 是 是 - TableName 是 是 - ConditionalOperator 否 否 遗弃参数,见该接口中ConditionExpression字段。 ConditionExpression 否 是 - Expected 否 否 遗弃参数,见该接口中ConditionExpression字段。 ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 ReturnValues 否 是 - 返回参数 Attributes - 是 - ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 表11 BatchWriteItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 BatchWriteItem 请求参数 RequestItems 是 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ReturnItemCollectionMetrics 否 否 统计属性,暂不支持。 返回参数 ConsumedCapacity - 否 计费属性,暂不支持。 ItemCollectionMetrics - 否 统计属性,暂不支持。 UnprocessedItems - 是 - 表12 BatchGetItem接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 BatchGetItem 请求参数 RequestItems 是 是 无 ReturnConsumedCapacity 否 否 计费属性,暂不支持。 返回参数 ConsumedCapacity - 否 统计属性,暂不支持。 Responses - 是 - UnprocessedKeys - 是 - 表13 Query接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 Query 请求参数 TableName 是 是 - AttributesToGet 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConditionalOperator 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConsistentRead 否 否 默认强一致性。 ExclusiveStartKey 否 是 - ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - FilterExpression 否 是 - IndexName 否 是 - KeyConditionExpression 否 是 - KeyConditions 否 否 遗弃参数,见该接口中KeyConditionExpression字段。 Limit 否 是 - ProjectionExpression 否 是 - QueryFilter 否 否 遗弃参数,见该接口中FilterExpression字段。 ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ScanIndexForward 否 是 - Select 否 是 不支持Count。 返回参数 ConsumedCapacity - 否 计费属性,暂不支持。 Count - 是 - Items - 是 - LastEvaluatedKey - 是 - ScannedCount - 是 - 表14 Scan接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 Scan 请求参数 TableName 是 是 - AttributesToGet 否 否 遗弃参数,见该接口中ProjectionExpression字段。 ConditionalOperator 否 否 遗弃参数,见该接口中ConditionExpression字段。 ConsistentRead 否 否 默认强一致性。 ExclusiveStartKey 否 是 - ExpressionAttributeNames 否 是 - ExpressionAttributeValues 否 是 - FilterExpression 否 是 - IndexName 否 是 - Limit 否 是 - ProjectionExpression 否 是 - ReturnConsumedCapacity 否 否 计费属性,暂不支持。 ScanFilter 否 否 遗弃参数,该接口中FilterExpression字段。 Segment 否 是 - Select 否 是 不支持Count类型。 TotalSegments 否 是 - 返回参数 ConsumedCapacity 否 否 计费属性,暂不支持。 Count - 是 - Items - 是 - LastEvaluatedKey - 是 - ScannedCount - 是 - 表15 UpdateTimeToLive接口兼容性介绍 接口名称 参数 是否必选 是否支持 备注 UpdateTimeToLive 请求参数 TableName 是 是 - TimeToLiveSpecification 是 是 - 返回参数 TimeToLiveSpecification - 是 -
  • 使用须知 流量统计以及流量限制,当前版本不支持。 Stream功能、事务功能(TransactWriteItems, TransactGetItems) 不支持。 不支持按需备份接口:CreateBackup、DescribeBackup、 DeleteBackup, ListBackups, RestoreTableFromBackup。 在DynamoDB中,哈希键(或分区键)决定项目将存储在DynamoDB内部存储中的位置。DynamoDB使用专有的哈希函数,GeminiDB DynamoDB采用的是Murmur3算法,这种差异会导致Scan操作在DynamoDB和GeminiDB DynamoDB数据返回的顺序不同。 DynamoDB应用程序指定一个Endpoint地址,采用客户端的负载均衡插件,将请求均匀的发送到后端节点。若不使用该插件,则只会连接单个Endponit。详细负载均衡代码包可联系客服提供。 表/索引名称中不能包含.。 由于编码方式的不同,每行数据大小不会严格400K限制, DDL接口均为同步接口。
共100000条