人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)
Redis 集群搭建、Spring Data Redis使用
redis 集群搭建
redis报错信息:CLUSTERDOWN Hash slot not served 和 Not all 16384 slots are covered by nodes
参数名 默认值 含义
maxActive 8 连接池中最大连接数
maxIdle 8 连接池中最大空闲的连接数
minIdle 0 连接池中最少空闲的连接数
maxWaitMillis -1:表示永远不超时,一直等。 当连接池资源用尽后,调用者的最大等待时间(单位为毫秒),一般不建议使用默认值
jmxEnabled true 是否开启jmx监控,如果应用开启了jmx端口并且jmxEnabled设置为true,
就可以通过jconsole或者jvisualvm看到关于连接池的相关统计,
有助于了解连接池的使用情况,并且可以针对其做监控统计
minEvictableIdleTimeMillis 30分钟 连接的最小空闲时间,达到此值后空闲连接将被移除
numTestsPerEvictionRun 3 做空闲连接检测时,每次的采样数
testOnBorrow false 向连接池借用连接时是否做连接有效性检测(ping),无效连接会被移除,每次借用多执行一次ping命令
testOnReturn false 向连接池归还连接时是否做连接有效性检测(ping),无效连接会被移除,每次归还多执行一次ping命令
testWhileIdle false 向连接池借用连接时是否做连接空闲检测,空闲超时的连接会被移除
timeBetweenEvictionRunsMillis -1:表示不做检测 空闲连接的检测周期(单位为毫秒)
blockWhenExhausted true 当连接池用尽后,当调用者发现池子中没有资源时,调用者是否要等待,为false时会立即抛出异常不进行等待,默认true阻塞直到超时
这个参数是和maxWaitMillis对应的,只有当此参数为true时,maxWaitMillis才会生效
JedisCluster包含了所有节点的连接池,建议JedisCluster使用单例。JedisCluster每次操作完成后,不需要管理连接池的借还,它在内部已经完成。
JedisCluster不用执行close()操作,它会将所有的JedisPool执行destory操作。
非集群状态下用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毫秒之内没有连上服务器而报错。
创建出一个JedisPool对象,然后调用其getResource()方法获取redis连接即可,之后就可以调用Jedis API操作redis了。
jedis连接用完要释放即close,如果不close,则产生的连接会越来越多,当达到了最大连接数,再想获得连接,就会等待,当超过了最大等待时间后就会报异常。
集群状态下:
集群状态下用Jedis获取redis连接,是得到JedisCluster对象,之后对redis进行操作都是用此对象的方法进行的
#redis.ips.ports 为自己定义的参数
# 内网
#redis.ips.ports=IP:端口,IP:端口,IP:端口
#外网
redis.ips.ports=IP:端口,IP:端口,IP:端口
##连接池最大连接数,默认是8。
redis.maxActive=80
##连接池中最大空闲的连接数
redis.maxIdle=10
##连接池中最小空闲的连接数
redis.minIdle=10
#空闲连接的检测周期(单位为毫秒),默认-1 表示不做检测
redis.timeBetweenEvictionRunsMillis=60000
#做空闲连接检测时,每次的采样数,默认3
redis.numTestsPerEvictionRun=10
#当连接池用尽后,调用者是否要等待,此参数和maxWaitMillis对应的,只有当此参数为true时,maxWaitMills才会生效。
#设置了blockWhenExhausted=false,那么调用者发现池子中没有资源时,会立即抛出异常不进行等待
#默认true 阻塞直到超时
redis.blockWhenExhausted=true
#当连接池用尽后,调用者的最大等待时间(单位为毫秒),默认值为-1 表示永不超时,一直等待,一般不建议使用默认值。
redis.maxWaitMillis = -1
##向连接池借用连接时是否做连接有效性检测(ping),无效连接会被移除,每次借出多执行一次ping命令,默认false。
redis.testOnBorrow=true
##向连接池归还连接时是否做连接有效性检测(ping),无效连接会被移除,每次借出多执行一次ping命令,默认false。
redis.testOnReturn=true
#向连接池借用连接时是否做连接空闲检测,空闲超时的连接会被移除,默认false。
redis.testWhileIdle=true
##当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能,单位毫秒
redis.timeout=3000
#连接的最小空闲时间,达到此值后空闲连接将被移除
redis.minEvictableIdleTimeMills=30000
private final static jedisTest jt = new jedisTest();
public static JedisCluster getJedisCluster()
{
JedisCluster jedisCluster = null;
try
{
//加载连接池配置文件
/*
InputStream in = 类名.class.getClassLoader().getResourceAsStream("/redis.properties");
InputStream in = 类实例对象名.getClass().getResourceAsStream("/druid.properties");
properties.load(in);
Properties properties = new Properties();
in.close();
*/
// InputStream in = jedisTest.class.getClassLoader().getResourceAsStream("/redis.properties");
InputStream in = jt.getClass().getResourceAsStream("/redis.properties");
Properties props = new Properties();
System.out.println();
props.load(in);
in.close();
String hostAndPorts = props.getProperty("redis.ips.ports");
System.out.println(hostAndPorts);
if (jedisCluster == null)
{
int connectTimeOut = 10000;//连接超时
int soTimeOut = 5000;//读写超时
int maxAttemts = 10;//重试次数
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(Integer.valueOf(props.getProperty("redis.maxActive"))); //连接池最大连接数
poolConfig.setMaxIdle(Integer.valueOf(props.getProperty("redis.maxIdle")));//连接池中最大空闲的连接数
//当连接池用尽后,调用者的最大等待时间(单位为毫秒),默认值为-1 表示永不超时,一直等待,一般不建议使用默认值。
// poolConfig.setMaxWaitMillis(Long.valueOf(props.getProperty("redis.maxWaitMillis")));
//向连接池借用连接时是否做连接有效性检测(ping),无效连接会被移除,每次借出多执行一次ping命令,默认false。
poolConfig.setTestOnBorrow(Boolean.valueOf(props.getProperty("redis.testOnBorrow")));
//向连接池归还连接时是否做连接有效性检测(ping),无效连接会被移除,每次借出多执行一次ping命令,默认false。
poolConfig.setTestOnReturn(Boolean.valueOf(props.getProperty("redis.testOnReturn")));
//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
poolConfig.setBlockWhenExhausted(true);
//设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
poolConfig.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
//是否启用pool的jmx管理功能, 默认true
poolConfig.setJmxEnabled(true);
//MBean ObjectName = new ObjectName("org.apache.commons.pool2:type=GenericObjectPool,name=" + "pool" + i); 默 认为"pool", JMX不熟,具体不知道是干啥的...默认就好.
poolConfig.setJmxNamePrefix("pool");
//是否启用后进先出, 默认true
poolConfig.setLifo(true);
//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
poolConfig.setMaxWaitMillis(-1);
//逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
poolConfig.setMinEvictableIdleTimeMillis(1800000);
//最小空闲连接数, 默认0
poolConfig.setMinIdle(10);
//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
//做空闲连接检测时,每次的采样数,默认3
poolConfig.setNumTestsPerEvictionRun(3);
//对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略)
poolConfig.setSoftMinEvictableIdleTimeMillis(1800000);
//在空闲时检查有效性, 默认false
poolConfig.setTestWhileIdle(false);
//逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
poolConfig.setTimeBetweenEvictionRunsMillis(-1);
Set jedisClusterNode = new HashSet();
String[] hosts = hostAndPorts.split(",");
for (String hostport : hosts)
{
String[] ipport = hostport.split(":");
String ip = ipport[0];
int port = Integer.parseInt(ipport[1]);
jedisClusterNode.add(new HostAndPort(ip, port));
}
if (jedisCluster == null)
{
jedisCluster = new JedisCluster(jedisClusterNode, connectTimeOut, soTimeOut, maxAttemts, poolConfig);
}
}
} catch (Exception e)
{
e.printStackTrace();
}
return jedisCluster;
}
public static void main(String[] args)
{
// JedisCluster jedisCluster = getJedisCluster();
String ng = jedisCluster.set("ng", 0 + "");
System.out.println(ng);
//
// String ng1 = jedisCluster.get("ng");
// System.out.println(ng1);
// jedisCluster.close();
//--------------------------------------------------
// JedisPool jedisPool1 = getJedisPool1();
JedisPool jedisPool2 = getJedisPool2();
//从连接池获得连接
Jedis jedis = jedisPool2.getResource();
String result = jedis.get("ng");
System.out.println("result:"+result);
String a = jedis.set("ng", "0");
System.out.println("设置的值:"+a);
System.out.println("OK".equals(a));
result = jedis.get("a");
System.out.println(result);
//每次jedis使用完毕后需要关闭,连接池回收资源。
jedis.close();
//系统结束前关闭连接池
jedisPool2.close();
}
@Test
public void testJedisCluster1() throws Exception
{
//连接集群使用JedisCluster对象
Set nodes = new HashSet<>();
nodes.add(new HostAndPort("IP", 2311));
nodes.add(new HostAndPort("IP", 2311));
nodes.add(new HostAndPort("IP", 2311));
nodes.add(new HostAndPort("IP", 2312));
nodes.add(new HostAndPort("IP", 2312));
nodes.add(new HostAndPort("IP", 2312));
//系统中可以是单例
JedisCluster jedisCluster = new JedisCluster(nodes);
// jedisCluster.set("ng", "0");
String result = jedisCluster.get("a");
System.out.println(result);
//系统结束前关闭JedisCluster
jedisCluster.close();
}
@Test
public void testJedisCluster2() throws Exception
{
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("IP", 2311));
nodes.add(new HostAndPort("IP", 2311));
nodes.add(new HostAndPort("IP", 2311));
nodes.add(new HostAndPort("IP", 2312));
nodes.add(new HostAndPort("IP", 2312));
nodes.add(new HostAndPort("IP", 2312));
JedisCluster cluster = new JedisCluster(nodes, poolConfig);
String name = cluster.get("ng");
System.out.println("name:"+name);
// cluster.set("age", "18");
// System.out.println(cluster.get("age"));
try
{
cluster.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
public static JedisPool getJedisPool1()
{
JedisPoolConfig config = new JedisPoolConfig();
//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
config.setBlockWhenExhausted(true);
//设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
//是否启用pool的jmx管理功能, 默认true
config.setJmxEnabled(true);
//MBean ObjectName = new ObjectName("org.apache.commons.pool2:type=GenericObjectPool,name=" + "pool" + i); 默 认为"pool", JMX不熟,具体不知道是干啥的...默认就好.
config.setJmxNamePrefix("pool");
//是否启用后进先出, 默认true
config.setLifo(true);
//最大空闲连接数, 默认8个
config.setMaxIdle(8);
//最大连接数, 默认8个
config.setMaxTotal(8);
//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
config.setMaxWaitMillis(-1);
//逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
config.setMinEvictableIdleTimeMillis(1800000);
//最小空闲连接数, 默认0
config.setMinIdle(0);
//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
config.setNumTestsPerEvictionRun(3);
//对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略)
config.setSoftMinEvictableIdleTimeMillis(1800000);
//在获取连接的时候检查有效性, 默认false
config.setTestOnBorrow(false);
//在空闲时检查有效性, 默认false
config.setTestWhileIdle(false);
//逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
config.setTimeBetweenEvictionRunsMillis(-1);
JedisPool pool = new JedisPool(config, "IP",2311);
return pool;
}
public static JedisPool getJedisPool2()
{
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, "IP", 6379, 0, "123"); //密码 123
JedisPool pool = new JedisPool(poolConfig, "IP", 2312, 0);
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();
}
return pool;
}
@Test
public void testJedisPool() throws Exception {
//创建一个连接池对象
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
//从连接池获得连接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("a");
System.out.println(result);
String a = jedis.set("a", "100");
System.out.println("设置的值:"+a);
System.out.println("OK".equals(a));
result = jedis.get("a");
System.out.println(result);
//每次jedis使用完毕后需要关闭,连接池回收资源。
jedis.close();
//系统结束前关闭连接池
jedisPool.close();
}
@Test
public void testJedisPingPong() {
//使用Jedis(redis的IP 或“hosts文件中redis的IP所映射的”域名, redis端口6379)
// Jedis jedis = new Jedis("127.0.0.1", 6379);
Jedis jedis = new Jedis("IP", 2312);
String ping = jedis.ping();
System.out.println(ping);
}
@Test
public void testJedisSingle() throws Exception {
//使用Jedis(redis的IP 或“hosts文件中redis的IP所映射的”域名, redis端口6379)
Jedis jedis = new Jedis("127.0.0.1", 6379);
jedis.set("mytest", "1000");
String result = jedis.get("mytest");
System.out.println(result);
jedis.close();
}