通过jedis/lettuce远程连接到redis

x33g5p2x  于2021-10-05 转载在 Redis  
字(3.9k)|赞(0)|评价(0)|浏览(433)

1.jedis连接到redis

1.1 pom.xml(maven工程)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>jedis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--jedis依赖-->
        <dependency>
               <groupId>redis.clients</groupId>
               <artifactId>jedis</artifactId>
               <version>3.2.0</version>
               <type>jar</type>
               <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

1.2 通过vi redis.conf命令打开redis的配置文件,注释掉绑定本地地址和开启密码验证

1.3 测试能否远程连接到redis,我的redis是装在虚拟机上的,所以以下ip地址为虚拟机ip地址

package jedis;

import redis.clients.jedis.Jedis;

public class MyJedis {
    public static void main(String[] args) {
        //1.构造jedis对象,端口没写则默认为6379
        Jedis jedis = new Jedis("192.168.244.129");
        //Jedis jedis = new Jedis("192.168.244.129",6379);
        //密码认证
        jedis.auth("root123");
        //测试是否连接成功
        String str = jedis.ping();
        //返回一个"pong"则表明连接成功
        System.out.println(str);

    }
}

结果:

1.4 通过连接池获取jedis对象,jedis对象的方法名和redis的一些常用命令很相似,可以见名思义地使用jedis的方法

package jedis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisUtils {
    private static JedisPool jedisPool = null;

    public static Jedis getJedisObject() {
        if (jedisPool == null) {
            GenericObjectPoolConfig config = new GenericObjectPoolConfig();
            //最大空闲数
            config.setMaxIdle(400);
            //最大连接数
            config.setMaxTotal(2000);
            //连接最大等待时间,-1代表没有限制
            config.setMaxWaitMillis(300000);
            /** * 配置连接池的地址,端口号,超时时间,密码 */
            jedisPool = new JedisPool(config,"192.168.244.129",6379,30000,"root123");
        }
        try {
            //通过连接池获取jedis对象
            Jedis jedis = jedisPool.getResource();
            jedis.auth("root123");
            return jedis;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

测试

package jedis;

import redis.clients.jedis.Jedis;

public class test {
    public static void main(String[] args) {
        Jedis jedisObject = JedisUtils.getJedisObject();
        try {
            String str = jedisObject.ping();
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedisObject != null) {
                jedisObject.close();
            }
        }
    }
}

结果

2.lettuce连接到redis

2.1 pom.xml(maven工程)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>lettuce</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
               <groupId>io.lettuce</groupId>
               <artifactId>lettuce-core</artifactId>
               <version>5.2.2.RELEASE</version>
        </dependency>
    </dependencies>

</project>

2.2 测试连接

package com.yl.config;

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) {
        //创建client对象
        RedisClient redisClient = RedisClient.create("redis://root123@192.168.244.129");
        //获取连接对象
        StatefulRedisConnection<String, String> connect = redisClient.connect();
        //获取同步调用的连接对象
        RedisCommands<String, String> sync = connect.sync();
        //通过set,get往redis里存数据和取数据
        sync.set("name","yl");
        sync.set("age","23");
        System.out.println(sync.get("name"));
        System.out.println(sync.get("age"));

    }
}

结果

3.两种方式的比较

1.jedis在实现的过程中是直接连接到redis的,在多个线程之间共享一个jedis实例,这是线程不安全的,如果想在多线程的情况下使用jedis,就得使用jedis连接池,这就使得每一个线程都会相对应一个jedis连接池,比较耗内存空间

2.lettuce是基于目前很火的Netty NIO开发的,解决了jedis中线程不安全的问题,lettuce支持同步,异步,等,多个线程可以共享一个实例

相关文章