1.开启远程连接
Redis 默认是不支持远程连接的,需要手动开启。
一共修改两个地方:
- 注释掉 bind: 127.0.0.1
- 开启密码校验,去掉 requirepass 的注释
改完之后,保存退出,启动Redis。
2.Jedis
Jedis 的 GitHub 地址:https://github.com/xetorthio/jedis
首先创建一个普通的 Maven 项目。项目创建成功后,添加 Jedis 依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
然后创建一个测试方法。
public class MyJedis {
public static void main(String[] args) {
//1.构造一个 Jedis 对象,因为这里使用的默认端口 6379,所以不用配置端口
Jedis jedis = new Jedis("127.0.0.1");
//2.密码认证 由于我没有设置密码则注释掉
//jedis.auth("javaboy");
//3.测试是否连接成功
String ping = jedis.ping();
//4.返回 pong 表示连接成功
System.out.println(ping);
}
}
运行:pong表示链接成功
对于 Jedis 而言,一旦连接上 Redis 服务端,剩下的操作都很容易了。
在 Jedis 中,由于方法的 API 和 Redis 的命令高度一致,所以,Jedis 中的方法见名知意,直接使用即可。
连接池
在实际应用中,Jedis 实例我们一般都是通过连接池来获取,由于 Jedis 对象不是线程安全的,所以,当我们使用 Jedis 对象时,从连接池获取 Jedis,使用完成之后,再还给连接池。
public static void main(String[] args) {
Jedis jedis = null;
//1. 构造一个 Jedis 连接池
JedisPool pool = new JedisPool("127.0.0.1",6379);
//2. 从连接池中获取一个 Jedis 连接
jedis = pool.getResource();
//jedis.auth("javaboy");
try {
//3. Jedis 操作
String ping = jedis.ping();
System.out.println(ping);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
//4. 归还连接
jedis.close();
}
}
}
通过 finally 我们可以确保 jedis 一定被关闭。
利用 JDK1.7 中的 try-with-resource 特性,可以对上面的代码进行改造:
public static void main(String[] args) {
JedisPool pool = new JedisPool("127.0.0.1",6379);
try(Jedis jedis = pool.getResource()) {
//jedis.auth("javaboy");
String ping = jedis.ping();
System.out.println(ping);
}
}
这段代码的作用和上面的是一致的。
但是,上面这段代码无法实现强约束。我们可以做进一步的改进:
① 创建一个接口·
public interface CallwithJedis {
void call(Jedis jedis);
}
②创建类
public class Redis {
private JedisPool pool;
public Redis(){
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
//连接池最大空闲数
config.setMaxIdle(300);
//最大连接数
config.setMaxTotal(1000);
//连接最大等待时间,如果是 -1 表示没有限制
config.setMaxWaitMillis(30000);
//在空闲时检查有效性
config.setTestOnBorrow(true);
/**
* 1. Redis 地址
* 2. Redis 端口
* 3. 连接超时时间
* 4. 密码
* */
//pool = new JedisPool(config,"127.0.0.1",6379,30000,"javaboy");
pool = new JedisPool(config,"127.0.0.1",6379,30000);
}
public void execute(CallwithJedis callwithJedis){
try(Jedis jedis = pool.getResource()) {
callwithJedis.call(jedis);
}
}
}
③测试
public static void main(String[] args) {
Redis redis = new Redis();
redis.execute(jedis ->
System.out.println(jedis.ping()) );
}
3.Lettuce
GitHub:https://github.com/lettuce-io/lettuce-core
Lettuce 和 Jedis 的一个比较:
- Jedis 在实现的过程中是直接连接 Redis 的,在多个线程之间共享一个 Jedis 实例,这是线程不安
全的,如果想在多线程场景下使用 Jedis,就得使用连接池,这样,每个线程都有自己的 Jedis 实
例。 - Lettuce 基于目前很火的 Netty NIO 框架来构建,所以克服了 Jedis 中线程不安全的问题,Lettuce
支持同步、异步 以及 响应式调用,多个线程可以共享一个连接实例。
使用 Lettuce,首先创建一个普通的 Maven 项目,添加 Lettuce 依赖:
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
然后来一个简单的测试案例:
public class LettuceTest {
public static void main(String[] args) {
/*RedisClient redisClient = RedisClient.create("redis://javaboy@127.0.0.1");*/
RedisClient redisClient = RedisClient.create("redis://127.0.0.1");
StatefulRedisConnection<String, String> connect = redisClient.connect();
RedisCommands<String, String> sync = connect.sync();
sync.set("name","javaboy");
String name = sync.get("name");
System.out.println(name);
}
}
注意这里的密码传递方式,密码直接写在连接地址里边。