关于 Redis Cluster 模式下获取 Java Client 的问题

标签: Redis JedisCluster
7人阅读 评论(2) 收藏 举报
分类:

Redis连接池对于单机模式来说,官网有提供个JedisPool工具类,用起来也比较方便
但是对于Redis集群模式下,官网没有提供连接池的工具类,于是就需要我们自己来实现类似的功能了,我这里采用的是单例模式的方法来解决高并发的场景。

单机模式

如果对于 Redis 是单机模式下的话,那么 Redis 有提供一个JedisPool类 用来构建 Redis Client 的连接池,非常方便,简单代码如下:

JedisPoolConfig config = new JedisPoolConfig();
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(5);
//控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
config.setMaxTotal(1000 * 100);
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
config.setMaxWaitMillis(30);
config.setTestOnBorrow(true);
config.setTestOnReturn(true);
//如果你遇到 java.net.SocketTimeoutException: Read timed out exception的异常信息,请尝试在构造JedisPool的时候设置自己的超时值. JedisPool默认的超时时间是2秒(单位毫秒)
pool = new JedisPool(config, "127.0.0.1", 6379);

/*
 * 获得jedis连接
 */
Jedis jedis = pool.getResource();

集群模式

单机模式Redis官方有提供JedisPool类,用起来非常方便。
但是,如果Redis部署的是集群模式,你会发现,官方根本就没有提供集群模式下的连接池的类!!
官方有提供一个JedisClsuter的客户端类。但是如果在高并发的情况下,每要处理一次就新建一个JedisCluster,那么显然这种方式是不可取的!

那么问题来了,Redis集群模式应该如何解决高并发的场景呢?

咦,这是我想到了一个自己感觉很不错的方法,就是采用单例模式,简单的代码如下:

public class JedisClsuterUtil {
    private static JedisCluster jedis = null;

    private JedisClsuterUtil(){}

    public static JedisCluster getJedis(){
        if(jedis==null){
            synchronized(JedisClsuterUtil.class){
                if(jedis==null){
                    Set<HostAndPort> hostAndPortSet = new HashSet();
                    hostAndPortSet.add(new HostAndPort("host1", 9001));
                    hostAndPortSet.add(new HostAndPort("host2", 9002));
                    // ....

                    jedis = new JedisCluster(hostAndPortSet);
                }
            }
        }
        return jedis;
    }
}

用该方法测试过,是没有问题的。

改进:
上面是依靠double-checked locking的,这是一种不正确的用法,并不能达到预期目标。
所以以下是单例模式的改进版:

public class JedisClsuterUtil {

    private JedisClsuterUtil(){}

    public static JedisCluster getJedis(){
        return JedisClusterHolder.jedis;    
    }

    private static class JedisClusterHolder{
        private static Set<HostAndPort> hostAndPortSet;
        static {
            hostAndPortSet = new HashSet();
            hostAndPortSet.add(new HostAndPort("host1", 9001));
            hostAndPortSet.add(new HostAndPort("host2", 9002));
        }
        private static JedisCluster jedis = new JedisCluster(hostAndPortSet);
    }
}

各位有什么更好的想法或者问题可以提出来讨论讨论。。

查看评论

spark-client和spark-cluster详解

spark-client和spark-cluster详解
  • high2011
  • high2011
  • 2017-03-28 15:38:13
  • 3092

redis-cluster官方集群模式下使用pipeline批量操作

         redis从3.0版本后引入了令人兴奋的cluster集群模式,相信很多人都尝试过了,在高兴之余却发现redis官方的cluster对于java客户端的jedis支持却不是很好...
  • kevin_pso
  • kevin_pso
  • 2016-12-30 17:16:14
  • 5125

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

https://my.oschina.net/u/2263956/blog/799016    摘要:  Redis服务器的部署方式可分为单机和集群的方式,使用Jedis的对应访问...
  • haiyang4988
  • haiyang4988
  • 2017-04-22 14:17:04
  • 4002

Spark Client和Cluster两种运行模式的工作流程

1.client mode: In client mode, the driver is launched in the same process as the client that submit...
  • SummerMangoZz
  • SummerMangoZz
  • 2017-05-22 16:28:00
  • 2485

分析spark on yarn cluster 与 client 模式的区别

Spark on yarn有分为两种模式yarn-cluster和yarn-client Spark支持可插拔的集群管理模式(Standalone、Mesos以及YARN ),集群管理负责启动exe...
  • xinganshenguang
  • xinganshenguang
  • 2016-11-23 11:12:47
  • 2633

java连接redis-cluster集群方式

转载自:http://blog.csdn.net/u013322876/article/details/50595833 redis相关网站: 官网: http://redis.io   ...
  • guying4875
  • guying4875
  • 2018-01-12 16:16:50
  • 558

Spark on Yarn Client和Cluster模式详解

Spark在YARN中有yarn-cluster和yarn-client两种运行模式: I. Yarn Cluster Spark Driver首先作为一个ApplicationMaster在...
  • leishenop
  • leishenop
  • 2017-02-15 17:12:14
  • 1505

Redis中国用户组|唯品会Redis cluster大规模生产实践经验

嘉宾:陈群 很高兴有机会给大家分享redis cluster的生产实践经验。目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作。 Outline 一、生产应用...
  • younger_z
  • younger_z
  • 2016-10-07 18:15:58
  • 1146

redis-cluster通用java接口

1.redis-cluster通过结合jedis和spring-data-redis包开发的一个简易方便的redis 集群访问接口。对于redis-cluster方式集群安装参照:http://blo...
  • CWeeYii
  • CWeeYii
  • 2017-05-07 20:38:32
  • 1343

redis集群环境搭建以及java中jedis客户端集群代码实现 博客分类: redis

redis集群环境搭建以及java中jedis客户端集群代码实现 博客分类:  redis redislinuxrubygemsjava                最近项目中用到了r...
  • u013322876
  • u013322876
  • 2016-01-27 17:44:40
  • 10133
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 1万+
    积分: 625
    排名: 8万+
    博客专栏
    最新评论