- 博客(191)
- 资源 (22)
- 收藏
- 关注
原创 A*寻路算法
A*寻路算法就是启发式探索的一个典型实践,在寻路的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中是采取估计值优先原则,估计值更优的节点会被优先遍历。如下图区域,被简化成6*6的小方格。其中绿色表示起点,红色表示终点,黑色表示路障,不能通行。先描述A*算法的大致过程:将初始节点放入到open列表中。 判断open列表。如果为空,则搜索失败。如果open列表中存在目标节点,则搜索成功。 从open列表中取出F值最小的节点作为当前节点,并将其加入到close列表中。 计
2021-07-01 14:55:02
713
原创 理解Spring boot的自动装配
Spring boot的自动装配可以从官方文档得出答案:Spring boot自动装配的特性可以由@EnableAutoConfiguration来激活。@SpringBootApplication又是包含以下三个注解:@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration。因此@SpringBootApplication也是可以进行自动装配的。(从这里可以看出@SpringBootApplication注解不是spring boot
2021-07-01 14:45:16
747
原创 线程池
基础知识:Executor.newFixedThreadPool(3);newFixedThreadPool是linkedBlockQuene就是无界阻塞队列。3就是核心线程,当线程1进来之后,判断此时线程数是否小于核心线程。如果不小于,则创建线程执行任务,否则进入到阻塞队列,等待线程执行。原代码如下: public static ExecutorService newFixedThreadPool(int nThreads) { return new...
2021-02-18 23:13:10
316
原创 AQS
基础知识:多线程同时访问一个共享数据,synchronized、cas、concurrentHashMap、lock等。多个线程过来,都尝试对同一个lock对象进行加锁ReentrantLock lock = new ReentrantLock ();Lock.lock();// 业务代码Lock.unlock();AQS的原理图:ReentrantLock 默认是非公平锁,要想变为公平锁,则需要初始化的时候传入参数true。(唤醒的时候如果这个时候线程3强制执行cas且执行
2021-02-18 23:11:57
174
原创 concurrentHashMap
基础知识:在普通的hashmap多线程访问的时候是会存在线程安全的,如果这个时候对整个map进行加锁,效率低下。如:线程1要put位置是数组5,线程2要put是数组21,实际上这个时候是不需要加锁。那么jdk中提供了concurrentHashMap默认实现了线程安全性。在jdk1.7及之前,是分段加锁数组1,数组2,数组3, 每一个数组对应一个锁// 多个线程来的时候,线程1要put的位置是数组1,线程2要put的位置是数组2Jdk1.8之后,做了一些优化和改进,锁粒度的细化一个大的数
2021-02-18 23:10:19
129
1
原创 CAS
基础知识:多个线程需要访问同一数据,synchrnized是一种的解决办法。下面再看看并发包下的其他的技术:CASInt i=0;一段代码// 会有多个线程进行执行Public synchrnized void method(){i++;}上述的代码肯定是存在线程安全问题的,在一个对象实例加synchrnized是可以解决的,这样就只有一个线程可以成功加锁,可以对他关联的monitor计数器加1。但是上述的解决办法效率低,一旦多个线程去并发进行加锁,串行化执...
2021-02-18 23:07:50
124
2
原创 Synchronized
基础知识:加锁一般来说都是必须对一个对象进行加锁的。实现的底层原理是什么?两个指令:monitorenter \ monitorexit答:每个对象都有一个monitor,如果要加锁,就必须先对对象关联的monitor进行获取,然后进行加锁。Monitor是有一个计数器,最开始等于0,现在如果有一个线程进入了,那么这个时候就设置为1,如果该线程再次进行加锁,则设置为计数器为2,以此类推。如果执行完代码片段之后,则执行指令monitorexit,将计数器设置为0,这个其他的线程就可以继续进入进
2021-02-18 23:04:24
101
原创 dubbo报错Data length too large: 10710120处理
工作中遇到以下报错信息cause: java.io.IOException: Data length too large: 10710120, max payload: 8388608, channel: NettyChannel [channel=[id: 0x09396776, /10.195.2.51:48887 => /10.195.2.21:20881]]java.io.IOException: Data length too large: 10710120, max paylo
2021-02-18 19:04:28
3236
原创 Hashmap深究
Hashmap底层首先就是基于数组实现,后面就可以围绕数组进行解释。Hash算法的优化:// jdk1.8之后的原代码Return (key==null) ?0 :(h=key.hashcode())^(h >>>16))1111 1111 1111 1111 1111 1010 0111 1100 key.hashcode0000 0000 0000 0000 1111 1111 1111 1111 h >>>16^1111 1111 1..
2021-02-17 15:57:13
113
原创 spring的autowired与resource
经过工作中的开发经验可以用一句话进行总结其区别与联系:@autowired与@resource就只是默认的装配类型不一致,@autowired默认byType注入,如果找不到byType(也就是一个接口的实现类有多个),那么就按照byName注入。@resource是默认按照byName注入,当byName找不到的时候,则按照byType注入。代码如下:@autowired示例@Componentpublic class IndexDaoImpl implements IndexDao {
2020-10-13 18:49:35
444
原创 LoadingCache
缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间。 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日常开发的很多场合,由于受限于硬盘IO的? 缓存在很多系统和架构中都用广泛的应用,例如: 1.CPU缓存 2.操作系统缓存 3.本地缓存 4.分布式缓存 5.HTTP缓存 6.数据库缓存 等等,可以说在计算机和网络领域,缓存无处不在。可以这么说,只要有硬件性能不对等...
2020-09-04 17:23:35
556
原创 如何简单有效而彻底实现跨域访问
在一次接口开发过程中,前端同事访问了我的接口:user/getUserInfo.html,前端的代码是加载在localhost:8080服务上的,访问远程这个接口的时候出现跨域问题,中间查询了很多资料,终极版本的解决方案如下:import org.springframework.web.bind.annotation.CrossOrigin;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import j
2020-09-03 18:24:20
257
原创 @PropertySource与@ImportResource的区别
@PropertySource 自定义配置文件名称,多用于配置文件与实体属性映射。引入说明在从配置文件里获取值,与JavaBean做映射。存在一个问题,我们是从主配置(application.yml)里读取的。如果全部的配置都写到application里,那么主配置就会显得特别臃肿。为了按照不同模块自定义不同的配置文件引入了@PropertySource配置person.propertiesperson.lastName=李四person.age=25person.birth=201
2020-09-01 11:56:05
319
原创 guava cache(LoadingCache)使用和源码分析
guava简介guava cache是一个本地缓存。有以下优点:很好的封装了get、put操作,能够集成数据源。 一般我们在业务中操作缓存,都会操作缓存和数据源两部分。如:put数据时,先插入DB,再删除原来的缓存;ge数据时,先查缓存,命中则返回,没有命中时,需要查询DB,再把查询结果放入缓存中。 guava cache封装了这么多步骤,只需要调用一次get/put方法即可。 线程安全的缓存,与ConcurrentMap相似,但前者增加了更多的元素失效策略,后者只能显示的移除元素。 Guav
2020-08-14 15:28:36
493
原创 modCount与exceptModCount
大家先看看如下示例:public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("111"); list.add("111"); list.add("111"); list.add("333"); list.add("333"); for
2020-08-11 12:07:03
714
原创 utf8mb4和utf8有什么区别
utf8mb4和baiutf8区别如下:MySQL在5.5.3之后增加了对这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用dao来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。下图进行更好的说明其区别:...
2020-08-10 11:43:13
488
原创 URLClassLoader浅析
背景:在启动项目得时候发现打印了关于URLClassLoader的日志,于是对该日志进行了一个demo书写,熟悉其使用场景。private static Connection conn; // 定义一个获取数据库连接方法 public static Connection getConn(String url , String user , String pass) throws Exception {
2020-07-21 14:14:27
289
原创 @Param注解
一.xml形式实例一 @Param注解单一属性dao层示例Public User selectUser(@param(“userName”) String name, @param(“userpassword”) String password);xml映射对应示例<select id=" selectUser" resultMap="BaseResultMap"> select * from user_user_t where use
2020-07-17 11:53:44
760
原创 mybatis.mapper-locations 包含jar包文件配置多个mapper路径
在一次的公司项目微服务化的时候,遇到一个问题:项目A中带有mapper.xml文件,项目B中也有其他的mapper.xml。这个时候项目A在某些场景的情况下需要把B打成JAR包引入到A,那么这个时候两个项目的包路径不一致,,mapper.xml的路径也不一样,这个时候就需要引入多个路径。项目A:mapper.xml 路径在 resources/mybatis/mapper/push 下面mybatis-plus: mapper-locations: classpath:mybatis/*.xm
2020-07-17 11:17:05
5518
原创 REST模式下不同请求方式的浅析
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是POST,GET,PUT,DELETE;而PATCH是后来新增的方法。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的POST,GET,PUT,DELETE,PATCH就对应着对这个资源的创建,查看,创建或更新,删除,部分更新等五种操作。在介绍五种方法的含义之前,先来理解幂等的含义:幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。在编程中
2020-07-14 19:51:54
203
原创 DNS多级缓存系统
DNS基础DNS,是英文Domain Name System的简称,中文称之为“域名系统”。互联网主机之间通信是通过IP地址来互相访问,IP地址是十进制数,比如10.11.10.235,但这样的数字串对人类来说很难理解和记忆。于是,人们发明了DNS系统,使用人类可读、可理解的字符串来代替一堆堆数字。其实DNS本质是”命名系统“,为什么不叫“名字”而叫“域名”呢?这是因为在因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。“域名系统”明确地指明这种系统是应用在因特网中
2020-06-01 15:37:42
1112
原创 服务发现追求CP还是AP?
服务发现生产环境中服务提供者对外提供服务,集群里面得ip随时再发生改变,那么就需要一个“通讯录”随时去获取服务节点,那么这个就是服务发现为什么需要服务发现对于服务提供者来说,契约就是接口,也就是相当于通讯录中得名字,服务节点就是提供该服务得一个实例。服务ip集合作为通讯录中得地址,可以通过获取服务ip来完成服务得发现,这就是RPC的服务发现机制。1、服务注册:再服务启动的时候,将服务提供者暴露的服务注册到注册 中心,注册中心将服务名称和IP地址保存。2、服务订阅:再服务调用方启动得时
2020-06-01 15:12:06
1466
原创 为什么JSON占用额外开销大
这个就相对于二进制文件占用内存少来说的。文本文件:是基于字符编码的文件,常见的编码有ASCII编码,UNICOD。 ASCII:是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646 二进制文件:是基于值编码的文件(在很多问题中我们还可以采用直接的值编码,也就是说用一些比较复杂的数来编码,比如说 实数) 文本文件基本上是定长编码的,基于字符,每个字符在具体编码中是固定的; ASCII码是8个比特的编码,UNIC...
2020-06-01 10:40:20
929
原创 Spring的注解使用
直接上代码,代码中有注释AspectJ.javapackage com.wemew.wmgame.spring_mybatis.config;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.P...
2020-04-17 14:27:32
257
1
原创 Spring 如何解决循环依赖?
在Spring实际的开发过程中,可能会出现一种情况:BeanA 依赖BeanB ,BeanB依赖BeanA,代码如下:@Componentpublic class A { private B b; public void setB(B b) { this.b = b; }}@Componentpublic class B { private A a; pu...
2020-04-15 18:52:46
243
原创 volatile
为了更好的说明volatile可见性的使用场景,看下面的案例:/** * <p> * cpu现在是多核的,那么各自之间会存在缓存不一致的问题。 * 以前的解决办法是:总线加锁,在第一个线程来的时候开始加锁,当这个线程执行完成后,进行 * 解锁后,第二个线程才可以进行读取值进行操作。这样的话,效率低下。 * <p> * 现在的解决办法是:MESI缓存一致性协...
2020-04-09 21:48:40
129
原创 手写HashMap
为了便于进行深刻了解HashMap的底层实现,所以手写了一个可以put和get值的简易版本的HashMap,代码如下:/** * 手写HashMap * <p> * 为什么使用红黑树,不使用平衡二叉树和链表? * 答:因为平衡二叉树查询效率虽高,但插入数据慢。链表查询速度低,插入速度快。红黑树就是基于两者之间,查询效率 * 和插入效率都适合。...
2020-04-09 20:02:34
196
原创 ThreadLocal
在线上的时候遇到一个关于ThreadLocal的问题,伪代码如下:private static final ThreadLocal<Integer> currentUser = ThreadLocal.withInitial(() -> null);@GetMapping("wrong")public Map wrong(@RequestParam("userId...
2020-04-07 16:48:22
583
原创 关于write()和fsync()
writessize_t write(int fd, const void *buf, size_t count);将数据写到文件中. 注意, 如果文件是保存在硬盘中, write() 函数调用返回之后, 并不表示数据已经写入到硬盘中, 这时如果掉电, 数据可能会丢失.fsyncint fsync(int fd);程序调用本函数, 通知内核把数据写到硬盘(file)中. 比如,...
2020-03-23 11:15:04
1969
1
原创 彻底解决mysql报错:1030, 'Got error 28 from storage engine'
这个问题确实是服务器系统盘满了,mysql指定的临时文件目录满掉,大概就是这个意思.下面解决/dev/vda1系统盘满了,其实我压根不知道/dev/vda1这在哪,是什么,后来了解这是 virtio-block 类型的设备。科普一下:以 'c' 开头的一行表示该设备是一个字符设备,以 'b' 开头的行表示这是一个块设备。/dev/vda 和 /dev/vdb 都是 virtio...
2020-03-23 10:56:56
482
原创 redis探析
Redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写的key-value存储系统。Redis过期键删除策略redisDb 结果的 expires 字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典过期字典的键是一个指针,这个指针指向键空间的某个键对象 过期字典的值是一个 long long 类型的证书,用...
2020-03-20 18:50:45
148
原创 logback的additivity="false" 与root关系
它是 子Logger 是否继承 root的Logger 的 输出源(appender) 的标志位。具体说,默认情况下子Logger会继承root的Logger的appender,也就是说子Logger会在root的Logger的appender里输出。1.若是additivity设为false,则子Logger只会在自己的appender里输出,不会在root的logger的appende...
2020-03-16 11:38:51
1430
原创 binlog_format=row不生效
binlog 有两种格式,一种是 statement,一种是row。可能你在其他资料上还会看到有第三种格式,叫作 mixed,其实它就是前两种格式的混合。查看当前的格式:show VARIABLES like '%binlog_format%'mysql> SET GLOBAL binlog_format = 'ROW';然而设置如上的方式不能生效,这是因为这个...
2020-03-05 11:34:19
2466
原创 Spring事务传播行为详解
前言Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。事务传播行为是Spring框架独有的事务增强特性,他不属于的事务实际提供方数据库行为。这是Spring为我们提供的强大的工具箱,使用事务传播行可以为我们的开发工作提供许多便利。但是人们对他的误解也颇多,你一定也听过“service方法事务最好不要嵌套”的传言。要想正确的使用工具首先需要了解工具。本文...
2020-03-04 17:38:25
1116
2
原创 如果你的 MySQL 现在出现了性能瓶颈,而且瓶颈 在 IO 上,可以通过哪些方法来提升性能呢?
1. 设置 binlog_group_commit_sync_delay 和 binlog_group_commit_sync_no_delay_count 参数,减少 binlog 的写盘次数。这个 方法是基于“额外的故意等待”来实现的,因此可能会增加语句的响应时间,但没有丢失数据的风险。 2. 将 sync_binlog 设置为大于 1 的值(比较常见是 100~1000)。这...
2020-03-04 10:59:28
779
原创 如何解决幻读?
现在你知道了,产生幻读的原因是,行锁只能锁住行,但是新插入记录这个动作,要更新的是记录之间的“间隙”。因此,为了解决幻读问题,InnoDB 只好引入新的锁,也就是间隙锁 (Gap Lock)。 顾名思义,间隙锁,锁的就是两个值之间的空隙。比如文章开头的表 t,初始化插入了 6个记录,这就产生了 7 个间隙。这样,当你执行 select * from t where d...
2020-02-26 11:36:41
2103
原创 幻读是什么?
为了便于进行解释幻读,新建一张表进行详细阐述:CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0...
2020-02-26 10:57:13
1651
1
原创 慢查询记录
慢查询分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”。注意:超过指定时间,这个时间是可以设置的,如果设置为0秒,那么所有的查询都会记录再慢查询日志中,都被视为慢查询。慢查询开启先查看系统的慢查询设置:show global variables like 'sl...
2020-02-26 10:03:35
351
原创 Hibernate 限制查询数目,解决Limit在hql不能使用问题
在hql语句中,不能使用limit来限制显示的条数。例如:FROM user_info order by createdTime desc limit 1显示的数目不是1条,而是你查询出来的条数,所以上述写法是错误的。如何解决limit在hql中不能使用,并设置查询出来集合的数目,我们应该使用setMaxResults(e)方法来解决。以下是使用Hibernate查询并限制查...
2020-02-25 18:06:04
837
原创 针对mysql delete删除表数据后占用空间不变小的问题
开发环境MySQL前言物流规则匹配日志表记录订单匹配规则相关日志信息,方便管理员维护和查阅不匹配的订单,四个月时间,该日志表数据就有174G,当前,这么大的数据量,不仅对数据库造成了很大的负载压力,同时查询等维护也缓慢,所以采取将日志记录移出到文件进行存储。但是短期内,还需要数据库中的部分日志记录,故而有了下面的删除记录、优化表操作。日志表大小一览表本身有六七百万条数据,从...
2020-02-24 17:27:32
441
weathermap-1.0.0.zip
2019-08-13
aspose-words-15.8.0.jar
2018-11-30
FSCapture截屏小助手
2018-05-12
采用Subversion进行版本控制(中文)
2018-04-08
Git魔法书籍
2018-04-08
Activiti-5-14.pdf
2018-04-08
日报的模板
2017-11-26
代码笔记代码笔记代码笔记代码笔记
2017-11-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人