Redis开启远程连接

Redis开启远程连接
  • [1 开启远程连接](#1 开启远程连接)
  • [2 Jedis连接Redis](#2 Jedis连接Redis)
  • [3 Jedis优化连接](#3 Jedis优化连接)
    • [3.1 Jedis连接池](#3.1 Jedis连接池)
  • [4 lettuce](#4 lettuce)

1 开启远程连接

redis默认是不支持远程连接,需要手动开启,在redis.conf文件中,找到下方法代码:

复制代码
#bind 127.0.0.1

这里只允许127.0.0.1登录,注释掉

开启密码校验,去掉requirepass的注析

复制代码
requirepass password
//设置密码为password(自定义的,随便设)

改完之后,保存退出,启动redis

复制代码
redis-server redis.conf

2 Jedis连接Redis

首先创建一个maven项目

复制代码
Jedis的GitHub地址:https://github.com/xetorthio/jedis

项目创建成功后,添加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");
        //密码
        jedis.auth("password");
        //测试是否连接成功
        String ping = jedis.ping();
        //返回pong表示成功
        System.out.println(ping);
    }
}

对于Jedis而言,一旦连接上redis服务端,剩下的操作就很简单了

在Jedis中,由于方法的API和Redis的命令高度一致,所以,Jedis中的方法见名知意,直接使用即可

3 Jedis优化连接

3.1 Jedis连接池

在实际应用中,Jedis实例我们一般都是通过连接池来获取,由于Jedis对象不是线程安全的,所以,当我们使用Jdeis对象时,从连接池获取Jedis,使用完成后,再还给连接池。

复制代码
public class JedisPoolTest {
    public static void main(String[] args) {
        Jedis jedis = null;
        //1.构造一个jedis连接池
        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
        //2.从连接池中获取一个Jedis连接
        jedis = jedisPool.getResource();
        jedis.auth("password");
        try {
            //3.Jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //4.归还连接
            if (jedis != null)
                jedis.close();
        }
    }
}

通过finally确保jedis一定被关闭

利用JDK1.7中的try-with-resource特性,可以对上面的代码进行改造:

复制代码
public class JedisPoolTest {
    public static void main(String[] args) {
        //1.构造一个jedis连接池
        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
        //2.从连接池中获取一个Jedis连接
        //版本低,可以在Project Structure的Modules的Language level哪里改为8
        try(Jedis jedis = jedisPool.getResource()){
            //3.Jedis操作
            jedis.auth("password");
            String ping = jedis.ping();
            System.out.println(ping+":");
        }
    }
}
  • 版本低,可以在Project Structure的Modules的Language level哪里改为8

增加约束,封装

复制代码
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,"password");
    }
    public void exectu(CallWithJedis callWithJedis){
        try(Jedis jedis=pool.getResource()){
            callWithJedis.call(jedis);
        }
    }
}


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisPoolTest {
    public static void main(String[] args) {
        Redis redis = new Redis();
        redis.exectu(jedis -> {
            System.out.println(jedis.ping());
        });
    }
}



在这里插入代码片

4 lettuce

github:github.com/lettuce-io/lettuce-core

lettuce和Jedis的一个比较

  1. Jedis在实现的过程中是直接连接Reids的,在多个线程之间共享一个Jedis实例,这是线程不安全的,如果想在多线程场景下使用Jedis,就得使用连接池,这样,每个线程都有自己的Jedis实例。(会浪费)
  2. Lettuce基于Netty NIO框架来构建的,所以克服了Jedis中线程不安全的问题,Lettuce支持同步、异步以及响应式调用,多个线程可用共享一个连接实例。

使用Lettuce,首先创建一个普通的maven项目,添加Lettuce依赖

复制代码
    <dependencies>
        <dependency>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>
    </dependencies>

实例:

复制代码
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;

public class LettuceTest {
    public static void main(String[] args) {
        RedisClient redisClient = RedisClient.create("redis://password@127.0.0.1");
        StatefulRedisConnection<String, String> connect = redisClient.connect();
        RedisCommands<String, String> sync = connect.sync();
        sync.set("name","java");
        String name=sync.get("name");
        System.out.println(name);
    }
}

这里的密码传递方式,密码直接写下连接地址里面

相关推荐
Patrick在香港3 小时前
时间戳凭空早了 8 小时:datetime.utcnow() 弃用实测与漂移复盘
数据库·python·标准库·datetime·时区·弃用
深蓝AI3 小时前
Redis 文档 MCP 揭示 Agent 检索真相:3 个工具、双读路径,引用为什么不能交给模型编
人工智能·redis
CV工程师丁Sir5 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
李兆龙的博客11 小时前
问津集 #26:Lakebase——Postgres 的版本化页面存储、数据库分支与计算弹性
数据库
志尊宝12 小时前
Vue3 零基础每日笔记(073):keep-alive 页面缓存实战——列表页返回不丢状态
vue.js·笔记·缓存·#vue #前端 #前端开发·#javascript·#vue.js
倔强的石头_13 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间13 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西13 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西14 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹14 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座