java redis 切换db_Springboot 实现Redis 同数据源动态切换db_2484684264的博客-程序员宅基地

技术标签: java redis 切换db  

默认redis使用的是db 0,而我们自己在配置连接的时候可以设置默认使用db ,如:

72227d19d1ecc1ea87214a92218674cd.png

那么怎么去实现动态 去切换自己想使用的db呢?

LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();

connectionFactory.setDatabase(num);

依赖

org.springframework.boot

spring-boot-starter-data-redis

org.apache.commons

commons-pool2

redis.clients

jedis

3.1.0

yml

redis:

host: 192.168.222.157

port: 7002

# password: xatgood

database: 0

timeout: 6000 # 连接超时时间(毫秒)默认是2000ms

lettuce:

pool:

max-active: 200 # 连接池最大连接数(使用负值表示没有限制)

max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)

max-idle: 100 # 连接池中的最大空闲连接

min-idle: 50 # 连接池中的最小空闲连接

shutdown-timeout: 500

# sentinel: # 哨兵模式

# master: mymaster

# nodes: 192.168.222.155:26379,192.168.222.155:26380,192.168.222.155:26381

# cluster: #集群模式

# nodes:

# - 192.168.222.157:6379

# - 192.168.222.157:6380

# - 192.168.222.157:6381

# - 192.168.222.157:6389

# - 192.168.222.157:6390

# - 192.168.222.157:6391

max-redirects: 3 # 获取失败 最大重定向次数

新建RedisConfig配置类

第一类:

/**

* Redis配置类

*/

@Slf4j

@Configuration

public class RedisConfig {

@Resource

private RedisTemplate redisTemplate;

public RedisTemplate setDataBase(int num) {

LettuceConnectionFactory connectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();

if (connectionFactory != null && num != connectionFactory.getDatabase()) {

connectionFactory.setDatabase(num);

this.redisTemplate.setConnectionFactory(connectionFactory);

connectionFactory.resetConnection();

}

return redisTemplate;

}

/**

* 序列化注入spring容器的RedisTemplate

*

* @return

*/

@Bean

public RedisTemplate getRedisTemplate() {

Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper mapper = new ObjectMapper();

mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

// mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

serializer.setObjectMapper(mapper);

//使用StringRedisSerializer来序列化和反序列化redis的key值

redisTemplate.setKeySerializer(new StringRedisSerializer());

redisTemplate.setValueSerializer(serializer);

redisTemplate.setHashKeySerializer(new StringRedisSerializer());

redisTemplate.setHashValueSerializer(new StringRedisSerializer());

redisTemplate.afterPropertiesSet();

// redisTemplate.setEnableTransactionSupport(true);

return redisTemplate;

}

}

第二类

packagecom.zdyl.wxapplet.config;importcom.fasterxml.jackson.annotation.JsonAutoDetect;importcom.fasterxml.jackson.annotation.PropertyAccessor;importcom.fasterxml.jackson.databind.ObjectMapper;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.pool2.impl.GenericObjectPoolConfig;importorg.springframework.boot.autoconfigure.data.redis.RedisProperties;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Scope;import org.springframework.data.redis.connection.*;importorg.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;importorg.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;importorg.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;importorg.springframework.util.Assert;importorg.springframework.util.StringUtils;importjavax.annotation.PostConstruct;importjavax.annotation.Resource;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/*** Redis配置类*/@Slf4j

@Configurationpublic classRedisConfig {

@ResourceprivateRedisProperties redisProperties;

@ResourceprivateRedisTemplate redisTemplate;public static Map> redisTemplateMap = new HashMap<>();

@PostConstructpublic void initRedisTemp() throwsException {for (int i = 0; i <= 15; i++) {

redisTemplateMap.put(i, getRedisTemplate(i));

}

}/*** 获取redisTemplate实例

*

*@paramdb

*@return

*/

private RedisTemplate getRedisTemplate(intdb) {final RedisTemplate redisTemplate = new RedisTemplate<>();

LettuceConnectionFactory factory=factory();

factory.setDatabase(db);

redisTemplate.setConnectionFactory(factory);returnserializer(redisTemplate);

}/*** redis单机配置

*

*@return

*/

privateRedisStandaloneConfiguration redisConfiguration() {

RedisStandaloneConfiguration redisStandaloneConfiguration= newRedisStandaloneConfiguration();

redisStandaloneConfiguration.setHostName(redisProperties.getHost());

redisStandaloneConfiguration.setPort(redisProperties.getPort());//设置密码

if (redisProperties.getPassword() != null) {

redisStandaloneConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));

}returnredisStandaloneConfiguration;

}/*** redis哨兵配置

*

*@return

*/

privateRedisSentinelConfiguration getSentinelConfiguration() {

RedisProperties.Sentinel sentinel=redisProperties.getSentinel();if (sentinel != null) {

RedisSentinelConfiguration config= newRedisSentinelConfiguration();

config.setMaster(sentinel.getMaster());if (!StringUtils.isEmpty(redisProperties.getPassword())) {

config.setPassword(RedisPassword.of(redisProperties.getPassword()));

}

config.setSentinels(createSentinels(sentinel));returnconfig;

}return null;

}/*** 获取哨兵节点

*

*@paramsentinel

*@return

*/

private ListcreateSentinels(RedisProperties.Sentinel sentinel) {

List nodes = new ArrayList<>();for(String node : sentinel.getNodes()) {

String[] parts= StringUtils.split(node, ":");

Assert.state(parts.length== 2, "redis哨兵地址配置不合法!");

nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));

}returnnodes;

}/*** redis集群配置

*

*@return

*/

privateRedisClusterConfiguration getRedisClusterConfiguration() {

RedisProperties.Cluster cluster=redisProperties.getCluster();if (cluster != null) {

RedisClusterConfiguration config= newRedisClusterConfiguration();

config.setClusterNodes(createCluster(cluster));if (!StringUtils.isEmpty(redisProperties.getPassword())) {

config.setPassword(RedisPassword.of(redisProperties.getPassword()));

}

config.setMaxRedirects(redisProperties.getCluster().getMaxRedirects());returnconfig;

}return null;

}/*** 获取集群节点

*

*@paramcluster

*@return

*/

private ListcreateCluster(RedisProperties.Cluster cluster) {

List nodes = new ArrayList<>();for(String node : cluster.getNodes()) {

String[] parts= StringUtils.split(node, ":");

Assert.state(parts.length== 2, "redis哨兵地址配置不合法!");

nodes.add(new RedisNode(parts[0], Integer.valueOf(parts[1])));

}returnnodes;

}/*** 连接池配置

*

*@return

*/

privateGenericObjectPoolConfig redisPool() {

GenericObjectPoolConfig genericObjectPoolConfig=

newGenericObjectPoolConfig();

genericObjectPoolConfig.setMaxIdle(redisProperties.getLettuce().getPool().getMaxIdle());

genericObjectPoolConfig.setMinIdle(redisProperties.getLettuce().getPool().getMinIdle());

genericObjectPoolConfig.setMaxTotal(redisProperties.getLettuce().getPool().getMaxActive());

genericObjectPoolConfig.setTestOnBorrow(true);

genericObjectPoolConfig.setTestWhileIdle(true);

genericObjectPoolConfig.setTestOnReturn(false);

genericObjectPoolConfig.setMaxWaitMillis(5000);returngenericObjectPoolConfig;

}/*** redis客户端配置

*

*@return

*/

privateLettuceClientConfiguration clientConfiguration() {

LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder builder=LettucePoolingClientConfiguration.builder();

builder.commandTimeout(redisProperties.getLettuce().getShutdownTimeout());

builder.shutdownTimeout(redisProperties.getLettuce().getShutdownTimeout());

builder.poolConfig(redisPool());

LettuceClientConfiguration lettuceClientConfiguration=builder.build();returnlettuceClientConfiguration;

}/*** redis获取连接工厂

*

*@return

*/@Scope(scopeName= "prototype")privateLettuceConnectionFactory factory() {//根据配置和客户端配置创建连接

LettuceConnectionFactory lettuceConnectionFactory = null;if (redisProperties.getSentinel() == null && redisProperties.getCluster() == null) { //单机模式

lettuceConnectionFactory = newLettuceConnectionFactory(redisConfiguration(), clientConfiguration());

lettuceConnectionFactory.afterPropertiesSet();

}else if (redisProperties.getCluster() == null) { //哨兵模式

lettuceConnectionFactory = newLettuceConnectionFactory(getSentinelConfiguration(), clientConfiguration());

lettuceConnectionFactory.afterPropertiesSet();

}else { //集群模式

lettuceConnectionFactory = newLettuceConnectionFactory(getRedisClusterConfiguration(), clientConfiguration());

lettuceConnectionFactory.afterPropertiesSet();

}returnlettuceConnectionFactory;

}/*** 序列化

*

*@paramredisTemplate

*@return

*/

private RedisTemplateserializer(RedisTemplate redisTemplate) {

Jackson2JsonRedisSerializer serializer= new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper mapper= newObjectMapper();

mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);//mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

serializer.setObjectMapper(mapper);//使用StringRedisSerializer来序列化和反序列化redis的key值

redisTemplate.setKeySerializer(newStringRedisSerializer());

redisTemplate.setValueSerializer(serializer);

redisTemplate.setHashKeySerializer(newStringRedisSerializer());

redisTemplate.setHashValueSerializer(newStringRedisSerializer());

redisTemplate.afterPropertiesSet();//redisTemplate.setEnableTransactionSupport(true);

returnredisTemplate;

}

}

Redis工具类

/**

* redis工具类

*/

@Slf4j

@Component

public class RedisUtils {

@Resource

private RedisConfig redisConfig;

/**

* 根据db获取对应的redisTemplate实例

*

* @param db

* @return redisTemplate实例

*/

public RedisTemplate getRedisTemplateByDb(final int db) {

return redisConfig.setDataBase(db);

}

/**

* 设置缓存

*

* @param key 缓存key

* @param value 缓存value

*/

public void setString(String key, String value, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

redisTemplate.opsForValue().set(key, value);

log.debug("RedisUtil:set cache key={},value={}", key, value);

}

/**

* 设置缓存,并且自己指定过期时间

*

* @param key

* @param value

* @param expireTime 过期时间

*/

public void setString(String key, String value, int expireTime, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);

log.debug("RedisUtil:set cache key={},value={}", key, value, expireTime, TimeUnit.SECONDS);

}

/**

* 设置缓存对象,可指定DB

*

* @param key 缓存key

* @param obj 缓存value

*/

public void setObject(String key, T obj, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

redisTemplate.opsForValue().set(key, obj);

}

/**

* 新增hashMap值

*

* @param key

* @param hashKey

* @param hashValue

* @param db

* @return void

* @author WangJing

* @date 2019年10月26日 9:22

*/

public void hashPutString(Serializable key, Serializable hashKey, String hashValue, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

operations.put(key, hashKey, hashValue);

}

/**

* 以map集合的形式添加键值对

*

* @param key

* @param maps

* @param db

* @return void

* @author Sunhj

* @date 2019年10月26日 9:56

*/

public void hashPutAll(String key, Map maps, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

operations.putAll(key, maps);

}

/**

* 获取变量中的键值对

* {key3=value3, key1=value1, key5=value5, key4=value4, key2=value2}

*

* @param db

* @param key

* @return java.util.Map

* @author wangj

* @date 2019年10月26日 8:47

*/

public Map hashGetAll(int db, Serializable key) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.opsForHash().entries(key);

}

/**

* 判断key是否存在

*

* @param key

* @param db

* @return java.util.Map

* @author wangj

* @date 2019年10月26日 8:47

*/

public Boolean hashHasKey(Serializable key, Serializable hahsKey, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.opsForHash().hasKey(key, hahsKey);

}

/**

* 获取hash表中存在的所有的键

*

* @param key

* @param db

* @return java.util.List

* @author Sunhj

* @date 2019年10月26日 10:58

*/

public Set hashGetAllHashKeys(Serializable key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.opsForHash().keys(key);

}

/**

* 获取hash表中存在的所有的值

*

* @param key

* @param db

* @return java.util.List

* @author Sunhj

* @date 2019年10月26日 10:58

*/

public List hashGetAllHashValues(Serializable key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.opsForHash().values(key);

}

/**

* 根据key,hashKey

* 获取hash表中存在的单个值

*

* @param key

* @param db

* @return java.util.List

* @author Sunhj

* @date 2019年10月26日 10:58

*/

public Object hashGetObject(Serializable key, Serializable hashKey, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.opsForHash().get(key, hashKey);

}

/**

* 删除一个或者多个hash表字段

*

* @param key

* @param db

* @param fields

* @return java.lang.Long

* @author Sunhj

* @date 2019年10月26日 10:15

*/

public Long hashDelete(Serializable key, int db, Serializable... fields) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

return operations.delete(key, (Object) fields);

}

/**

* 删除一个hash表字段

*

* @param key

* @param db

* @param fields

* @return java.lang.Long

* @author Sunhj

* @date 2019年10月26日 10:15

*/

public boolean hashDeleteOne(Serializable key, String fields, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

return operations.delete(key, fields) == 1;

}

/**

* 设置缓存对象

*

* @param key 缓存key

* @param obj 缓存value

*/

public void setObject(String key, T obj, int expireTime, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

redisTemplate.opsForValue().set(key, obj, expireTime, TimeUnit.SECONDS);

}

/**

* 获取指定key的缓存

*

* @param key---JSON.parseObject(value, User.class);

*/

public Object getObject(String key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.opsForValue().get(key);

}

/**

* 判断当前key值 是否存在

*

* @param key

*/

public boolean hasKey(String key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

return redisTemplate.hasKey(key);

}

/**

* 获取指定key的缓存

*

* @param key

*/

public String getString(String key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

String value = (String) redisTemplate.opsForValue().get(key);

log.debug("RedisUtil:get cache key={},value={}", key, value);

return value;

}

/**

* 删除指定key的缓存

*

* @param key

*/

public void delete(String from, String key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

redisTemplate.delete(key);

log.info("RedisUtil:delete " + from + " cache key={}", key);

}

/**

* @param key

* @throws

* @Title: expire

* @Description: 更新key的失效时间

*/

public Boolean expire(String key, int seconds, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

log.debug("RedisUtil:expire cache key={}", key);

return redisTemplate.expire(key, seconds, TimeUnit.SECONDS);

}

/**

* 移除并获取列表中第一个元素

*

* @param key

* @param db

* @return void

* @author sunhj

* @date 2019年10月26日 14:35

*/

public String listLeftPop(Serializable key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

Object leftPop = redisTemplate.opsForList().leftPop(key);

if (leftPop == null) {

return null;

}

return JSON.toJSONString(leftPop);

}

/**

* 移除并获取列表最后一个元素

*

* @param key

* @param db

* @return java.lang.Object

* @author sunhj

* @date 2019年10月26日 14:40

*/

public String listRightPop(Serializable key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

ListOperations operations = redisTemplate.opsForList();

Object x = operations.rightPop(key);

if (x == null) {

return null;

}

return JSON.toJSONString(x);

}

/**

* 获取变量中的指定map键是否有值,如果存在该map键则获取值,没有则返回null。

*

* @param key

* @param field

* @param db

* @return T

* @author Sunhj

* @date 2019年10月26日 8:41

*/

public T hashGet(Serializable key, Serializable field, Class t, int db) {

try {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

//String x = Objects.requireNonNull(operations.get(key, field)).toString();

//T y = JSON.parseObject(Objects.requireNonNull(operations.get(key, field)).toString(), t);

//T y = JSON.parseObject(x , t);

return JSON.parseObject(Objects.requireNonNull(operations.get(key, field)).toString(), t);

} catch (Exception e) {

return null;

}

}

/**

* 获取变量中的指定map键是否有值,如果存在该map键则获取值(String格式),没有则返回null。

*

* @param key

* @param field

* @param db

* @return T

* @author Sunhj

* @date 2019年10月26日 8:41

*/

public String hashGetString(Serializable key, Serializable field, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

try {

Serializable serializable = operations.get(key, field);

if (serializable != null) {

return serializable.toString();

}

return null;

} catch (Exception e) {

log.error("hashGetString方法异常", e);

return null;

}

}

/**

* 获取变量中的键值对 ??

*

* @param key

* @param db

* @return java.util.Map

* @author Sunhj

* @date 2019年10月26日 8:47

*/

public Map hashGetAll(Serializable key, Class t, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

Map x = operations.entries(key);

Map map = new HashMap<>();

try {

for (Serializable xa : x.keySet()) {

String keyValue = x.get(xa).toString();

map.put(xa.toString(), JSON.parseObject(keyValue, t));

}

return map;

} catch (Exception e) {

return null;

}

}

/**

* 新增hashMap值

*

* @param key

* @param hashKey

* @param hashValue

* @param db

* @return void

* @author Sunhj

* @date 2019年10月26日 9:22

*/

public boolean hashPut(Serializable key, Serializable hashKey, T hashValue, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

operations.put(key, hashKey, JSON.toJSONString(hashValue, SerializerFeature.WriteMapNullValue));

return true;

}

/**

* 查看hash表中指定字段是否存在

*

* @param key

* @param field

* @param db

* @return boolean

* @author Sunhj

* @date 2019年10月26日 10:32

*/

public boolean hashExists(Serializable key, Serializable field, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

HashOperations operations = redisTemplate.opsForHash();

return operations.hasKey(key, field);

}

/**

* 存储在list的头部,即添加一个就把它放在最前面的索引处

*

* @param key

* @param value

* @param db

* @return java.lang.Long

* @author sunhj

* @date 2019年10月26日 14:03

*/

public Long listLeftPush(Serializable key, Serializable value, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

ListOperations operations = redisTemplate.opsForList();

return operations.leftPush(key, value);

}

/**

* 获取所有的KEY

*

* @param key

*/

public List getHashKeys(String key, int db) {

RedisTemplate redisTemplate = getRedisTemplateByDb(db);

List values = redisTemplate.opsForHash().values(key);

return values;

}

}

注意!!!

注意!!!

注意!!!

注意!!!

LettuceConnectionFactory 是 在springboot  2.X版本使用,

但是

springboot 版本 spring-boot-starter-data-redis 的版本对这个redis切换db非常不友好!

亲测 ,使用 springboot 2.1.3.RELEASE   springboot 2.1.4.RELEASE springboot 2.1.5.RELEASE 可以成功切换。

但是从springboot 2.1.6.RELEASE 开始 到springboot 2.2.0.RELEASE 都是有问题的。如果有人找到方法了留言告诉一声,我也学习一下!

ok,最后简单的切换使用演示:

@Slf4j

@RunWith(SpringRunner.class)

@SpringBootTestpublic classShaobingApplicationTests {

@ResourceprivateRedisUtils redisUtils;

@ResourceprivateRedisTemplate redisTemplate;

@Testpublic void testStringRedisTemplate() throwsInterruptedException {

redisUtils.setObject("1","测试1",1);

redisUtils.setObject("2","测试2",2);

redisUtils.setObject("3","测试3",3);

}

}

ac10fecad40dc3bb6e5ef79ac984dd07.png

ok,该篇教程就暂且到此结束。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_29827071/article/details/114862284

智能推荐

java url 参数 编码格式_Java在web页面上的编码解码处理及中文URL乱码解决_weixin_39963819的博客-程序员宅基地

这篇文章主要介绍了Java在web页面上的编码解码处理及中文URL乱码解决,文中所介绍的两种使用过滤器解决中文链接乱码的方法非常有效,需要的朋友可以参考下编码&amp;解码通过下图我们可以了解在javaWeb中有哪些地方有转码:用户想服务器发送一个HTTP请求,需要编码的地方有url、cookie、parameter,经过编码后服务器接受HTTP请求,解析HTTP请求,然后对url、cookie...

Java封装典型案例_大连赵哥的博客-程序员宅基地_java中封装的例子

publicclassTest {publicstaticvoidmain(String[] args) {// 封装典型题解析// (1)创建公司对象Company c= newCompany("IBM");// (2)创建员工对象Employee e1= newEmployee("张三", 20, 3000);Employee e2= newEmployee("李四", 21, 4000);Employee ...

DataTable转换为二维数组_brian0031的博客-程序员宅基地

DataTable dt = new DataTable();int col = dt.Columns.Count;string[,] array = new string[dt.Rows.Count,col];for (int i = 0; i {    f

空客子公司A³的自动驾驶全电动垂直起降飞行汽车项目Vahana成功完成首次全面试飞_sinat_41698914的博客-程序员宅基地

成为Vahana项目启动两年之际为推进城市空中交通发展所取得的一大里程碑俄勒冈州彭德尔顿--(美国商业资讯)--空客子公司A³(A³ by Airbus)的全电动自动驾驶垂直起降飞行汽车项目Vahana今天宣布,它成功地完成了第一次全面飞行测试,在达到5米(16英尺)的高度后安全降落。这次测试于太平洋时间2018年1月31日上午8:52在俄勒冈州彭德尔顿市的PendletonUAS R

东半球空间环境地基综合监测子午链——子午工程_sinat_32602421的博客-程序员宅基地

国家重大科技基础设施项目——东半球空间环境地基综合监测子午链(简称子午工程)沿东经120°子午线附近,利用北起漠河、经北京、武汉,南至海南并延伸到南极中山站,以及东起上海、经武汉、成都、西至拉萨的沿北纬30°纬度线附近现有的15个监测台站,建成一个以链为主、链网结合的,运用地磁(电)、无线电、光学和探空火箭等多种手段,连续监测地球表面20~30km以上到几百公里的中高层大气、电离层和磁层,以及十几...

python基础知识 查漏补缺_skyHdd的博客-程序员宅基地

python基础知识 查漏补缺1、函数中的参数是形参,如果调用是不写关键字,默认按顺序把参数放进去。如果写了关键字,可以调换。函数中如果有return,才能赋值 a=func_()2、python 循环变量不需要加end,因为python代码前面的空格相当于循环体3、条件分支,条件最好互斥。否则,那个条件先满足,执行那个条件,后面条件不满足if condition1:print(‘1’)...

随便推点

java定时任务quartz触发事件_Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务..._坐会儿吧的博客-程序员宅基地

读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序,尽管可能你之前对Quartz不了解以至于第一节很多术语(job、trigger等)不理解,没关系,从现在开始,笔者和你一起在实例中深入理解它们。没有code,就没有话语权——程序界真理(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217...

用命令删除autorun.inf文件夹_iteye_20785的博客-程序员宅基地

在电脑上杀过U盘病毒后经常会在盘符根目录下产色产生一个autorun.inf文件夹(其实是u盘免疫的结果),用这个方法能快速删除,有遇到的不防试一试,这样就不需要借助u盘杀毒等软件。方法如下:假设autorun.inf文件夹是在D盘,操作如下: 打开“开始”,选择“运行”,输入“CMD”,打开命令行窗口,在命令行窗口中输入一下命令:第一步:输入D: 然后回车第二步:输入rmdir /s a...

【图像分割】基于全局阈值、otsu、自适应阈值多种算法实现图像分割含Matlab源码_Matlab科研工作室的博客-程序员宅基地_matlab自适应阈值处理

1 简介重点讨论了图像分割法中的阈值研究法,包括全局阈值法和自适应阈值法.对全局阈值算法中的人工选择法,迭代式阈值选择法,最大类间方差法以及自适应算法中的分水岭算法进行了重点分析,用Matlab进行实现并给出了实验结果。阈值分割方法是一种常见的区域并行技术,原理上利用1 个或者多个阈值对像素点的灰度直方图进行区分,将其分成几个不同的类,得到的像素灰度值在同一类的属于同一个物体。由于直接利用灰度直方图可以简化计算的部分,因此,选取一个适合的阈值就显得尤为重要。想要找到合适的阈值就离不开一个准则函数[.

rocketMq立即消费与延时消费_XStorms的博客-程序员宅基地_rocketmq消费时间

pom依赖: &lt;dependency&gt; &lt;groupId&gt;org.apache.rocketmq&lt;/groupId&gt; &lt;artifactId&gt;rocketmq-client&lt;/artifactId&gt; &lt;version&gt;4.9.0&lt;/version&gt; &lt;/dependency

『2021最新』Android Studio 个人配置,提高生产率必备篇_iqqcode的博客-程序员宅基地

『2021最新』Android Studio 个人配置,提高生产率必备篇

推荐文章

热门文章

相关标签