Redis-java客户端

开启远程连接

Linux 更改设置

shutdown

exit

把 bind:127.0.0.1注释掉

requirepass password 设置密码

开启服务:

redis-server redis.conf

redis-cli -a password

Jedis

创建一个普通的maven项目

项目创建成功后添加jedis依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
</dependency>

创建一个测试方法

public class MyJedis {
    public static void main(String[] args) {
        //1.构建一个jedis对象,默认端口6379
        Jedis jedis = new Jedis("127.0.0.1");
        //2.密码认证
        jedis.auth("root");
        //3.测试是否连接成功
        String ping = jedis.ping();
        //4.返回pong表示连接成功
        System.out.println(ping);

    }
}

Jedis,方法中的API和Redis命令高度一致

连接池

由于redis不是线程安全的,所以我们使用redis对象时,用连接池来使用redis

public class MyRedisPoolTest {
    public static void main(String[] args) {
        //构建一个连接池
        JedisPool pool = new JedisPool("127.0.0.1",6379);
        //从连接池获取一个Jedis连接
        Jedis jedis = pool.getResource();
        try {
			jedis.auth("root");
            //Jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        } finally {
            //归还连接
            if(jedis!=null){
                jedis.close();
            }
        }
    }
}

利用jdk1.7 try-with-resource 特性,可以改造

public class MyRedisPoolTest {
    public static void main(String[] args) {
        //构建一个连接池
        JedisPool pool = new JedisPool("127.0.0.1",6379);
        try(Jedis jedis = pool.getResource();) {
            jedis.auth("root");
            //Jedis操作
            String ping = jedis.ping();
            System.out.println(ping);
        }
    }
}

由于redis不是线程安全的,所以我们使用redis对象时,用连接池来使用redis

但是上面代码无法实现强约束,可以进一步做出改进

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);
        pool=new JedisPool(config,"192.168.91.128",6379,30000,"javaboy");

    }
    public void execute(CallwithJedis callwithJedis){
        try(Jedis jedis = pool.getResource()){
            callwithJedis.call(jedis);
        }
    }
}

Redis redis = new Redis();
redis.execute(jedis -> {
    System.out.println(jedis.ping());
});

Lettuce

Lettuce和Jedis的一个比较

1.jedis 在实现过程中是直接连接Redis的,在多个线程之间共享一个Jedis实例,这是线程不安全的,如果想要在多线程下使用Jedis,就得使用连接池,这样,每个线程都有自己的Jedis实例。

2.Lettue基于目前很火的Netty NIO框架来构建,所以克服了Jedis中线程不安全的情况,Lettuce支持同步,异步,以及响应式调用,多个线程可以共享一个连接实例。

添加依赖:

<dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.3.1.RELEASE</version>
</dependency>
    
    
public class LettuceTest {
    public static void main(String[] args) {
        RedisClient redisClient = RedisClient.create("redis://root@127.0.0.1");
        StatefulRedisConnection<String, String> connect =redisClient.connect();
        RedisCommands<String, String> async = connect.sync();
        async.set("name", "javaboy");
        String name = async.get("name");
        System.out.println(name);
    }
}
posted @ 2020-08-19 23:00  柒丶月  阅读(300)  评论(0编辑  收藏  举报