Spring Boot Redis客户端远程操作实现过程解析

网友投稿 260 2022-12-10


Spring Boot Redis客户端远程操作实现过程解析

在Spring Boot 1.x中默认是Jedis作为客户端,但是在Spring Boot2.x后,默认就是Lettuce

Redis的远程连接,默认是不支持的,需要手动开启

修改config文件:

注释掉bind:127.0.0.1

开启密码校验,去掉requireprass的注释

使用jedis客户端:

jedis的github地址:https://github.com/xetorthio/jedis

如何远程连接:

//构造一个jedis对象

Jedis jedis=new Jedis("127.0.0.1");

//有密码的话要认证

jedis.auth("root");

//测试是否连接成功

String ping =jedis.ping();

//返回pong表示成功

System.out.println(ping);

jedis中的方法API和redis中的操作数据的命令一致,所以使用起来很方便。

在实际应用中,Jedis实例一般用连接池获取,因为java本来就是多线程的,而jedis对象不是线程安全的,所以要使用连接池,从连接池中获取Jedis,用完之后再还给连接池。保证他的线程是安全的。

如何创建Jedis连接池

//1.构造一个jedis连接池

JedisPool pool=new JedisPool("127.0.0.1",6379);

//2.从连接池中获取一个jedis连接

Jedis jedis=pool.getResource();

//3.测试是否连接成功

String ping =jedis.ping();

//返回pong表示成功

System.out.println(ping);

//4.归还连接

jedis.close();

如果第三步,也就是我们的业务代码出问题的话,是无法进行到第四步的,我们可以做一个优化,在业务代码块中try catch给close加一个finally,并在finally中判断jedis不为空的情况下给他归还。这样的话,就可以保证每次都归还jedis对象了。

但是这种的明显感觉很臃肿,而且约束性不强,因此可以再优化,就是以接口和接口实现的形式去处理,需要调用的时候再去实现这个接口:

创建接口:

public interface CallJedis {

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 = nJCwXeziew JedisPool(config, "192.16http://8.91.128", 6379, 30000, "root");

}

public void execute(CallJedis callJedis) {

try (Jedis jedis = pool.getResource()) {

callJedis.call(jedis);

}

}

}

调用接口:

Redis redis = new Redis();

redis.execute(jedis -> {

System.out.println(jedis.ping());

});

使用Lettuce客户端:

GitHub地址:https://github.com/lettuce-io/lettuce-core

Lettuce和Jedis比较

Jedis在实现过程中是直接连接redis的,在多个线程之间共享一个jedis实例,是线程不安全的,如果想在多线程场景下使用jedis,就得使用连接池,这样,每个线程都有自己的jedis实例,但是有一个弊端,就是会消耗过多的物理资源。

LetJCwXezituce是线程安全的,因为使用了Netty NIO框架构建。支持同步,异步,以及响应调用,多个线程可以共享一个Lettuce实例,不用担心多线程的并发问题。

在java中如何使用:

1.添加依赖。

2.测试

//创建连接root是密码,127.0.0.1是服务端地址

RedisClient redisClient =RedisClient.create("redis://root@127.0.0.1");

//创建连接通道

StatefulRedisConnection connect = redisClient.connect();

//获取同步调用对象

RedisCommands sync = connect.sync();

//赋值

sync.set("name", "zl");

//取值

String name = sync.get("name");

//测试

System.out.println(name);

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java基于redis实现分布式锁代码实例
下一篇:Spring Boot如何通过CORS处理跨域问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~