当前位置 : 首页 » 文章分类 :  开发  »  接下来要学习的

接下来要学习的

待深入学习整理的to do list,工作中遇到不懂的想接下来慢慢研究的,会先放到这里。


要整理的几个算法题

41 缺失的第一个正数
https://leetcode-cn.com/problems/first-missing-positive/

287 寻找重复数
https://leetcode-cn.com/problems/find-the-duplicate-number/

1371 每个元音包含偶数次的最长子字符串
https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/

210 课程表 II
https://leetcode-cn.com/problems/course-schedule-ii/

面试题 08.11. 硬币
https://leetcode-cn.com/problems/coin-lcci/


《微服务架构》知识总结

《微服务架构》知识总结
http://r12f.com/posts/reading-time-building-microservices/


Spring 事件

SpringBoot | 第三十二章:事件的发布和监听
https://blog.lqdev.cn/2018/11/06/springboot/chapter-thirty-two/


微信小程序

sendUniformMessage

下发小程序和公众号统一的服务消息
https://developers.weixin.qq.com/miniprogram/dev/api-backend/sendUniformMessage.html

getWXACodeUnlimit

获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。
https://developers.weixin.qq.com/miniprogram/dev/api-backend/getWXACodeUnlimit.html

code2Session

登录凭证校验。通过 wx.login() 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
https://developers.weixin.qq.com/miniprogram/dev/api-backend/code2Session.html

getAccessToken

获取小程序全局唯一后台接口调用凭据(access_token)。调调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存。
https://developers.weixin.qq.com/miniprogram/dev/api-backend/getAccessToken.html

获取用户基本信息(UnionID机制)

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839

获取用户基本信息(UnionID机制)
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。

请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

UnionID机制说明:
开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。


canal binlog的增量订阅/消费组件

阿里巴巴mysql数据库binlog的增量订阅、消费组件 。

canal的工作原理
1、canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
2、mysql master收到dump请求,开始推送binary log给slave(也就是canal)
3、canal解析binary log对象(原始为byte流)

alibaba/canal
https://github.com/alibaba/canal


CompletableFuture

Java CompletableFuture Tutorial with Examples
https://www.callicoder.com/java-8-completablefuture-tutorial/

Guide To CompletableFuture
https://www.baeldung.com/java-completablefuture

Java CompletableFuture 详解
https://colobu.com/2016/02/29/Java-CompletableFuture/

通过实例理解 JDK8 的 CompletableFuture
https://www.ibm.com/developerworks/cn/java/j-cf-of-jdk8/index.html

20 个使用 Java CompletableFuture的例子
http://www.importnew.com/28319.html


mybatis获取插入数据的主键selectkey用法

MyBatis获取插入数据主键
https://www.jianshu.com/p/5e7ee487dd78

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
   insert into user(userName,password,comment)
   values(#{userName},#{password},#{comment})
</insert>

Mybatis获取插入记录的自增长ID
https://my.oschina.net/wangrikui/blog/510189

@Insert("insert into Demo(name,password) values(#{name},#{password})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")

71.mybatis 如何获取插入的id【从零开始学Spring Boot】
http://412887952-qq-com.iteye.com/blog/2314219

@insert 注解返回主键

步骤有三:

  1. 写 SQL,但不要自己插入主键值
  2. 配置@Options(useGeneratedKeys=true, keyProperty=”对象.属性”) 这个的作用是设置是否使用 JDBC 的getGenereatedKeys()方法获取主键并赋值到 keyProperty 设置的对象的属性中,说白了就是把自增长的主键值赋值给对象相应的属性
  3. 在插入后,使用对象.主键属性的getXXId()方法 获取主键值

示例:

@Insert("INSERT INTO api(component, clientApi, scribeDescribe, clientApiVersion, invokeTimeout, authType, sessionRequire, openType) VALUES(#{api.component}, #{api.clientApi}, #{api.scribeDescribe}, #{api.clientApiVersion}, #{api.invokeTimeout}, #{api.authType}, #{api.sessionRequire}, #{api.openType})")
@Options(useGeneratedKeys = true, keyProperty = "api.apiId")
void add(@Param("api") Api api);

然后调用 api.getApiId()即可

mybatis 注解 insert 返回主键
http://bbs.itmayiedu.com/article/1492234758902?p=1&m=0

selectKey子元素 详解                            

作用:在insert元素和update元素中插入查询语句。

其属性如下:
keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中
resultType ,keyPropety所指向的属性类全限定类名或类型别名
order属性 ,取值范围BEFORE|AFTER,指定是在insert语句前还是后执行selectKey操作
statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE

注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。并提供给insert语句使用

MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
https://www.cnblogs.com/fsjohnhuang/p/4078659.html


Java

java保留double两位小数BigDecimal

double d = 1.000;
BigDecimal bd=new BigDecimal(d);
double d1=bd.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d1);
输入结果:1.0

若double d=0,输出结果为0.0;
若double d=1.999,输出结果为2.0;
若double d=1.89,输出结果为1.89;

总结:使用这种写法若小数点后均为零,则保留一位小数,并且有四舍五入的规则。

Java小数点位数保留
https://www.jianshu.com/p/00fff555986b

Java保留两位小数的几种写法总结
https://www.jb51.net/article/98049.htm

Unix时间戳转Java Date

Java中的Date保存的是毫秒时间戳

long batch_date = 1532697328;
Date dt = new Date (batch_date * 1000L);

SimpleDateFormat sfd = new SimpleDateFormat(“dd-MM-yyyy HH:mm:ss”);
System.out.println(sfd.format(dt));

遍历的同时修改hashmap

Java HashMap 如何正确遍历并删除元素
https://www.cnblogs.com/zhangnf/p/HashMap.html

Java 8新特性终极指南

Java 8新特性终极指南
https://wizardforcel.gitbooks.io/java8-tutorials/content/Java%208%20%E6%96%B0%E7%89%B9%E6%80%A7%E7%BB%88%E6%9E%81%E6%8C%87%E5%8D%97.html

Java 8 习惯用语,第 1 部分 Java 中的一种更轻松的函数式编程途径(IBM developerworks)
https://www.ibm.com/developerworks/cn/java/j-java8idioms1/index.html

ConcurrentSkipListMap跳表

【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentSkipListMap
http://cmsblogs.com/?p=2371

java 不同系统下的行分隔符如何获得

据我所知,windows下的文本文件换行符:\r\n
linux/unix下的文本文件换行符:\r
Mac下的文本文件换行符:\n

那么在java中得到换行符要怎么得到呢?我们可以根据该方法(System.lineSeparator())来判断,只是jdk必须在1.7以上;
String line = System.lineSeparator();

java代码获取在不同系统下的换行符
https://blog.csdn.net/ABCDabcdefghijklmn/article/details/53507315

bean Validation发生在进入方法之前

泛型

Java 泛型,你了解类型擦除吗?
https://blog.csdn.net/briblue/article/details/76736356


数据库

外键缺少索引引发的死锁

外键缺少索引引发的死锁(Oracle)
https://blog.csdn.net/hotdust/article/details/51258965

谈谈我对MySQL外键字段必须索引的一些理解
https://blog.csdn.net/sweeper_freedoman/article/details/61426736

查看mysql隔离级别

show variables like ‘%isolation%’

upsert是什么?

UPSERT是INSERT, ON CONFLICT UPDATE的简写,简而言之就是:插入数据,正常时写入,主键冲突时更新。

PostgreSQL 9.5 发布,带来 UPSERT 等新特性
http://www.phperz.com/article/16/0108/181548.html

mysql 事务死锁分析

mysql死锁-查询锁表进程-分析锁表原因
https://blog.csdn.net/lin443514407lin/article/details/56489587

【MySQL】mysql死锁以及死锁日志分析
https://segmentfault.com/a/1190000009469556

Deadlock found when trying to get lock; try restarting transaction

org.springframework.dao.DeadlockLoserDataAccessException:
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
### The error may involve com.masikkk.tractMapper.updateByPrimaryKey-Inline
### The error occurred while setting parameters
### SQL: update ordert     set order_no = ?,       short_url = ?,       contract_template_id = ?,       contract_name = ?,       contract_file_id = ?,       status = ?,       sign_online = ?,       sign_time = ?,       create_time = ?,       update_time = ?     where id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; SQL []; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:263) ~[spring-jdbc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at com.sun.proxy.$Proxy142.update(Unknown Source) ~[?:?]
    at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:295) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:59) ~[mybatis-3.4.0.jar:3.4.0]
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) ~[mybatis-3.4.0.jar:3.4.0]
    at com.sun.proxy.$Proxy196.updateByPrimaryKey(Unknown Source) ~[?:?]

log4j2

聊一聊log4j2配置文件log4j2.xml
http://www.cnblogs.com/hafiz/p/6170702.html

Log4j2配置文件详解
https://www.cnblogs.com/yudar/p/5113655.html

官方xml配置参考

Configuration Syntax - Strict XML
https://logging.apache.org/log4j/2.x/manual/configuration.html#XML

Log4j2 自动配置刷新

When configured from a File, Log4j has the ability to automatically detect changes to the configuration file and reconfigure itself. If the monitorInterval attribute is specified on the configuration element and is set to a non-zero value then the file will be checked the next time a log event is evaluated and/or logged and the monitorInterval has elapsed since the last check. The example below shows how to configure the attribute so that the configuration file will be checked for changes only after at least 30 seconds have elapsed. The minimum interval is 5 seconds.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
...
</Configuration>

Automatic Reconfiguration
https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration

不同环境设置不同日志级别

修改启动脚本,针对不同环境给变量LOG_LEVEL设置不同的值,然后通过jvm参数传入,log4j2.xml配置文件中读取此jvm参数来设置日志级别

#!/bin/bash

if [ $# != 1 ]; then
    exit 1
fi

BASE_DIR=$(cd "$(dirname "$0")/..";pwd)
cd $BASE_DIR

if [[ -f relation.pid ]]; then
    kill -9 `cat relation.pid`
    rm -f relation.pid
fi

JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
if [ "$1" == "dev" ]; then
    JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
    LOG_LEVEL="info"
elif [ "$1" == "test" ]; then
    JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
    LOG_LEVEL="info"
elif [ "$1" == "staging" ]; then
    JVM_PARAMS="-Xmn2g -Xms5g -Xmx5g"
    LOG_LEVEL="info"
elif [ "$1" == "prod" ]; then
    JVM_PARAMS="-Xmn2g -Xms5g -Xmx5g"
    LOG_LEVEL="info"
fi

[ -f $BASE_DIR/conf/swc-uds-*-log.yml ] &&   ls -l /etc/filebeat.d/ || exit 1
cp $BASE_DIR/conf/swc-uds-*-log.yml /etc/filebeat.d
filebeat.sh -configtest -e
systemctl restart filebeat

nohup java $JVM_PARAMS -jar \
        -Dspring.profiles.active=$1 \
        -Dspring.config.location=classpath:/application-base.yml,classpath:/application.yml \
        -Djava.security.auth.login.config=$BASE_DIR/conf/kafka.conf \
        -Dlog.level=$LOG_LEVEL \
        -XX:+UseConcMarkSweepGC  \
        -XX:+UseParNewGC \
        -XX:+PrintGCDetails \
        $BASE_DIR/bin/relation.jar >/dev/null 2>&1 &

echo $! > relation.pid
python $BASE_DIR/bin/health_check.py $1

然后log4j2.xml中

<configuration>
... ...

<loggers>
  <AsyncRoot level="${sys:log.level}" includeLocation="true">
    <appenderref ref="Console"/>
    <appenderref ref="RollingRandomAccessFile"/>
    <appenderref ref="RollingRandomAccessJsonFormatFile"/>
  </AsyncRoot>
</loggers>
</configuration>

Additivity

《Log4j 2 官方文档》多余性(Additivity)
http://ifeve.com/log4j-2-additivity/

运行中删除日志后无法重新生成

程序运行中将日志文件删除,发现日志文件不能重新生成,导致日志不能记录。
解决方法:
重启服务,就会新生成了
最好不要手动删除,如果是必须的话,那就再原地,新建立一个同名的文件,就行了。
建议,不要直接删除文件,你可以尝试清空文件:
echo “” > x.log

这个和Linux文件系统设计相关,可以这么理解:
log4j open(“log.file”) 之后就取得了一个 file_id这个file_id是和inode关联,你在shell中调用”rm -rf log.file”,只是将 log.file和这个inode的关系断了。但是log4j还是一直在向这个inode写数据,只是没有一个file path和这个inode关联,你再也找不回来了.

类似的问题还有:
进程1: open(“file”) -> write(“xxxx”) -> close();
进程2: open(“file”) -> write(“yyyy”) -> close();

两个进程打开相同的文件 “file”, 同时向文件写不同的内容.

你会发现那个最后close(),就是那个进程的内容.
因为本质上 两个进程在内核层打开了两个inode,各自写各自的. 直到close会重新建立
file path和inode的关系.


其他

git flow工作流

Git工作流指南:Gitflow工作流
https://www.cnblogs.com/jiuyi/p/7690615.html

GitHub ranking

中国区follow排行榜
http://githubrank.com/

GitHub 全球 Developers, Organizations and Repositories 排行榜 - diycode
https://www.diycode.cc/trends

GitHub中国开发者星榜
排名依据为开发者在某种编程语言上的所有项目(repo)所收获的星星(star)总数
对涉及多种编程语言的项目(repo),以GitHub认定的首要编程语言(primary language)为准
排名只针对个人(user)用户,不包括机构(organization)用户
http://githuber.cn/rank

SpringBoot+Mybatis+thymeleaf博客

http://13blog.site/
My Blog是由Docker+SpringBoot+Mybatis+thymeleaf等技术实现的Java博客系统,博客模板是@biezhi大神的开源项目tale,本来是一个docker和springboot的实战练习项目,目前已经开源,功能齐全、部署简单及完善的代码
https://github.com/ZHENFENG13/My-Blog

谈谈服务限流算法的几种实现

令牌桶算法
通过Google开源的guava包,我们可以很轻松的创建一个令牌桶算法的限流器。
通过RateLimiter类的create方法,创建限流器。

RateLimiter rateLimiter = RateLimiter.create(10);

谈谈服务限流算法的几种实现 - 占小狼的博客
https://mp.weixin.qq.com/s/zs6rkSmGeTzS5IgaqULFlA

线程并发级别

并发级别主要分为阻塞、无饥饿、无障碍、无锁、无等待几种。

Java并发编程中很重要的概念以及并发级别解析
https://www.jianshu.com/p/927d638d2544

并发级别
https://blog.csdn.net/Dustin_CDS/article/details/79368978

elasticsearch logstash kibana EKI技术栈

ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
https://my.oschina.net/itblog/blog/547250

ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程
https://blog.csdn.net/qq_36864672/article/details/79238627

美团监控框架CAT

深度剖析开源分布式监控CAT
https://tech.meituan.com/CAT_in_Depth_Java_Application_Monitoring.html

LAMP

LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:

Linux,操作系统
Apache,网页服务器
MariaDB或MySQL,数据库管理系统(或者数据库服务器)
PHP、Perl或Python,脚本语言

mvn install是干啥的

Bearer token

OAuth 2.0: Bearer Token Usage
https://www.cnblogs.com/XiongMaoMengNan/p/6785155.html


上一篇 Jackson

下一篇 iTerm2使用笔记

阅读
评论
3,583
阅读预计16分钟
创建日期 2018-07-15
修改日期 2020-06-30
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论