springboo连接redis哨兵集群原理

springboo连接redis哨兵集群原理,第1张

Spring Boot连接Redis哨兵集群的原理如下:

1 Spring Boot使用Jedis客户端连接Redis哨兵集群。Jedis是一个Java Redis客户端,它支持连接Redis哨兵集群。

2 Jedis客户端会向Redis哨兵集群发送SENTINEL get-master-addr-by-name命令,获取当前Redis主节点的IP地址和端口号。

3 Jedis客户端会使用获取到的IP地址和端口号连接Redis主节点,并发送PING命令测试连接是否正常。

4 如果连接正常,Jedis客户端会将连接信息保存在连接池中,以便后续使用。

5 如果连接失败,Jedis客户端会向Redis哨兵集群发送SENTINEL get-master-addr-by-name命令,获取新的Redis主节点的IP地址和端口号,然后重复步骤2-4。

6 如果Redis主节点发生故障,Redis哨兵会自动将从节点升级为主节点,并通知Jedis客户端更新连接信息。

总之,Spring Boot连接Redis哨兵集群的原理是通过Jedis客户端向Redis哨兵集群发送命令获取当前Redis主节点的IP地址和端口号,然后使用获取到的信息连接Redis主节点。如果连接失败,Jedis客户端会重新获取新的Redis主节点的IP地址和端口号,直到连接成功为止。如果Redis主节点发生故障,Redis哨兵会自动将从节点升级为主节点,并通知Jedis客户端更新连接信息。

你说的应该是redis吧?首先你需要在网上下载一个redis的包,然后解压在你电脑上,运行它的服务端,这样redis就启动了,然后就可以在eclipse里面进行存取,或者在CMD中也可以通过相关命令进行 *** 作。

这是往redis里面添加数据的代码:

// 初始化Redis连接池

pool = new JedisPool(new JedisPoolConfig(), "127001");

// 从Redis连接池中获取一个连接

jedis = poolgetResource();

// Redis的密码,对应rediswindowsconf中的masterauth

jedisauth("123456");

jedispublish("test","holle");

jedispublish("test","最近好么周杰伦");

这是接收redisi的代码:

// 初始化Redis连接池

// pool = new JedisPool(new JedisPoolConfig(), IP,6379);//也可以用

Jedis jedis = new Jedis("127001",6379);

loginfo("初始化redis连接池成功");

// 从Redis连接池中获取一个连接

// jedis = poolgetResource();

loginfo("获取redis连接已成功");

// Redis的密码

// jedisauth(REDIS_PASSWORE);

JedisPubSub jedispubsub = new JedisPubSub() {

@Override

public void onMessage(String channel, String message) {

superonMessage(channel, message);

loginfo("从redis获取到一条数据:"+message);

releaseActiveMQ(message);

}

};

jedissubscribe(jedispubsub, "defenceEventChannel");

}

预备

jedis-252

commons-pool2-22jar

使用单连接

此方式仅建议用于开发环境做调试用。

// 创建连接

String host = "19216856102";

int port = 6379;

Jedis client = new Jedis(host, port);

// 执行set指令

String result = clientset("key-string", "Hello, Redis!");

Systemoutprintln( Stringformat("set指令执行结果:%s", result) );

// 执行get指令

String value = clientget("key-string");

Systemoutprintln( Stringformat("get指令执行结果:%s", value) );

运行上述代码,控制台输出:

set指令执行结果:OK

get指令执行结果:Hello, Redis!

使用连接池

此方式适用于仅使用单个Redis实例的场景。

// 生成连接池配置信息

JedisPoolConfig config = new JedisPoolConfig();

configsetMaxIdle(10);

configsetMaxTotal(30);

configsetMaxWaitMillis(31000);

// 在应用初始化的时候生成连接池

JedisPool pool = new JedisPool(config, "19216856102", 6379);

// 在业务 *** 作时,从连接池获取连接

Jedis client = poolgetResource();

try {

// 执行指令

String result = clientset("key-string", "Hello, Redis!");

Systemoutprintln( Stringformat("set指令执行结果:%s", result) );

String value = clientget("key-string");

Systemoutprintln( Stringformat("get指令执行结果:%s", value) );

} catch (Exception e) {

// TODO: handle exception

} finally {

// 业务 *** 作完成,将连接返回给连接池

if (null != client) {

poolreturnResource(client);

}

} // end of try block

// 应用关闭时,释放连接池资源

pooldestroy();

运行上述代码,控制台输出:

set指令执行结果:OK

get指令执行结果:Hello, Redis!

使用连接池+分布式

在规模较大的系统中,往往会有多个Redis实例做负载均衡。并且还实现主从备份,当主实例发生故障时,切换至从实例提供服务。

类似于Memcached的客户端,Jedis也提供了客户端分布式 *** 作的方式,采用一致性哈希算法。

// 生成多机连接信息列表

List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();

shardsadd( new JedisShardInfo("127001", 6379) );

shardsadd( new JedisShardInfo("19216856102", 6379) );

// 生成连接池配置信息

JedisPoolConfig config = new JedisPoolConfig();

configsetMaxIdle(10);

configsetMaxTotal(30);

configsetMaxWaitMillis(31000);

// 在应用初始化的时候生成连接池

ShardedJedisPool pool = new ShardedJedisPool(config, shards);

// 在业务 *** 作时,从连接池获取连接

ShardedJedis client = poolgetResource();

try {

// 执行指令

String result = clientset("key-string", "Hello, Redis!");

Systemoutprintln( Stringformat("set指令执行结果:%s", result) );

String value = clientget("key-string");

Systemoutprintln( Stringformat("get指令执行结果:%s", value) );

} catch (Exception e) {

// TODO: handle exception

} finally {

// 业务 *** 作完成,将连接返回给连接池

if (null != client) {

poolreturnResource(client);

}

} // end of try block

// 应用关闭时,释放连接池资源

pooldestroy();

运行上述代码,控制台输出:

set指令执行结果:OK

get指令执行结果:Hello, Redis!

应该是redis本身的服务有问题了

本文所针对的连接超时问题所涉及的相关元素如下:

Redis客户端: Jedis (java)

Redis版本 :2812

Redis部署 *** 作系统类型:Linux

正文开始:

No 1Redis执行大命令(时间复杂度为O(N)的命令)

问题剖析:

aRedis服务器端通过单线程处理命令,一旦有大命令被执行,Redis将无法及时响应来自客户端的任何命令

关于Redis大命令的监控,可以查看slowlog来观察

b在使用jedis作为redis客户端时,当redis连接池的配置参数testOnBorrow=true时,默认会在获取redis连接

时,先执行redis的ping方法,而基于原因a,此时redis将无法及时响应,自然会报出time out异常

如何解决:

a尽量避免使用时间复杂度为O(N)的命令

b如果无法避免使用时间复杂度为O(N)的命令,则应降低其使用频率,避免在业务高峰期时使用

No 2Redis单次 *** 作数据包过大

问题分析

a单次 *** 作数据包过大,且 *** 作频繁,极有可能会导致网络拥堵

b在使用jedis作为redis客户端时,当redis连接池的配置参数testOnBorrow=true时,默认会在获取redis连接

时,先执行redis的ping方法,而基于原因a,此时redis将无法及时响应,自然会报出time out异常

如何解决:

a排查代码,确定是否存在大数据(数据条目过多/单条数据过大) *** 作,将其进行改造,改造方案有两个:

a1数据拆分,变更数据类型(常见的情况是将java中的collection类型序列化后存入redis的String数据

类型中),如将String数据类型调整为hash/list/set等,这常用于解决单条数据量过大的情况

a2调整业务逻辑,减少单次数据查询范围(常见的情况如将redis中的整个hash数据取回,在应用程序内存中获取需要的entry),如使用hget等单条查询命令替换hgetall命令

在Redis目录下开启Redis这个窗口就不能继续 *** 作了scr/redis-server另开启一个命令行窗口进入Redis目录可以进行测试src/redis-cliquit可以退出当前client

以上就是关于springboo连接redis哨兵集群原理全部的内容,包括:springboo连接redis哨兵集群原理、rides怎么跟eclipse用、如何用java获取redis的info等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9546803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存