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的性能還是杠杠滴,不過要批量寫,讀,否則也會慢的很。