自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 解决静态资源文件js/css缓存问题(超详细总结版)

什么是静态资源文件顾名思义,静态资源文件就是js、css、img等非服务器动态运行生成的文件,统称为静态资源文件。为什么要缓存静态资源文件静态资源文件是基本不会改变的,没必要每次都从服务器中获取。也就是说,我们每次向服务器发送请求得到的静态资源是相同的。所以我们可以把静态资源缓存再浏览器,也就是客户端,来进行性能优化。虽然绝大多数css和js文件都只有几百k,但有些时候会存在如字...

2019-11-18 21:52:11 17121 5

原创 基于Redis实现延时队列——Redisson延时队列解析

一、应用场景订单15分钟后不支付取消交易发生后5分钟给用户发送短信这里在我们项目中是来做一个延时的竞赛发布,指定几小时or几天后执行竞赛的发布流程,无需手动执行。二、实现方式Redis实现延时队列有两种实现方式:key失效监听回调zset分数存时间戳三、方案选择key失效监听存在两个问题:Redis的pubsub不会被持久化,服务器宕机就会被丢弃没有高级特性,没有ack机制,可靠性不高zset的实现是,轮询队列头部来获取超期的时间戳,实现延时效果,可靠性更高。Rediss

2021-02-20 18:25:37 3476

原创 单元测试报告与覆盖率报告——mac电脑下Jenkins集成Junit和Jacoco

一、jenkins安装brew install jenkins用brew安装比较方便一些,具体安装与启动jenkins见下面链接https://blog.csdn.net/u014050467/article/details/103319260二、git准备一个demo项目因为jenkins要连接git来部署,生产环境也是要这样做的,所以我们要把项目传到github上。这里项目内容我们不关心,重点是pom.xml文件和Test类。2.1 pom.xml和junit、jacoco有关的pom

2021-02-09 17:11:28 518

原创 字节码增强——使用javassist生成一个类的复制类并添加字段和注解

一、Javassist简介是在 Java 中编辑字节码的类库。它使 Java 程序能够在运行时定义一个新类, 并在 JVM 加载时修改类文件。二、和反射的区别反射的定义:是让程序在运行时,能够动态获取或修改对象的所有成员变量,调用对象的所有方法。可以看到反射只可以获取和修改成员变量,可以调用方法,但不能修改方法。如果想要修改方法、新增属性就要使用到字节码增强技术,即:Javassist,可以通过修改字节码的方式来实现对类结构的修改。三、背景介绍用到这个技术是因为产品提了一个需求,要做一

2021-02-07 18:15:46 2200 4

原创 python3实现获取excel中数据与发送get/post请求

从excel中读数据引入了xlrd包,读取excel中第一列内容,具体行数由代码中变量i和row控制# 读取excel中第一列内容,保存为listworkbook = xlrd.open_workbook_xls('gggg.xls')sheet = workbook.sheet_by_index(0)i = 2 # 从第几行开始row = 67 # 到第几行结束i -= 1 # 为了与excel中的行数保持一致idList = {}while i < row: v

2021-01-30 17:30:16 1187

原创 shell脚本——实现延时大于10ms打印输出

一、代码展示#!/bin/baship=$*echo $ipnum=`ping -c 3 ${ip}|grep icmp_seq|awk '{print $7}'|cut -d= -f2`for snum in $numdo if [ `echo "${snum}>10"|bc` -eq 1 ]; then echo "延时大于10ms,现在为${snum}"; fidone二、代码解析变量赋值#$* 是以一个单字符串显示所有向脚本传递的参数,把参数值赋给变量ipip

2021-01-30 14:16:24 1168

原创 事务注解@transactional和异步调用注解@Async失效了——AOP原理解析

背景介绍在使用@Async注解时,发现在本类中调用的方法异步注解失效了,实际上还是同步调用,后定位是Spring的AOP实现方式,导致注解没有生效。动态代理两种方式Spring实现动态代理有两种方式,JDK代理和CGLIB代理。使用JDK还是CGLIB1)当Bean实现接口时,Spring就会用JDK的动态代理。2)当Bean没有实现接口时,Spring使用CGlib是实现。3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-ta

2021-01-16 21:02:09 1201

原创 面试官让手写动态代理实现?——JDK代理和CGLIB代理解析

什么是动态代理动态代理是相对于静态代理产生的概念。可以简单理解为,静态代理是在代码中编写好代理类,动态代理的代理类是在运行时动态生成的。使用代理一般是为了在原类中增加一些增强功能,如Spring的AOP就是通过动态代理实现的。Spring中使用动态代理有JDK代理和CGLIB代理两种实现。JDK代理和CGLIB代理区别JDK利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CJLIB

2021-01-16 21:01:19 193

原创 java将图片转为pdf并打印文字——自定义证书的实现

一、背景介绍这周产品提了一个需求,提供一个空出一些位置的证书图片,将这张图片转为pdf,并将指定的文字(如:学生姓名)打印到证书上的指定位置,做了个demo来实现这个功能。二、需求分析实际上需求可以拆解为两个部分一是将一个url链接的图片转为pdf文件二是将文字印到图片的指定位置三、引入依赖<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf<

2021-01-14 12:24:47 748 2

原创 java如何让代码变得优雅——自定义注解

一、什么是注解java中,注解分两种,元注解和自定义注解。我们常用的一些注解,如:@Autowired、@Override等都是自定义注解。二、java的元注解可以理解为描述注解的注解,除了这几个元注解,所有注解都是自定义注解。@Document:表示是否将注解信息添加在java文档中@Target:表示注解用于什么地方。ElementType.CONSTRUCTOR: 用于描述构造器ElementType.FIELD: 成员变量、对象、属性(包括enum实例)ElementType.

2021-01-01 13:52:15 382

原创 Redis scan命令解析——替代keys命令可以在生产环境使用实现遍历

一、什么是scan命令scan 命令用于迭代数据库中的数据库键。也就是实现数据库键的遍历操作,可能大家都熟知一个keys命令,但它存在一些缺陷,在生产环境中scan是更好的选择。二、scan命令和keys命令的对比2.1 时间复杂度scan命令和keys命令的时间复杂度都是O(N),这里是一致的。2.2 是否可以部分遍历keys命令是不支持类似limit的操作的,只能一次性取出符合所有条件的keyscan命令提供了limit参数,可以控制每次返回结果的最大条数。2.3 scan与k

2020-12-20 13:24:56 684

原创 Redis源码(二)——链表

一、简介作为一种常用数据结构,Redis使用的C语言并没有内置这种数据结构,所以Redis构建了自己的链表实现。链表在Redis中的应用非常广泛,比如列表键的底层实现之一就是链表。当一个列表键包含了数量比较多的元素,又或者列表中包含的元素都是比较长的字符串时,Redis就会使用链表作为列表键的底层实现。二、实现单个链表节点:typedef struct listNode { struct listNode *prev;//前置节点 struct listNode *next

2020-12-01 15:13:39 95

原创 Redis源码(一)——字符串sds

一、简介Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。在redis中只有无需对字符串进行修改的地方会使用C字符串,如打印日志。其他如键值对,键和值都是SDS。eg:redis> SET msg "hello world"OK键值对的键"msg"和值"hello world"底层实现都是SDS。二、定义1)3.2

2020-11-27 14:34:28 213

原创 如何利用Mybatis的分页实体类PageInfo来拼装实体类返回值

一、背景介绍同事工作中遇到一个问题,需要修改一个旧接口,在代码层做筛选然后分页。之前代码用的是PageHelper分页插件,不过这个插件只能支持一条sql查询,返回数据格式如下图所示:{ "data":{ "endRow":6, "hasNextPage":false, "hasPreviousPage":false, "isFirstPage":true, "isLastPage":true, "navigateFirstPage":1, "navigateLastPag

2020-11-08 16:02:20 1691

原创 JetCache源码(四)——一些有趣特性的实现

一、自动刷新实现这里贴出的代码是添加刷新任务的方法,首先维护了一个任务队列,以taskId作为key,RefreshTask作为value。private ConcurrentHashMap<Object, RefreshTask> taskMap = new ConcurrentHashMap<>();protected void addOrUpdateRefreshTask(K key, CacheLoader<K,V> loader) { R

2020-09-23 12:27:28 742

原创 JetCache源码(三)——本地缓存实现

一、类结构二、AbstractEmbeddedCache定义了InnerMap和创建InnerMap的抽象方法,由LinkedHashMapCache和CaffeineCache两个子类来实现。 protected InnerMap innerMap; protected abstract InnerMap createAreaCache();在这个类中实现了一些公共方法,避免子类重复实现,公共方法会调用如innerMap.getValue(newKey),使用每个子类的独

2020-09-23 12:26:38 1191

原创 JetCache源码(二)——Cache类库实现

一、Cache类库基本结构二、Cache类似于集合中的List,定义了一些缓存的基本方法,如get、put。提供了方法的默认实现,使用了模板方法模式,小写方法有默认实现,大写方法由子类来实现。小写的方法返回的是数据,不过当方法返回为null时,无法断定是key不存在,已过期,还是访问缓存时出现了异常,大写GET方法提供了完整的信息。模板方法设计模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 defa

2020-09-23 12:25:19 631

原创 JetCache源码(一)——简介与注解实现

一.为何不用Map作为本地缓存库内存管理没有对使用的内存做限制,需要手动编写代码来控制内存,没有自动的内存管理机制。缓存过期策略没有缓存过期策略,如:LRU,LFU,FIFO容量规划没有容量限制Map是否是线程安全的可能会出现并发控制问题持久化服务器重启,Map中数据消失多实例数据同步及一致性Map是在服务器的一个实例中的,部署多个实例时,Map中数据会产生不一致的情况二.本地缓存相较于第三方缓存有什么优势不经过网络传输,响应速度快其中本地缓存无法进行持久化,以及保证多

2020-09-23 12:19:38 1850

原创 基于Redis的Hyperloglog实现日活量和总活跃量统计

一、背景介绍产品提出想要统计目前系统中某个页面日活量与总活跃用户数量,由于这个页面登录与未登录用户均可访问,因此不能通过用户id来统计,要通过ip地址来做统计和去重处理。二、技术选型首先想到的方案是使用redis的set数据结构,因为它是一个无序集合,我们得到ip地址,然后存入set中即可实现统计与去重的效果,但是set有一个很大的问题是,每一条数据占用的空间会比较大,如果数据量很大的话可能会导致内存问题。因此想到用一些比较节约空间的数据结构,想到了之前了解过的bitmap,空间占用比较低,不过b

2020-09-23 12:17:27 1812

原创 缓存(一)——浏览器缓存

一.概述浏览器缓存即http缓存,将数据缓存在浏览器(即客户端)。二.工作流程http缓存都是从第二次请求开始的。第一次请求资源,服务器返回对应资源,并在response header响应头中添加缓存策略。第二次请求时,浏览器判断请求参数,命中强缓存就直接200,从本地缓存中拿数据。否则把响应参数存在request header请求头中,看是否命中协商缓存,命中则返回304,否则服务器会返回全新资源。强缓存与协商缓存强缓存:无需与服务端发生交互协商缓存:需要与服务端发生交互,判断是否使

2020-08-16 01:31:58 276 2

原创 使用postman发送post请求,却报错不支持get请求的原因

场景复现可以看到我们postman确实是post请求,message却报错不支持get请求,说明服务器实际上收到的是一个get请求。产生原因如果我们访问的是线上的接口,线上的nginx一般都会对http访问做一个302重定向,跳转为https访问。如果我们正常访问一个页面,它会把http跳转为https,之后由https访问的接口就都是https得了。但如果我们用postman直接访问接口,nginx会把我们访问的http请求跳转为https请求,做了302跳转之后的请求就会由post变为get请

2020-08-02 01:07:48 10555 4

原创 springSecurity+oauth2实现权限认证系统(资源服务器与授权服务器分离,client信息入库,token存入redis持久化)

文章目录前言oAuth2授权码模式认证流程权限认证系统的三个角色客户端资源服务器认证服务器完整流程演示项目地址前言本文章侧重实战,是为线上系统做的一个demo。适合对oauth2有一定理解后再阅读。如果对oauth2理解还不够深入,建议先阅读芋道 Spring Security Oauth2入门来夯实一下基础。这个demo主要实现了资源服务器与授权服务器分离,client信息入库,token信息在redis中持久化,demo的github地址会在文末贴出。oAuth2授权码模式认证流程权限认证系

2020-05-29 23:26:59 9211 7

原创 两个SpringSecurity本地项目登录冲突问题(Cookie不区分端口号)

问题产生因为最近要做资源认证服务器,就搞了两个集成SpringSecurity的项目,在开启了loginPage("/portal/login")后,登录的时候发现了一个问题:8085端口的项目A和8080端口的项目B不可以同时登录,A登录了,B再登录就会把A的登录状态刷新掉。问题原因经过一番研究,原因是session会在浏览器保存一个cookie用来识别session,看上去没什么问题,但是cookie是不区分端口号的,在同一个ip下cookie是共享的。也就是说,我们本地项目都是localhos

2020-05-29 00:47:20 988 1

原创 springboot整合redis、mybatis、@EnableScheduling定时任务,实现日访问量与日活量的统计与记录

目录一、实现目标二、windows版本redis下载与安装三、springboot集成redis四、springboot集成mybatis集成通用mapper五、实现日访问量@EnableScheduling定时任务六、实现日活量获取IP地址七、项目github地址一、实现目标统计网站的日访问量与日活量,日访问量是每天页面被访问的次数,日活量也是被访问的次数,但重复的ip不作记录。二、windows版本redis下载与安装windows版本的redis安装配置很简单,这里给一个安装过程的参考链接。

2020-05-17 14:46:59 2590 3

原创 解决win10家庭版无法远程连接桌面问题

如上图所示,计算机位置输入要远程连接的ip地址,用户名这里我的用户名是sscp,在前面拼接上 WORKGROUP\ 即可。如图中红框所示。这个WORKGROUP是什么呢,这个是被我们远程的计算机的工作组名称,如下图所示,是可以进行修改的,默认为WORKGROUP。之后输入密码,就可以愉快的远程连接了!...

2020-04-30 14:54:17 1430

原创 Leetcode力扣第199题——二叉树的右视图

题目描述给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---BFS(广度优先搜索)...

2020-04-22 20:10:31 556

原创 Java----layui动态表单中表头与数据----JSON串前端发送与后端接收解析

这里写目录标题什么是JSONlayui动态表单----数据layui动态表单----表头什么是JSONJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。JSON采用完全独立于程序语言的文本格式,但是也使用了类C语言的习惯(包括C, C++, C#, Java, JavaScript,...

2020-04-22 00:25:51 2733

原创 解决自定义类使用@Autowired注解注入失败的问题

问题描述在工作中想要实现在工具类中通过@Autowired注入持久层的Mapper类,然而代码运行后发现报了空指针异常,即@Autowired注解注入失败了。要怎样实现在我们自定义的工具类中完成依赖注入呢,先看一下可以完成注入的代码:@Componentpublic class TestUtil{ @Autowired private TestMapper testMapper; ...

2020-03-10 21:27:18 4693 2

原创 mysql中varchar类型存入数字时排序问题

现在有一张学生成绩表idnamescore1小红802小蓝503马里奥1004路易150这张表中,由于某些不可抗力的影响,name和score都是用的varchar类型。这时有一个需求,需要把所有的学生按照成绩由高到低排序。正常的想法应该是这样来写:错误的写法select * from student order by scor...

2020-03-02 14:20:31 1729

原创 nginx配置防盗链

什么是盗链是在自己的界面展示不在自己服务器上的内容,通过技术手段获得他人服务器的资源地址,在自己页面向用户提供此内容,从而减轻自己服务器的负担,因为真实的空间和流量来自别人的服务器。防盗链设计思路区别哪些请求时非正常用户请求具体配置贴上配置文件吧user nginx;worker_processes 1;error_log /var/log/nginx/error.log ...

2020-01-10 01:20:45 144

原创 nginx配置gzip压缩

为什么要使用gzip压缩服务端给客户端响应时若启用压缩功能,可以减少传输时所需的带宽,大大提高响应速度。如上图所示,nginx在把响应报文发送到客户端之前,可以对静态资源文件进行压缩,这样传输文件的大小变得很小,传输速度会大幅度提高,之后浏览器再进行解压,得到所请求的静态资源。具体配置先直接上配置文件吧,具体配置如下所示:user nginx;worker_processes 1...

2020-01-10 00:45:47 146

原创 nginx配置下载站点

相关配置参数autoindex on; #开启整个目录浏览下载autoindex_localtime on; #显示的时间为文件服务器的时间autoindex_exact_size off; #显示文件的粗略大小,即1024B会自动转换为1KB,可读性更强具体配置location /down { alias D:\linux; #展示的目录 if ($r...

2020-01-07 12:45:47 542

原创 tomcat部署war包时,访问路径如何取消包名前缀

方法一<Host name="localhost" appBase="" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="C:\JavaInfo\sorl\apache-tomcat-8.0.27\webapps\xxx.war" debug="0"> </Host>这...

2019-12-17 12:29:37 5104

原创 nginx最简单的反向代理配置+动静分离方法

前言众所周知,nginx有三大特性,反向代理,负载均衡和动静分离。正向代理是代理客户端,反向代理就是代理服务器。客户端只需要将请求发给nginx服务器所监听的端口就可以了。负载均衡是将负载分摊到多个单位上进行。动静分离是静态资源文件在nginx上处理,动态内容在具体服务上处理。这里不细说概念,重点在实战配置,接下来就做一个最基本的反向代理配置。反向代理server { ...

2019-12-16 22:11:07 265

原创 MYSQL使用GROUP BY获取每组创建时间最大的一条数据

场景感觉一句话说不清,还是结合场景来说吧,如果已经对问题有了解的小伙伴直接看最后结论就可以了。上图是我们要做处理的数据,我们要做的是拿到每天最后一次更新的数据,也就是需要得到每天中create_date时间最大的数据。首先想到的肯定是通过group by分组,得到每天的数据。SQL语句如下:SELECT create_date,price FROM material_price_histo...

2019-12-09 21:18:39 6173 2

原创 解决mysql不等于使用时会无视空值的问题

info表idname1kevin2null3kate如上表所示,我们现在使用sql语句进行查询,查询name不为kevin的id与nameSELECT * FROM info WHERE name!='kevin'查询后会得到如下结果idname3kate我们发现name为null的值并没有在结果中出现解决这个问...

2019-09-25 17:40:10 908

空空如也

空空如也

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

TA关注的人

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