自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (1)
  • 收藏
  • 关注

原创 总结-19 项目部署和总结

部署之前我们都是在本机上跑整个项目,接下来我们要将这个项目部署到服务器上然后再通过路径来访问,当然这里我们使用虚拟机CentOS进行代替。下图是我们项目的结构,可以看到我们是使用nginx服务器来分发请求到Tomcat的,这就是所谓的反向代理,通常情况下我们会有多个Tomcat服务器,但是我们虚拟机分配的资源很少所以只有一个Tomcat服务器,Tomcat服务器就是我们项目部署的位置,我们只要...

2020-01-17 23:18:38 469 1

原创 第十二章Java多线程程序的性能调优

Java虚拟机对内部锁的优化锁消除锁消除优化能否被实施还取决于被调用的同步方法(或者带同步块的方法)是否能够被内联。在锁消除的作用下,利用ThreadLocal将一个线程安全的对象(比如Random)作为一个线程特有对象来使用,不仅可以避免锁的争用,还可以彻底消除这些对象内部所使用的锁的开销。锁粗化锁粗化可能导致一个线程持续持有一个锁的时间变长,从而使得同步在该锁之上的其他线程在申请...

2020-01-16 14:46:27 349

原创 总结-18 单元测试和项目监控

单元测试开发过程中测试是十分重要的,在我们的开发过程中,测试是贯穿整个项目的,但是实际上我们有些测试之间是存在相互依赖关系的,这样或许会在之后的测试中产生麻烦,最好的方法就是每个测试类都是项目依赖的,我们在每个类中初始化测试数据,然后再进行测试,对比结果,测试完成之后再将数据删去。Spring Boot Test中集成了很多测试工具,常用的注解有@BeforeClass,@AfterClass...

2020-01-11 14:52:47 280

原创 第十一章多线程编程的硬件基础与Java内存模型

高速缓存内部结构示意图缓存条目的结构Data Block也被称为缓存行,它是高速缓存与主内存之间的数据交换最小单元,用于存储从主内存中读取或准备写往内存的数据。Tag则包含了与缓存行中数据相应的内存地址的部分信息(内存地址的高位部分比特)。Flag则用于表示响应缓存行的状态信息。内存地址的解码结果包括tag、index以及offset三部分,index相当于桶号,tag相当于缓存条目的相...

2020-01-09 20:03:37 207

原创 总结-17 优化服务器性能

一般来说我们优化服务器的性能会考虑从缓存入手,对于分布式服务器我们采用redis这样的分布式缓存,但是有些数据不用考虑分布式,此时我们可以引入本地缓存,这里我们用性能更好的Caffeine。如图是缓存的一个基本结构,app得到一个请求时,会从本地缓存中查看,如果没有命中,就去DB获得数据同时同步本地缓存。但是对于类似用户Token这样的不区分服务器的数据时,我们就需要使用分布式缓存。总的来说,分...

2020-01-09 17:23:21 331

原创 总结-16 将文件上传至云服务器

我们常常有将文件上传云服务器的需求,尤其是对于图片这样的静态资源,这次我们需要实现的就是将用户头像上传至云服务器和将生成的长图也上传至云服务器。对于上传有两种方式,一种是客户端上传,一种是服务器直传。客户端上传对于头像这样的初始文件在用户本地的资源,我们采用的是客户端上传。这里我们使用的是七牛云,这是它对象存储的开发者中心文档。我们首先来实现用户头像上传的功能,可以参考七牛云直传文件的文档...

2020-01-07 16:39:51 346

原创 总结-15 生成长图

在我们使用app的时候有很多情况需要分享,比如背单词每日打卡,而分享实际上就是将当前页面截图然后保存下来,这里我们就需要模拟APP来实现Web的生成长图并查看。在这里我们需要用到wkhtmltopdf,这是一个将html页面转换成image或者pdf的工具,具体命令是类似wkhtmltoimage --quality 75 https://www.baidu.com d:/work/data,其...

2020-01-04 19:12:03 725

原创 总结-14 热帖排行

我们需要实现首页对帖子进行排序的功能,具体就是计算每个帖子的分数,然后按分数降序排列。因此,我们需要解决的是两个问题,第一个是如何计算帖子分数,第二个是在何时对帖子分数进行计算。首先,计算帖子分数,我们希望发布越新的帖子的分数要更高一点,然后其变化能够平缓一点,不要出现分数骤降的情况。参考了牛客本身的公式,我们采用这样的公式socre=log(精华分数+评论数*10+点赞数*2)+(发布时间...

2020-01-03 13:04:31 672 1

原创 总结-13 Spring线程池和Quartz

对于线程池的相关内容可以查看线程管理和Java异步编程这里主要是对SpringBoot的线程池使用和Quartz使用进行简单的介绍SpringBoot线程池配置我们主要对线程池的核心线程数、最大线程数和工作队列大小进行配置# TaskExecutionProperties# 随着客户端不断提交任务,当前线程池大小也相应增加。在当前线程池大小达到核心线程池大小的时候,# 新来的任务...

2019-12-31 21:27:12 1581 1

原创 第十章Java多线程程序的调试与测试

在调试过程中使用监视点有助于跟踪线程对共享变量的访问情况。调试多线程程序过程中将断点的暂挂策略设置为暂挂虚拟机策略有助于模拟单线程的调试环境,以便于定位与多线程本身无关的功能性问题;将断点的暂挂策略设置为暂挂线程则有利于定位与多线程有关的非功能性问题。多线程程序测试的复杂性表现为多线程程序Bug具有不确定性、多线程同时受功能性问题与线程安全问题的影响、缺乏成熟的多线程程序测试工具等方面。应对多...

2019-12-31 17:39:04 287

原创 第九章Java异步编程

方法 适用条件及注意事项 原理 备注 public static ExecutorService newCachedThreadPool() 适合用于执行大量耗时较短且提交比较频繁的任务。如果提交的任务执行耗时较长,那么可能导致线程池中的工作者线程无限制地增长,最后导致过多的上下文切换,从而使得整个系统变慢 ...

2019-12-30 17:55:17 255

原创 总结-12 统计数据,redis高级数据结构

我们网站需要统计UV(独立访客)和DAU(每日活跃用户)。对于UV我们以每个ip的访问作为一次有效访问,同一个ip的多次访问算做一次,而DAU我们以每个用户id为一次有效访问。对于统计,我们使用redis作为我们的数据库,对于UV我们采用HyperLoglog作为数据类型,Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非...

2019-12-30 16:35:45 388

原创 总结-11 置顶、加精、删除

对于帖子进行置顶、加精和删除,其实就是对帖子的type和status进行修改,本质上来说就是对帖子数据的修改,但是这里涉及到权限问题,只有版主能对帖子进行置顶和加精,只有管理员能对帖子进行删除。dao在dao层我们只需增加两个两个更新方法,根据id进行修改即可int updateType(int id, int type);int updateStatus(int id,int stat...

2019-12-29 17:19:43 534

原创 第八章 线程管理

线程组是Thread.UncaughtExceptionHandler的一个实现类,它可以帮助我们检测线程的异常终止。多数情况下,我们可以忽略线程组这一概念以及线程组的存在。Thread.UncaughtExceptionHandler接口使得我们能够侦测到线程运行过程中抛出的未捕获异常,以便做出相应的补救措施,例如创建并启动相应的替代线程。一个线程在其抛出未捕获的异常而终止前,总有一个Unc...

2019-12-28 16:54:54 193

原创 第七章 线程的活性故障

死锁会导致相关线程一直被暂停使得其任务无法进展。产生死锁的必要条件包括:资源互斥、资源不可抢占、占用并等待资源以及循环等待资源。我们可以通过查看线程转储手工检测死锁,也可以利用ThreadMXBean.findDeadLockedThreads()方法进行死锁的自动检测。死锁的规避方法包括:粗锁法(使用一个粗粒度的锁代替多个锁)、锁排序法(相关线程使用全局统一的顺序申请锁)、使用Reentran...

2019-12-27 20:44:27 143

原创 总结-10 Spring Security

当引入spring security的依赖之后,spring security就会对我们项目的登录和权限进行接管,因此在接入我们系统之前,我们先使用一个demo进行实验。实体很显然,spring security的实体类应该是User类,相较于之前的User类,引入Spring Security之后,我们要让User类实现UserDetails接口,要实现五个方法,分别是账号是否过期,账号是否...

2019-12-26 17:17:33 307

原创 总结-9 Elasticsearch之帖子搜索

elasticsearch安装好elasticsearch之后,我们可以通过postman访问9200端口查看一些信息,下面给出一些基本的命令// 查看节点状态localhost:9200/_cat/indices?v// 向test索引中加入id为3的数据,在body中设置json格式数据localhost:9200/test/_doc/3// 删除test索引中id为1的数据lo...

2019-12-25 19:42:43 783

原创 第六章 保障线程安全的设计技术

ThreadLocal的内部实现机制在Tomcat环境下,Web应用自身定义的类(Custom Class)由类加载器(Class Loader)WebAppClassLoader负责加载,而Java标准库类(例如HashMap)由类加载器StandardClassLoader负责加载。每个类(类本身也是一种对象)都会持有对加载该类的类加载器的强引用,并且类加载器本身又会持有其加载过的所有类的...

2019-12-24 20:34:58 146 1

原创 第五章 线程间协作

使用Object.wait()实现等待// 在调用wait方法前获得相应对象的内部锁synchronized(someObject){ while(保护条件不成立){ someObject.wait(); // wait()的操作主要是释放内部锁,当notify()函数唤醒之后 // 占有CPU,然后开始申请内部锁 // 申请之后执行wait()剩余指令 // 由于锁可能...

2019-12-20 21:58:29 98

原创 总结-8 kafka之系统通知

在这个部分我们要将kafka分布式流媒体平台接入我们的系统,用作系统通知。配置我们在pom中加入相关配置之后只需要在application.properties中配置kafka服务的端口号、group-id和自动提交的配置。# KafkaPropertoesspring.kafka.bootstrap-servers=localhost:9092spring.kafka.consumer...

2019-12-15 20:59:50 903

原创 第四章 牛刀小试:玩转线程

挖掘出程序中的可并发点是现实多线程编程的目标——并发计算的前提。实现并发化的策略包括基于数据的分割策略和基于任务的分割策略。前者从程序处理的数据角度入手,将原始输入分解为若干规模更小的子输入,并将这些子输入指派给专门的工作者线程处理。其结果是产生若干同质的工作者线程。后者从程序的处理逻辑角度入手,将原始任务处理逻辑按照任务的资源消耗属性或者处理步骤分解为若干子任务,并创建专门的工作者线程来执行...

2019-12-14 16:02:46 76

原创 第三章 Java线程同步机制

Java线程同步机制的幕后助手是内存屏障。不同同步机制的功能强弱不同,相应的开销以及可能导致的问题也不同。锁volatileCASfinalstatic原子性保障具备具备具备不涉及不涉及可见性保障具备具备不具备不具备具备有序性保障具备具备不涉及具备具备上下文切换可能不会不会不会可能锁是Java平台中...

2019-12-12 22:33:55 107

原创 第二章 多线程编程的目的与挑战

单线程程序所进行的计算本质上是串行。多线程编程的目标是将原本串行的计算改为并发乃至并行。竞态(Race Condition)是指计算的正确性依赖于相对世界顺序(Relative Timing)或者线程的交错。竞态表现为计算的结果时而正确时而错误,它并不意味着计算的结果一定是错误的,其往往伴随着读脏数据、丢失更新的问题。竞态是访问(读取、更新)同一组共享变量的多个线程所执行的操作相互交错而导致的...

2019-12-11 21:30:37 177

原创 第一章 走近Java世界中的线程

进程是程序的运行实例,一个进程可以包含多个线程,这些线程共享其所在进程的资源。线程是进程中可独立执行的最小单位。Java标准库类java.lang.Thread就是Java平台对线程的实现。特定线程总是在执行特定的任务,线程的run方法就是线所要执行任务的处理逻辑的入口方法,该方法由Java虚拟机直接调用执行。Java标准库接口java.lang.Runnable就是对任务的抽象,Thread...

2019-12-11 20:31:01 99

原创 总结-7 优化登录模块

使用Redis存储验证码验证码需要频繁的访问与刷新,对性能要求较高。验证码不需要永久保存,通常在很短时间后就会失效,同时在分布式部署时,存在Session共享的问题。因此原先我们将验证码存在session中的方法需要进行重构。我们可以将验证码存入到redis中,但是这里有一个问题,就是要将验证码和用户对应起来,但是此时用户没有登录,没有id,因此我们可以用一个随机码临时地标记一下这个用户。因此...

2019-12-09 22:57:31 395

原创 总结-6 点赞和关注

配置Spring整合Redis我们只需要引入依赖之后配置Redis即可- spring-boot-starter-data-redis而配置Redis我们主要是配置数据库参数和编写配置类,构造RedisTemplate在application.properties中我们只要设置必须的redis库,主机和端口号# RedisProperties# 选择0-15的哪一个库spring....

2019-12-09 22:12:31 694

原创 总结-5 私信

私信我们定义的私信字段为id,from_id,to_id,conversation_id(为from_id和to_id的拼接,小的在前面),content为内容,status为状态,以及create_time。在dao层我们主要定义了查询当前用户的会话列表、会话数量、某个会话详情、某个会话消息数量以及新增数量、修改消息状态@Mapperpublic interface MessageMa...

2019-12-01 20:36:29 651

原创 总结-4 帖子

过滤敏感词过滤敏感词我们主要通过前缀树进行过滤,首先我们需要将所有敏感词全部加入到前缀树中,每一个结点我们需要定义是否是结束的标志和它之下的子节点private class TrieNode{ // 是否是敏感词结束的标识 private boolean isKeywordEnd = false; // 子节点(key是下级字符,value是下级节点) priv...

2019-12-01 19:29:08 397

原创 总结-3 登录

验证码我们使用kaptcha来生成验证码配置首先我们需要配置验证码,使用@Configuration表示这是一个配置Bean,@Bean表示获取其他的bean,装配到容器中,bean的名字就是方法名,这样在Controller中就可以注入kaptchaProducer来使用。Properties主要配置了验证码图片宽度、高度、字体大小、字体颜色和输出范围、输出长度以及实现,然后生成默认的k...

2019-11-30 21:19:15 464 1

原创 总结-2 注册功能

发送邮件配置首先需要在邮箱开启POP3/SMTP服务然后在application.properites中进行相关配置,host和端口号一般固定,QQ邮箱用户名一般为邮箱账号,但是密码不是账号密码,需要在QQ邮箱生成授权码,并把auth设置为true,后两个表示安全的smtp协议和ssl安全连接# MailPropertiesspring.mail.host=smtp.qq.comspr...

2019-11-30 16:53:42 806

原创 总结-1 首页内容

功能首页的功能主要是展现帖子,需要做到能分页展示和导航栏根据用户是否登录给出不同的显示Thymeleaf配置spring.thymeleaf.cache=false表示关闭thymeleaf的缓存,开发过程中要关闭,上线之后可以开启头部在标签中使用xmlns申明启用thymeleaf模板引擎<html lang="en" xmlns:th="http://www.thyme...

2019-11-30 15:48:27 527

python读取excel

新手编的用于python读取excel内容并在另一个excel文件中找到相关项的代码

2018-08-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除