redis集群模式和哨兵模式

红太狼 2023-09-25 11:10 31阅读 0赞

常见的redis集群方案有哪些优缺点

38944179看看连接是否对你有用。

redis集群模式和哨兵模式\_redis哨兵模式和集群区别

redis集群和分布式概念的区别

Redis有一系列的命令,特点是以NX结尾,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists。这系列的命令非常有用,这里讲使用SETNX来实现分布式锁。 用SETNX实现分布式锁 利用SETNX非常简单地实现分布式锁。例如:某客户端要

怎么连接redis集群 使用jedis连接单机和集群redis的两种方式

第一:非集群状态下

非集群状态下用Jedis获取Redis连接,得到Jedis对象即可,一共有两种:

1.利用Jedis构造器,仅限用于测试,在实际项目中肯定是用JedisPool。

Jedis(String host);

Jedis(String host , int port);

2.利用JedisPool

主要是利用Jedis jedis=jedisPool.getResource();

JedisPool有N多个构造器,常用的构造器参数有GenericObjectPoolConfig poolConfig,String host,int port,int timeout,String password,创建GenericObjectPoolConfig对象时我们一般用其子类JedisPoolConfig (redis.clients.jedis.JedisPoolConfig),timeout是连接redis服务器的超时时间,以毫秒为单位,一般设置为0,如果不设为0,则不可设置太小,如果设成1、2,那么可能因为网络原因在1毫秒、2毫秒之内没有连上服务器而报错。见下例:

[java] view plain copy

public static void main(String[] args) {

JedisPoolConfig poolConfig = new JedisPoolConfig();

// 最大连接数

poolConfig.setMaxTotal(2);

// 最大空闲数

poolConfig.setMaxIdle(2);

// 最大允许等待时间,如果超过这个时间还未获取到连接,则会报JedisException异常:

// Could not get a resource from the pool

poolConfig.setMaxWaitMillis(1000);

JedisPool pool = new JedisPool(poolConfig, “192.168.83.128”, 6379, 0, “123”);

Jedis jedis = null;

try {

for (int i = 0; i < 5; i++) {

jedis = pool.getResource();

jedis.set(“foo” + i, “bar” + i);

System.out.println(“第” + (i + 1) + “个连接, 得到的值为” + jedis.get(“foo” + i));

// 用完一定要释放连接

jedis.close();

}

} finally {

pool.close();

}

如上,创建出一个JedisPool对象,然后调用其getResource()方法获取redis连接即可,之后就可以调用Jedis API操作redis了。jedis连接用完要释放即close,如果不close,则产生的连接会越来越多,当达到了最大连接数,再想获得连接,就会等待,当超过了最大等待时间后就会报异常。

第二:集群状态下

集群状态下用Jedis获取redis连接,是得到JedisCluster对象,之后对redis进行操作都是用此对象的方法进行的:

[java] view plain copy

public static void main(String[] args) {

JedisPoolConfig poolConfig = new JedisPoolConfig();

// 最大连接数

poolConfig.setMaxTotal(1);

// 最大空闲数

poolConfig.setMaxIdle(1);

// 最大允许等待时间,如果超过这个时间还未获取到连接,则会报JedisException异常:

// Could not get a resource from the pool

poolConfig.setMaxWaitMillis(1000);

Set nodes = new LinkedHashSet ();

nodes.add(new HostAndPort(“192.168.83.128”, 6379));

nodes.add(new HostAndPort(“192.168.83.128”, 6380));

nodes.add(new HostAndPort(“192.168.83.128”, 6381));

nodes.add(new HostAndPort(“192.168.83.128”, 6382));

nodes.add(new HostAndPort(“192.168.83.128”, 6383));

nodes.add(new HostAndPort(“192.168.83.128”, 6384));

JedisCluster cluster = new JedisCluster(nodes, poolConfig);

String name = cluster.get(“name”);

System.out.println(name);

cluster.set(“age”, “18”);

System.out.println(cluster.get(“age”));

try {

cluster.close();

} catch (IOException e) {

e.printStackTrace();

}

用集群时,好像没有办法设置集群的参数,比如最大连接数,虽然在创建JedisCluster 对象时传了JedisPoolConfig对象进去,但是JedisPoolConfig对象中的设置是不生效的。

redis集群模式和哨兵模式\_redis哨兵模式和集群区别\_02

连接redis时是连接的哨兵还是master

哨兵模式下,客户端一般会保持两种连接,与哨兵的连接,以及master的连接。数据操作当然使用master连接,如果master出故障了,可以通过与哨兵的连接来获取master的最新地址。

一般的客户端连接流程如下:

  1. 连接哨兵,根据master的名称获取master的ip和port。

  2. 通过ip和port连接master。

例如,jedis就提供了哨兵模式的客户端连接池类JedisSentinelPool,在运行过程中,客户端会保持与哨兵以及master的连接。

另外,有一些公司自己封装了redis客户端,可以通过哨兵获得master及其slaves,采用读写分离,读slaves,写master。您好,brpop命令接收两个参数,第一个是键名,第二个是超时时间,单位是秒。当超过了此时间仍然没有获得新元素的话就会返回nil。上例中超时时间为”0”,表示不限制等待的时间,即如果没有新元素加入列表就会永远阻塞下去。 当获得一个元素后brpop命令返回两个值,分别是键名和元素值。为了测试brpop命令,我们可以打开两个redis-cli实例,在实例a中: redis a> brpop queue 0键入回车后实例1会处于阻塞状态,这时在实例b中向queue中加入一个元素: redis b> lpush queue task 敞鸡搬课植酒邦旬鲍莫 (integer) 1在lpush命令执行后实例a马上就返回了结果: 1) “queue” 2) “task”同时会发现queue中的元素已经被取走: redis> llen queue (integer) 0除了brpop命令外,redis还提供了blpop,和brpop的区别在与从队列取元素时blpop会从队列左边取。

发表评论

表情:
评论列表 (有 0 条评论,31人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redisredis哨兵模式详解

    > 哨兵模式,一个哨兵集群和一组主从架构组成。比主从更好的是当我们的主节点宕机以后,哨兵会主动选举出一个主节点继续向外提供服务。 ![在这里插入图片描述][ab481446e