- 最新动态
- 功能总览
- 服务公告
- 产品介绍
-
GeminiDB Redis接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Redis实例
- 实例连接及管理
-
数据迁移
- Redis数据迁移方案概览
- 使用DRS服务将GeminiDB Redis迁移到Redis(推荐)
- 阿里云数据库Redis/Tair到GeminiDB Redis的迁移
- 腾讯云Redis到GeminiDB Redis的迁移
- 使用DRS服务将自建Redis或者Redis集群迁移到GeminiDB Redis(推荐)
- 通过Redis-Shake迁移工具将自建Redis迁移到GeminiDB Redis
- 使用Redis-Shake工具将RDB文件/AOF文件 导入到GeminiDB Redis
- 使用数据导入功能将RDB文件恢复到GeminiDB Redis(推荐)
- Kvrocks到GeminiDB Redis的迁移
- Pika到GeminiDB Redis的迁移
- SSDB到GeminiDB Redis的迁移
- LevelDB到GeminiDB Redis的迁移
- RocksDB到GeminiDB Redis的迁移
- AWS ElasticCache for Redis数据库到GeminiDB Redis的迁移
- 迁移后Redis数据一致性校验
- 实例管理
- 变更实例
- 数据备份
- 数据恢复
- 诊断分析
- 账号与安全
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- GeminiDB Redis标签管理
- GeminiDB Redis用户资源配额
- 通过GeminiDB Redis实现MySQL内存加速
- 开发参考
- 最佳实践
- 性能白皮书
-
常见问题
- 高频常见问题
-
产品咨询
- GeminiDB Redis和开源Redis、其他开源Redis云服务有什么区别?
- 和开源Redis相比,GeminiDB Redis性能如何?
- GeminiDB Redis兼容Redis哪些版本,兼容哪些命令,客户端连接是否需要修改
- 自建Redis是否可以搬迁至GeminiDB Redis,需要注意什么
- 什么是GeminiDB Redis实例可用性
- GeminiDB Redis实例总容量是总内存吗,内存和容量之间是什么联系
- 购买GeminiDB Redis实例时,如何选择合适的节点规格和节点数量?
- 购买x GB的GeminiDB Redis的实例,优选主备还是集群?
- GeminiDB Redis持久化机制是怎样的,会丢数据吗
- GeminiDB Redis的内存淘汰策略是什么
- GeminiDB Redis是否支持布隆过滤器等modules
- 计费相关
-
数据库使用
- scan指定match参数,数据中确实存在匹配的key,为什么返回的是空
- 业务侧原本做了数据分片,切换到GeminiDB Redis后如何处理这部分逻辑
- GeminiDB Redis接口是否支持keys命令的模糊查询
- GeminiDB Redis是否支持多DB
- 对于scan类的操作,GeminiDB Redis接口与开源Redis 5.0的返回值顺序为什么有差异
- 针对某些不合法命令,GeminiDB Redis接口与开源Redis 5.0的报错信息为什么有差异
- 如何处理报错:CROSSSLOT Keys in request don't hash to the same slot
- GeminiDB Redis单次事务推荐包含的命令条数
- GeminiDB Redis集群版实例中,哪些命令需要使用hashtag
- 如何处理报错“ERR unknown command sentinel"
- 对于阻塞命令,GeminiDB Redis接口(主备实例)与开源Redis的返回值为什么可能有差异
- GeminiDB Redis存储扩容需要多久,对业务有影响吗?
- GeminiDB Redis多个节点同时扩容需要多长时间,对业务影响如何?
- GeminiDB Redis规格变更包含的在线变更和离线变更有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis版本补丁升级包含的在线升级和离线升级有什么区别,通常需要多长时间,对业务有哪些影响?
- GeminiDB Redis备份文件是否可以下载到本地,是否支持线下恢复数据
- GeminiDB Redis数据备份工作机制是怎样的,对业务有哪些影响?
- 购买GeminiDB Redis 1U*2节点特惠型实例后,业务访问量比较少,但CPU占用率比较高,是什么原因?
- GeminiDB Redis监控面板上key数量下降又恢复至正常数量是什么原因?
- GeminiDB Redis节点CPU偶发冲高,可能是哪些原因
- GeminiDB Redis如何从5.0版本升级到6.2版本
- GeminiDB Redis什么时候进入只读
-
数据库连接
- 如何接入GeminiDB Redis
- 如何使用GeminiDB Redis提供的多个节点IP地址
- GeminiDB Redis提供的ELB的实现方式是怎样的
- 如何创建和连接弹性云服务器
- GeminiDB Redis实例购买成功后是否支持更换VPC
- 绑定了弹性公网IP但是连接不上数据库
- 内网如何访问GeminiDB Redis
- GeminiDB Redis自带的负载均衡地址是否能绑定公网IP?如何通过公网连接GeminiDB Redis实例?
- 设置了安全组,还需要设置负载均衡内网访问控制吗?
- 如何处理客户端连接池报错“Could not get a resource from the pool”
- 常见客户端报错及解决方法
- 备份与恢复
- 区域和可用区
-
数据迁移
- DRS上找不到GeminiDB Redis链路
- 报错ERR the worker queue is full, and the request cannot be excecuted
- 报错ERR the request queue of io thread is full, and the request cannot be excecuted
- 报错 read error, please check source redis log or network
- 报错 slaveping_thread.cc-ThreadMain-90: error: Ping master error
- 同步状态正向迁移速度太慢
- 同步状态正向迁移速度太快,报错:ERR server reply timeout, some responses may lose, but requests have been executed
- 4.0、5.0以及6.2版本的自建Redis能迁移至GeminiDB Redis吗?
- 自建Redis主备、集群实例如何迁移到GeminiDB Redis?
- 为什么阿里云Redis、腾讯云Redis等云服务不能使用DRS进行数据迁移?
- 自建主备Redis,迁移到GeminiDB Redis集群,需要考虑哪些因素?
- 迁移完成后数据量变少了,100GB的数据迁移到GeminiDB Redis只有20-30GB,数据是不是没迁移完?
- 内存加速
- 资源冻结/释放/删除/退订
- GeminiDB Influx接口
-
GeminiDB Cassandra接口
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- 权限管理
- 购买GeminiDB Cassandra实例
- 实例连接及管理
- 数据迁移
- 实例生命周期管理
- 变更实例
- 同城容灾
- 异地双活
- 数据备份
- 数据恢复
- 参数管理
- 日志与审计
- 查看监控指标与配置告警
- 企业项目
- GeminiDB Cassandra标签管理
- GeminiDB Cassandra用户资源配额
- 最佳实践
- 性能白皮书
- 常见问题
- GeminiDB (兼容DynamoDB API)实例
- HBase协议兼容版实例
- GeminiDB Mongo接口
- 技术白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
- 快速入门
-
API v3(推荐)
- 查询API版本
- 接口版本和规格
-
实例管理
- 创建实例
- 删除实例
- 查询实例列表和详情
- 扩容实例存储容量
- 扩容实例的节点数量
- 缩容实例的节点数量
- 获取节点会话列表
- 查询实例节点会话统计信息
- 关闭实例节点会话
- 查询实例可变更规格
- 变更实例规格
- 修改实例的管理员密码
- 修改实例名称
- 变更实例安全组
- 数据库补丁升级
- 批量数据库补丁升级
- 创建冷数据存储
- 扩容冷数据存储
- 绑定/解绑弹性公网IP
- 切换实例SSL开关
- 重启实例
- 设置磁盘自动扩容策略
- 修改数据库端口
- 判断弱密码
- 修改副本集跨网段访问配置
- 删除扩容失败的节点
- 查询创建实例或扩容节点时需要的IP数量
- 查询磁盘自动扩容策略
- 变更实例存储容量
- 查询高危命令
- 修改高危命令
- 查询Redis实例的热key
- 设置Redis禁用命令
- 查询Redis禁用命令
- 删除Redis禁用命令
- 设置实例可维护时间段
- Redis主备切换
- 支持节点的开关机
- 查询GeminiDB Redis实例的大key
- 获取GeminiDB Redis的免密配置
- 支持修改GeminiDB Redis的免密配置
- 查询内存加速映射列表和详情
- 创建内存加速规则
- 解除内存加速映射
- 创建内存加速映射
- 修改内存加速规则
- 查询内存加速规则列表和详情
- 删除内存加速规则
- 开启/关闭实例数据导出
- 开启/关闭秒级监控
- 查询秒级监控配置
- 连接管理
- 备份与恢复
- 参数模板管理
- 管理数据库和账号
- 标签管理
- 日志管理
- 配额管理
- 容灾管理
- 任务管理
- 企业项目管理
- 实例负载均衡管理
- API v3(即将下线)
- 权限策略和授权项
- 附录
- SDK参考
- 场景代码示例
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
通过Java连接GeminiDB Cassandra
本小节主要介绍使用Java语言连接GeminiDB Cassandra的基本操作。
前提条件
- 已成功创建GeminiDB Cassandra实例,且实例状态正常。创建GeminiDB Cassandra实例的方法请参见购买GeminiDB Cassandra实例。
- 已创建弹性云服务器,创建弹性云服务器的方法,请参见《弹性云服务器快速入门》中“创建弹性云服务器”章节。
- 弹性云服务器上已经安装JDK环境。
- 客户端建议使用DataStax 3.11.x版本,目前暂不兼容DataStax 4.x版本。
操作步骤
- 获取GeminiDB Cassandra实例的内网IP地址、端口。
内网IP地址和端口的获取方法请参见查看GeminiDB Cassandra IP地址和端口。
- 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“登录弹性云服务器”。
- 编辑连接GeminiDB Cassandra实例的代码。
import com.datastax.driver.core.*; Cluster cluster = null; try { cluster = Cluster.builder() .addContactPoint("127.0.0.1")//此处为步骤1中获取到的GeminiDB Cassandra实例的内网IP .withPort(8635) //此处为步骤1中获取到的GeminiDB Cassandra实例的端口 .build(); Session session = cluster.connect(); ResultSet rs = session.execute("select release_version from system.local"); Row row = rs.one(); System.out.println(row.getString("release_version")); } finally { if (cluster != null) cluster.close(); }
- 运行示例代码,确认结果是否正常。
相关知识
- 创建集群实例。
Cluster cluster = Cluster.builder() .withClusterName("myCluster") //集群名称可选 .addContactPoint("127.0.0.1") // 连接点,业务连接集群时第一次连接的节点IP,可配置多个 .build();
- 设置集群配置。
必须要指定的选项是指定连接点(ContactPoint),一般情况下建议配置三个连接点IP,这样当其中一个无法连接时,还可以尝试其他的连接点。
可以配置的配置项有:
- AuthProvider:认证方式
- LoadBalancingPolicy:负载均衡的策略。负载均衡策略决定了业务请求到Cassandra集群的负载分流的方式, 建议设置为RoundRobinPolicy,这样保持压力能够随机均匀的落在整个集群中。
可选项有DCAwareRoundRobinPolicy,HostFilterPolicy,LatencyAwarePolicy,RoundRobinPolicy,TokenAwarePolicy和WhiteListPolicy。
- Metrics:计量相关
- NettyOptions:Cassandra driver使用Netty实现作为内部异步编程框架,所以暴露了一些options给用户自定义配置。
- QueryOptions:查询相关options,可以设置查询一致性级别、设置fetch_size、设置刷新节点拓扑频率、刷新元数据频率等。
- ReconnectionPolicy:当节点连接断开以后的重连策略,可以指定如下重连策略:
- ConstantReconnectionPolicy:常数级别的重连策略
- ExponentialReconnectionPolicy:指数递增重连策略
- RetryPolicy:重试策略,当请求失败的时候,会根据指定的重试策略进行再次请求,默认为DefaultRetryPolicy。
其他可选的重试策略还有:DowngradingConsistencyRetryPolicy,FallthroughRetryPolicy,IdempotenceAwareRetryPolicy和LoggingRetryPolicy,用户也可以根据业务自行定制重试策略。
- Session会话。
正常情况下,session和keyspace是不绑定的,所以在查询的时候是需要指定表的keyspace的,如下所示:
Session session = cluster.connect(); session.execute("select * from myKeyspace.myTable where id = 1"); //需要手动指定myKeysapce的keyspace前缀
以下是几种绑定keysapce的常见方法:
- 创建session会话时候指定keyspace
Session session = cluster.connect("myKeyspace");
- 查询指定keyspace前缀
session.execute("select * from otherKeyspace.otherTable where id = 1");
- session.execute 切换keyspace
session.execute("USE myKeyspace");
- 创建session会话时候指定keyspace
- CRUD(增删改查)操作
- 直接使用CQL语句实现增删改查操作
//创建表 session.execute("CREATE TABLE test (k int,p int,s int ,v int,PRIMARY KEY (k, p));"); //插入 session.execute("INSERT INTO test(k, p, v) VALUES (0, 3, 1);"); //查询 session.execute("SELECT * FROM test;"); //更新 session.execute("UPDATE test SET v=100 where k = 0 and p = 3;") //删除 session.execute("DELETE FROM test where k = 0 and p = 3;")
- 使用QueryBuilder
//查询 ResultSet rs = session.execute( QueryBuilder.select("k", "p", "v", "s") .from("keyspace", "test") .where(QueryBuilder.eq("k", 0)) .and(QueryBuilder.eq("p", 3)); //插入 session.execute( QueryBuilder.insertInto("keyspace", "test") .values(new String[]{"k", "p", "v"}, new Object[]{0, 3, 0})); //更新 session.execute( QueryBuilder.update("keyspace", "test") .with(QueryBuilder.set("v", 100)) .where(QueryBuilder.eq("k", 0)) .and(QueryBuilder.eq("p", 3)); //删除 session.execute(QueryBuilder.delete() .from("keyspace", "test") .where(QueryBuilder.eq("k", 0)) .and(QueryBuilder.eq("p", 3))
- 使用PreparedStatement
Cassandra也有类似于JDBC那样使用预编译占位符,当使用PreparedStatement的时候,Cassandra server端会解析query语句并且在server端进行缓存,然后返回一个唯一标识符给cassandra driver。
如下图所示:
图1 原理图当用户绑定并且执行编译statement时,cassandra driver只会发送唯一标识符和数据,cassandra server会跳过解析query语句过程。
图2 原理图预编译占位符在重复执行大量相同CQL,只是数据不一样的场景性能上有很大优势。
private static final String GET_TEST = "select * from test where k = ? and p = ?;"; private static final String INSERT_TEST = "INSERT INTO test(k, p, v) VALUES (?, ?, ?);"; private static final String UPDATE_TEST = "UPDATE test SET v=100 where k = ? and p = ?;"; private static final String DELETE_TEST = "DELETE FROM test where k = ? and p = ?;"; //查询 PreparedStatement prepareStatement = session.prepare(GET_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement).bind(0,3); ResultSet rs = session.execute(bindStatement); //插入 PreparedStatement prepareStatement = session.prepare(INSERT_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement) .bind(0, 3, 0); session.execute(bindStatement); //更新 PreparedStatement prepareStatement = session.prepare(UPDATE_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement) .bind(0, 3); session.execute(bindStatement); //删除 PreparedStatement prepareStatement = session.prepare(DELETE_TEST); BoundStatement bindStatement = new BoundStatement(prepareStatement) .bind(0, 3); session.execute(bindStatement);
- 直接使用CQL语句实现增删改查操作
- BATCH操作
cassandra driver也支持用户批量进行插入操作,可以将多个statement添加进BatchStatement统一执行。
如下代码示例:
Session session = SessionRepository.getSession(); //插入 BoundStatement insertBind = new BoundStatement( session.prepare("insert into keysapce.test(k, p, v) values(?,?,?);")) .bind(0, 3, 0); //更新 BoundStatement updateBind = new BoundStatement( session.prepare("update keyspace.test set v=? where k=? and p=?;")) .bind(0, 3, 100"); //删除 BoundStatement deleteBind = new BoundStatement( session.prepare("delete from keyspace.test where k=? and p=?;")) .bind(1, 3); // GeminiDB Cassandra只支持unlogged batch BatchStatement batchStatement = new BatchStatement(Type.UNLOGGED); batchStatement.add(insertBind); batchStatement.add(updateBind); batchStatement.add(deleteBind); session.execute(batchStatement);