Redis 默认是不支持远程连接的,需要手动开启。
一共修改两个地方:
- 1. 注释掉 bind: 127.0.0.1
- 2. 开启密码校验,去掉 requirepass 的注释 改完之后,保存退出,启动Redis
简单的连接方式
步骤
一,更改配置文件 vim /etc/redis.conf
- 密码去掉注释,远程连接需要密码
- 把 bind 注释掉。
对于Redis中bind的理解是:
bind:是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址。
如果指定了bind,则说明只允许来自指定网卡的Redis请求。如果没有指定,就说明可以接受来自任意一个网卡的Redis请求。
举个例子:如果redis服务器(本机)上有两个网卡,每一个网卡对应一个IP地址,例如IP1和IP2。(注意这个IP1和IP2都是本机的IP地址)。
我们的配置文件:bind IP1。 只有我们通过IP1来访问redis服务器,才允许连接Redis服务器,如果我们通过IP2来访问Redis服务器,就会连不上Redis。
二,添加依赖包 这里我们使用
jedis
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
public static void main(String[] args) { Jedis jedis = new Jedis("39.97.241.18"); // jedis.auth("foobared"); System.out.println(jedis.ping()); }
三,连接问题
创建对象时报错
- 可能端口安全组没开,我们开一下。
- 或则使用firewalld开启一下6379的端口
firewall-cmd --add-port=6379/tcp --permanent
密码认证错误
看下配置文件的密码,传递密码试试
看一个完整的Deno
package demo; import redis.clients.jedis.Jedis; /** * @author Liruilong * @Date 2020/9/5 17:56 * @Description: 函数接口, * 传递一个Redis对象,类似于 Runnable -> Thread * 类似策略模式,CallWithJedis可以看着为策略模板, */ @FunctionalInterface public interface CallWithJedis { void call(Jedis jedis); }
package demo; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import java.util.Objects; /** * @author Liruilong * @Date 2020/9/5 17:49 * @Description: 线程安全的Redis池(单例) */ /** * @author Liruilong * @Date 2021/3/14 17:49 * @Description: 线程安全的Redis池(单例) */ public final class Redis { private volatile JedisPool pool; private static volatile Redis redis = null; private Redis() { GenericObjectPoolConfig config = new GenericObjectPoolConfig(); //连接池最大空闲数 config.setMaxIdle(300); //最大连接数 config.setMaxTotal(1000); //连接等待时间,-1 表示没限制 config.setMaxWaitMillis(30000); //空闲时检查有效性 config.setTestOnBorrow(true); // 地址,端口,超时时间,密码 this.pool = new JedisPool(config,"39.97.241.18",6379,30000,"foobared"); } public void execute(CallWithJedis callWithJedis){ try (Jedis jedis = pool.getResource()){ callWithJedis.call(jedis); } } public static Redis builder() { if (Objects.isNull(redis)) { synchronized (Redis.class) { if (Objects.isNull(redis)) { return new Redis(); } } } return redis; } }