本文列举客户端 Java 代码示例,辅助您使用 SSL 加密或不加密的方式访问数据库。
准备工作
- 在 Redis 控制台 的实例详情页面的网络信息区域,获取连接数据库的内网 IPv4 地址及端口。具体信息,请参见 查看实例详情。
- 已获取访问数据库的账号与密码。具体操作,请参见 账号管理。
- 下载客户端 Jedis,推荐使用最新版本。
- 如果使用 SSL 加密方式连接数据库,请 SSL 加密,获取 SSL 认证证书文件。
SSL 不加密方式连接示例
您需要根据注释修改参数:连接数据库的 IP、端口及账号密码信息。
import redis.clients.jedis.Jedis;
public class HelloRedis {
public static void main(String[] args) {
try {
/**以下参数,如果为内网访问,分别填写您的 Redis 实例内网 IP、端口号、实例 ID 和密码;
如果为外网访问,分别配置实例外网地址、端口号及其密码,无需设置实例 ID*/
String host = "192.xx.xx.195";
int port = 6379;
String instanceid = "crs-09xxxqv";
String password = "123ad6aq";
//连接 Redis
Jedis jedis = new Jedis(host, port);
//鉴权
jedis.auth(instanceid + ":" + password);
/**接下来可以开始操作 Redis 实例,可以参考 https://github.com/xetorthio/jedis */
//设置 Key
jedis.set("redis", "abc");
System.out.println("set key redis suc, value is: abc");
//获取 Key
String value = jedis.get("redis");
System.out.println("get key redis is: " + value);
//关闭退出
jedis.quit();
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果,如下所示。
SSL 加密方式连接示例
您需要根据注释修改参数:SSL 证书文件、连接数据库的 IP、端口及账号密码信息。
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import java.io.FileInputStream;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
public class Main {
public static void main(String[] args) throws Exception {
KeyStore trustStore = KeyStore.getInstance("jks");
//ca.jks 为证书文件名称。
try (InputStream inputStream = new FileInputStream("ca.jks") ){
trustStore.load(inputStream, null);
}
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init(trustStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustManagers, new SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
//with ssl config jedis pool
//vip 为连接数据库的内网 IPv4 地址,6379为默认的端口号,pwd 为默认账号的密码。您需根据实际情况替换。
JedisPool pool = new JedisPool(genericObjectPoolConfig, "vip",
6379, 2000, "pwd", 0, true, sslSocketFactory, null, null);
Jedis jedis = pool.getResource();
System.out.println(jedis.ping());
jedis.close();
}
}
连接池方式接入(推荐方式)
package com.example.demo;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.Set;
public class Main {
public static void main(String[] args) {
JedisPoolConfig config = new JedisPoolConfig();
// 最大空闲连接数,需自行评估,不超过Redis实例的最大连接数
config.setMaxIdle(200);
// 最大连接数,需自行评估,不超过Redis实例的最大连接数
config.setMaxTotal(200);
//资源池允许的最小空闲连接数
config.setMinIdle(20);
//当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)
config.setMaxWaitMillis(3000);
//从连接池中获取对象时,会先进行ping检查,检查不通过,会从连接池中移走并销毁。
config.setTestOnBorrow(false);
//归还连接时,会进行检查,检查不通过,则销毁。
config.setTestOnReturn(false);
// 分别将host和password的值替换为实例的连接地址、密码
String host = "xxx.xxx.xxx.xxx";
String password = "123456";
//读写超时(单位为毫秒)
int timeout = 2000;
int port = 6379;
JedisPool pool = new JedisPool(config, host, port, timeout, password);
Jedis jedis = null;
boolean broken = false;
try {
jedis = pool.getResource();
/// ... do stuff here ... for example
jedis.set("redis", "abc");
String foobar = jedis.get("redis");
jedis.zadd("tec", 0, "a");
jedis.zadd("tec", 0, "b");
Set<String> sose = jedis.zrange("tec", 0, -1);
} catch (Exception e) {
broken = true;
} finally {
if (broken) {
pool.returnBrokenResource(jedis);
} else if (jedis != null) {
pool.returnResource(jedis);
}
}
}
}