一、python安装与下载依赖
依赖版本
tensorflow>=2.3.0 keras >= 2.4.3 numpy < 1.19.0 pandas >= 1.1.0 scikit-learn >= 0.23.2 librosa >=0.8.0 scipy==1.4.1
依赖下载
tensorflow>=2.3.0 pip3 install tensorflow-cpu==2.3.0 -i https://pypi.douban.com/simple/ keras >= 2.4.3 pip3 install keras==2.4.3 -i https://pypi.douban.com/simple/ pandas >= 1.1.0 pip3 install pandas==1.1.0 -i https://pypi.douban.com/simple/ scikit-learn >= 0.23.2 pip3 install scikit-learn==0.23.2 -i https://pypi.douban.com/simple/ librosa >=1.19.1 pip3 install librosa==0.8.0 -i https://pypi.douban.com/simple/ scipy==1.4.1 pip3 install scipy==1.4.1 -i https://pypi.douban.com/simple/
安装python3
yum -y install gcc yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel wget https://www.python.org/ftp/python/3.7.3/python-3.7.3.tgz tar -zxvf python-3.7.3.tgz mkdir /usr/local/python3 cd python-3.7.3 ./configure --prefix=/usr/local/python3 make && make install ln -sf /usr/local/python3/bin/python3.7 /usr/bin/python3 ln -sf /usr/local/python3/bin/pip3.7 /usr/bin/pip3
验证
pip3 list
pip3升级
pip3 --default-timeout=10000 install -u pip
pip3 卸载与安装
- pip3 install 包名 例如:pip3 install pandas
- pip3 uninstall 包名 例如: pip3 uninstall pandas
二、mybatis plus 乐观锁配置
import com.baomidou.mybatisplus.extension.plugins.optimisticlockerinterceptor;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.transaction.annotation.enabletransactionmanagement;
/**
* mybatis plus 乐观锁配置
* @author nick
*/
@enabletransactionmanagement
@configuration
public class mybatisplusconfig {
/**
* 乐观锁
*/
@bean
public optimisticlockerinterceptor optimisticlockerinterceptor() {
return new optimisticlockerinterceptor();
}
}
三、@scheduled定时任务升级分布式定时任务
/**
* disschedule切面
*/
@order(100)
@aspect
@slf4j
public class disscheduleaspect {
public static final string server_name = "servername";
private final idisscheduleservice disscheduleservice;
private final string servername;
public disscheduleaspect(
idisscheduleservice disscheduleservice,
environment environment) {
preconditions.checknotnull(disscheduleservice);
this.disscheduleservice = disscheduleservice;
preconditions.checknotnull(environment);
string servername = environment.getproperty(server_name);
preconditions.checkargument(!strings.isnullorempty(servername));
this.servername = servername;
}
/**
* 方法上有注解savelog
*/
@pointcut(value = "@annotation(com.citydo.xclouddesk.interceptor.annotation.disschedule)")
public void disscheduleannotation() {
}
@around(value = "disscheduleannotation() && @annotation(disschedule)")
public object disschedule(proceedingjoinpoint joinpoint, disschedule disschedule) throws throwable {
preconditions.checknotnull(disschedule);
// 当前时间
date curdate = timeutil.getcurdate();
// 获取name
string name = disschedule.name();
if (strings.isnullorempty(name)) {
// 方法名
signature signature = joinpoint.getsignature();
name = signature.getname();
}
// 时间间隔
int duration = disschedule.duration();
if (duration <= 0) {
log.error(
"disschedule fail, duration {} is less or equal 0, name : {}",
duration,
name
);
return null;
}
// 时间间隔的单位
timeunit unit = disschedule.unit().getunit();
// 转化为毫秒
long millis = unit.tomillis(duration);
// 获取当前任务所属的开始时间
date taskdate = timeutil.getmillisdate(curdate, (int) millis);
// 当前服务是否属于线上服务
if (!disscheduleservice.servernameisvalid(servername)) {
log.info(
"disschedule fail, servername is invalid, servername : {} , name : {} , taskdate : {}",
servername,
name,
timeutil.specialformattodatestr(taskdate)
);
return null;
}
if (!disscheduleservice.trygetlock(name, taskdate, servername)) {
log.info(
"distributed lock not acquired, name : {} , taskdate : {}",
name,
timeutil.specialformattodatestr(taskdate)
);
return null;
}
// 执行正常的方法逻辑
return joinpoint.proceed();
}
}
/**
* 在方法执行之前,决定当前是否需要执行定时调度任务
* @author nick
*/
@target(elementtype.method)
@retention(retentionpolicy.runtime)
public @interface disschedule {
/**
* 定时调度任务的名称(默认是方法名)
*/
string name() default "";
/**
* 任务的间隔时间
*/
int duration();
/**
* duration的时间单位(默认:分钟)
*/
disscheduleunit unit() default disscheduleunit.minutes;
}
/**
* 分布式定时调度服务
* @author nick
*/
public interface idisscheduleservice {
/**
* 重新加载
*/
void reload();
/**
* servername是否有效
*/
boolean servernameisvalid(string servername);
/**
* 尝试获取锁
*/
boolean trygetlock(string taskname, date taskdate, string servername);
/**
* 添加当前的servername
*/
void addservername(string servername);
/**
* 移除当前的servername
*/
void removeservername(string servername);
}
/**
* redis实现
*/
@slf4j
@service
public class disscheduleredisserviceimpl implements idisscheduleservice {
public static final string dis_schedule_server_name = "disscheduleservername";
private final iredismanager redismanager;
public disscheduleredisserviceimpl(iredismanager redismanager) {
preconditions.checknotnull(redismanager);
this.redismanager = redismanager;
}
@override
public void reload() {
// do nothing
}
@override
public boolean servernameisvalid(string servername) {
try {
return redismanager.ismember(dis_schedule_server_name, servername);
} catch (exception e) {
log.error(
"disscheduleredisserviceimpl-servernameisvalid fail, servername : {} , exception : {}",
servername,
e
);
}
return false;
}
@override
public boolean trygetlock(string taskname, date taskdate, string servername) {
try {
return redismanager.setnx(
taskname + "_" + timeutil.specialformattodatestr(taskdate),
servername
);
} catch (exception e) {
log.error(
"disscheduleredisserviceimpl-trygetlock fail, taskname : {} , taskdate : {} , servername : {} , exception : {}",
taskname,
timeutil.specialformattodatestr(taskdate),
servername,
e
);
}
return false;
}
@override
public void addservername(string servername) {
preconditions.checkargument(!strings.isnullorempty(servername));
redismanager.sadd(dis_schedule_server_name, servername);
}
@override
public void removeservername(string servername) {
preconditions.checkargument(!strings.isnullorempty(servername));
redismanager.srem(dis_schedule_server_name, servername);
}
// @disschedule(name = "testschedule", duration = 1, unit = disscheduleunit.minutes)
// @scheduled(cron = "0 0/1 * * * ?")
// public void testschedule() {
// logger.info("输出");
// }
}
public interface iredismanager {
/**
* 向set中添加元素
*/
boolean sadd(string key, string value);
/**
* set中是否存在value
*/
boolean ismember(string key, string value);
/**
* 移除set中的元素
*/
void srem(string key, string value);
/**
* 设置字符串的值(如果不存在的话)
*/
boolean setnx(string key, string value);
}
/**
* 基于jedis实现的redismanager
*/
@service
public class jedismanagerimpl implements iredismanager {
@autowired
private jedispoolclient jedispoolclient;
/**
* 返回1说明添加成功,返回0说明已经存在
* @param key
* @param value
* @return
*/
@override
public boolean sadd(string key, string value) {
preconditions.checkargument(!strings.isnullorempty(key));
preconditions.checkargument(!strings.isnullorempty(value));
return jedispoolclient.sadd(key, value) == 1l;
}
@override
public boolean ismember(string key, string value) {
preconditions.checkargument(!strings.isnullorempty(key));
preconditions.checkargument(!strings.isnullorempty(value));
return jedispoolclient.ismember(key, value);
}
@override
public void srem(string key, string value) {
preconditions.checkargument(!strings.isnullorempty(key));
preconditions.checkargument(!strings.isnullorempty(value));
jedispoolclient.srem(key, value);
}
@override
public boolean setnx(string key, string value) {
preconditions.checkargument(!strings.isnullorempty(key));
preconditions.checkargument(!strings.isnullorempty(value));
return jedispoolclient.setnx(key, value);
}
}
参考:https://github.com/death00/dis-schedule
四、multiset与hashmap、multimap关系

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论