zoukankan      html  css  js  c++  java
  • Ubuntu 15.10 下Scala 操作Redis Cluster

    1 前言

        Redis Standalone,Redis Cluster的安装在前面介绍过,地址:http://www.cnblogs.com/liuchangchun/p/5063477.html,这里不做介绍。

    2 Redis的使用

        针对各种编程语言,差不多都有Redis的驱动程序。针对Scala程序,在github上面有几个可用驱动:

        scala-redis:https://github.com/liuchchc/scala-redis

        rediscala:https://github.com/etaty/rediscala

        jedis:https://github.com/liuchchc/jedis

        我用的是jedis,感觉还是蛮好用的,支持Cluster

    2.1 JedisSentinelPool方式

        Standalone模式中,Cluster提供了哨兵用于监视Redis Server的运行状态,并选举出Master,这个模式中需要配置sentinel.conf,在这种模式下Jedis中如下使用

      val sentinelClusterName = "mymaster"
    
      val sentinelServerHostHS = new HashSet[String]
      sentinelServerHostHS.add("192.168.1.103:26379")
      sentinelServerHostHS.add("192.168.1.104:26379")
      sentinelServerHostHS.add("192.168.1.105:26379")
      sentinelServerHostHS.add("192.168.1.106:26379")
      sentinelServerHostHS.add("192.168.1.107:26379")
      sentinelServerHostHS.add("192.168.1.108:26379") 
    
       // 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽),默认值是8。
      val MAX_ACTIVE = -1;
      // 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
      val MAX_IDLE = -1;
      // 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
      val MAX_WAIT = -1;
      // 超时时间,0永不超时
      val TIMEOUT = 0;
    
      var poolConfig = new GenericObjectPoolConfig
      poolConfig.setMaxTotal(MAX_ACTIVE)
      poolConfig.setMaxIdle(MAX_IDLE)
      poolConfig.setMaxWaitMillis(MAX_WAIT)
      poolConfig.setTestOnBorrow(true)
      poolConfig.setTestOnReturn(true)
    
      def getPoolConfig: GenericObjectPoolConfig = poolConfig
    lazy val jedisSentinelPool = new JedisSentinelPool("mymaster", sentinelServerHostHS, poolConfig, TIMEOUT)
    lazy val sentinelConnection = jedisShardedPool.getResource
    // Redis 操作……
    // Redis 操作完毕
    sentinelConnection.close
    jedisSentinelPool.destroy

    2.2 ShardedJedisPool方式

      val shardsServerHostList = new ArrayList[JedisShardInfo]
      val si1 = new JedisShardInfo("192.168.1.103", 6379)
      val si2 = new JedisShardInfo("192.168.1.104", 6379)
      val si3 = new JedisShardInfo("192.168.1.105", 6379)
      val si4 = new JedisShardInfo("192.168.1.106", 6379)
      val si5 = new JedisShardInfo("192.168.1.107", 6379)
      val si6 = new JedisShardInfo("192.168.1.108", 6379)
    
      shardsServerHostList.add(si1)
      shardsServerHostList.add(si2)
      shardsServerHostList.add(si3)
      shardsServerHostList.add(si4)
      shardsServerHostList.add(si5)
      shardsServerHostList.add(si6)
      lazy val jedisShardedPool = new ShardedJedisPool(poolConfig, shardsServerHostList)
      lazy val shardedConnection = jedisShardedPool.getResource
      // Redis 操作……
      // Redis 操作完毕
      shardedConnection.close
      jedisShardedPool.destroy

    2.3 JedisCluster方式

        在Redis Cluster模式中,我这里面是3 master,6 slave,HostAndPort只需要传1个,Redis会自己检测整个集群中有哪些Master和Slave。至于在添加数据时候数据存储到哪个集群中,用户层面不需要关心,读取数据也一样。

      val jedisClusterNodes = new java.util.HashSet[HostAndPort]()
      jedisClusterNodes.add(new HostAndPort("192.168.1.100", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.101", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.103", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.104", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.105", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.106", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.107", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.108", 6379))
      jedisClusterNodes.add(new HostAndPort("192.168.1.109", 6379))
      // Redis 操作
    lazy val jedisCluster = new JedisCluster(jedisClusterNodes)

    3 使用场景

        这里是Spark处理生物数据,因为中间结果比较多,所以加了一台Redis Server存储中间结果,总共1亿多条,3.5G左右,大概在分分钟就能存进去,所以Redis的性能还是杠杠滴,不过要批量写,读,否则也会慢的很。

    4 参考文献:

    4.1 http://my.oschina.net/zhuguowei/blog/411077

    4.2 http://ju.outofmemory.cn/entry/141317

  • 相关阅读:
    about paper
    虚拟环境部署过程中遇到的问题
    201621123028《Java程序设计》第4周学习总结
    Linux C 数据结构 ->单向链表<-(~千金散尽还复来~)
    Spring 解析(获取)URL 参数
    【简单】罗马数字转整数
    【简单】字符串字母数统计
    MongoDB 集合(collection)常用方法 (Method)
    python中group()函数的用法
    requests库
  • 原文地址:https://www.cnblogs.com/liuchangchun/p/5094693.html
Copyright © 2011-2022 走看看