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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)