自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 企业微信的审批申请状态变化回调通知api接口bug

企业微信的审批申请状态变化回调通知api接口bug

2022-03-25 09:46:24 1097 1

原创 一致性hash算法

https://zhuanlan.zhihu.com/p/470163534

2022-03-18 15:21:21 390

原创 面试官:手写一个LRU?(不能使用java的数据结构)

哈哈哈哈直接贴代码啦,代码比较简单。参考小灰漫画。package Lru;import java.util.HashMap;import java.util.Map;public class LRUCache{ class Node{ private Node pre; private Node next; private String key; private String value; public

2021-12-12 17:28:30 290 2

原创 BigDecimal的坑

记录一下今天写购物车模块遇到的小bugCart类字段 private List<CartItem> items; private Integer countNum;//商品总数 private Integer countType;//商品类型总数 private BigDecimal totalAmount;//商品总价格 private BigDecimal reduce = new BigDecimal("0.00");//商品减免其中to

2021-11-24 17:22:49 299

原创 深入浅出cookie和session

前言为什么需要session和cookie呢?源于web的发展和变迁1.web1.0时代,web强调的是资源的共享2.web2.0时代,强调的是交互交互意味着有多步操作,请求和请求之间是有依赖存在的,所以引入了cookie和session机制实现状态的记录。特征Session和cookie的特征:session和cookie都是由服务器生成的,都是用来存储特定的值(键值对应)。session是存储在服务器的,而cookie是会返回给客户端的。一般来说,SessionID会以类似于co

2021-11-20 12:10:21 930

原创 商城系统社交登录

如果网站用户量很大的情况,所以我们为网站引入社交登录模块,简化网站的登录与注册逻辑,为用户带来良好的体验。码云授权三方登录。我们要遵循OAuth2.0:OAuth是一个开放标准,通过用户授权第三方网站权限访问用户在其他站点上存储的用户信息,对于用户相关的OpenAPI(获取用户信息等…),为了保护用户的安全和隐私,第三方网站访问用户信息前,必须显示的向用户征求授权。1.gitee上创建应用2.数据管理->第三方应用3.创建应用4.创建完成后参考gitee的OAuth文档gite

2021-11-19 21:21:48 820

原创 sku详情页面回显销售属性

1.从数据库查询sku详情页面所需要的sku所有数据后2.在item页面,为每一个销售属性值所关联的skuIds3.为每一个销售属性值设置attr,通过th:attr="skus=${vals.skuIds},class=${#lists.contains(#strings.listSplit(vals.skuIds,','),item.info.skuId)?'sku_attr_value checked':'sku_attr_value'}">4.这样之后所有的销售属性值上都会带有所关联

2021-11-12 22:03:18 1003

原创 为什么快排要从基准数的另一侧开始扫描

都在代码partition注释里边了,兄弟们.package Jmm;/*** @program: 学习** @description: ** @author: Mr.Wang** @create: 2021-11-10 20:57**/public class QuickSort { public static void main(String[] args) { int[] res = new int[]{1,2,111,32,3,88}; q

2021-11-11 09:54:27 91

原创 数据库调优

文章目录前言避免索引失效1.最左前缀法则2.不在索引列上做任何操作3.存储引擎不能使用索引中范围条件后边的列4.尽量使用覆盖索引,减少select *5.mysql在使用不等于的时候无法使用索引会导致全表扫描6.like以通配符开头会导致索引失效前言有些情况下,明明我们在mysql中建了索引,但是在分析sql语句的时候,发现索引没命中,或者索引失效,简单总结了以下几种情况,尽量的避免索引失效。避免索引失效表:CREATE TABLE staffs(id INT PRIMARY KEY AUT

2021-11-08 17:28:15 558

原创 适配器模式(实例+框架源码分析)

文章目录介绍1.类适配器模式演示2.对象适配器模式3.接口适配器模式在源码中应用总结介绍适配器模式是两个不兼容接口间的桥梁,属于结构型模式。适配器模式分为三类,类适配器模式,对象适配器模式,接口适配器模式。我们生活中有很多适配器模式的例子,例如我们给手机充电,家庭电压是220V直流,手机的电压是5V交流,但是我们依然可以直接给手机充电,就是因为充电器充当了适配器的角色。1.类适配器模式演示例子:把220V直流适配成5V交流。类图:Voltage220V类package com.jc

2021-10-17 19:26:47 852 1

原创 缓存总结

分析: 百万并发下,如果所有的请求都落到db,那么db一定会承受不住,导致宕机。 所以一定要加缓存。 那么加了缓存就保证db不会因为大量并发而导致宕机嘛?缓存有什么问题? 1)缓存击穿: 大量并发请求一个不存在的数据。缓存一定不会命中,然后都落到db。 解决:加null值。如果第一个请求在db返回null,那么也把他加到缓存中,这样后边的请求就会在缓存中命中null值返回。 2)缓存穿透:

2021-10-13 12:23:44 68

原创 建造者模式

文章目录介绍实现在mybatis源码中的引用介绍定义: 将一个复杂对象的构建与它的实现分离,使得同样的构建过程可以创建不同的实现。它是将一个复杂的对象拆分成多个组件,然后一步一步构建生成。它将变与不变分离开来,不变的是产品的组成成分,变的是组成产品的各个组件(每个组成可以有多个不同的组件)。建造者模式中的角色:1.产品(Product):包含各个组件的复杂对象,由具体构建者来提供组件。2.抽象建造者(Builder):包含创建各个组件的的抽象方法的接口3.具体建造者(Concrete B

2021-10-13 09:49:14 81

原创 原型模式超详解!

前言当系统中需要大量创建相同或者相似的对象时,就可以通过“原型设计模式”来实现。原型模式是属于创建型模式。核心思想:通过拷贝指定的"原型实例"来创建跟对象一样的新对象,一句话就是:克隆指定对象。浅拷贝与深拷贝:对象内部存在的指向其他对象数组或者引用则不复制浅拷贝:拷贝一个对象时,只复制对象内部的基本数据类型,对象内部指向引用类型或者数组不复制。深拷贝:拷贝一个对象时,对象内部的无论基本类型还是引用类型还是数组都复制。//TODO 浅拷贝和深拷贝的原理图通过Cloneable把要克

2021-10-11 10:47:49 115

原创 缓存一致性问题解决方案

文章目录双写模式失效模式总结双写模式双写模式顾名思义就是两次写,写两次。数据进行更新时,第一次写是写数据库(修改数据库),第二次写是写缓存(更新缓存)。但是在大并发下还是会出现问题,如下图1号线程要写数据库,修改完后,要写缓存,可是就在中间的这段时间由于各种原因延误了,然后2号线程在这个延误时间内成功的写数据库并且写缓存,2号线程写完之后,1号线程才写缓存,这样就会导致脏数据的产生。但是这种脏数据只是暂时性的,因为等到缓存过期后,他会自动更新缓存,最终达到一致。这个时间由我们来决定,一分钟,

2021-10-09 13:14:48 188

原创 工厂模式超详解!

文章目录前言传统模式简单工厂模式工厂方法模式工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。前言假设我的朋友

2021-10-07 14:17:32 20312 11

原创 缓存使用->本地锁->分布式锁

1.为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问,而数据库承担数据罗盘工作。那么我们怎么将哪些数据放入缓存呢?或者说哪些数据比较适合放入缓存呢?①即时性,数据一致性要求不高的(通俗点说就是数据就算不马上更新,对用户几乎也是没有影响的。)②访问量大且更新频率不高的数据(读多写少的数据),例如电商的商品,访问量很大,给商品加一个缓存并加一个失效时间(根据数据更新频率来定),举个栗子:后台发布一个商品,用户在几分钟之后看到还是可以接受的。缓存使用流程请求一个数据先去看缓存中有没.

2021-10-05 13:39:51 614 3

原创 单例模式

文章目录什么是单例模式?饿汉式(静态常量)什么是单例模式?通过单例模式的方法创建的类在当前进程中只有一个实例,或者说在当前软件系统中只有一个实例,而且该类只提供一个取得对象实例的方法,一般重量级的类都会用到单例模式饿汉式(静态常量)package com.jc.singleton.type1;/*** @program: 设计模式** @description: ** @author: Mr.Wang** @create: 2021-10-01 22:53**/public c

2021-10-02 14:26:33 99

原创 通过性能压测的结果来进行优化

这是我们之前的得到的压测表1.优化首页一级菜单渲染,默认我们的生产环境themleaf的缓存时开启的,由于我们要进行优化,我们将其开启测试下。相比于之前没看没开缓存,吞吐量420->465,90%请求响应时间338->323,99%请求响应时间604->535,性能还是有提升的。2.继续优化首页一级菜单渲染,我们刚刚只优化了themleaf,我们可以关日志,还有数据库可以优化,QueryWrapper<CategoryEntity> parent_cid = new

2021-10-01 19:10:51 243

原创 磁盘调度算法

文章目录磁盘调度算法先来先服务最短寻找时间优化扫描算法Look调度算法循环扫描算法C-LOOK一次磁盘读写需要的时间,寻道时间,延迟时间,传输时间.一:寻道时间Ts:在读写数据之前,将磁头移动到指定磁道所需要的时间。分为两步:①启动磁头臂,花费时间s;②移动磁头也花费时间。假设磁头匀速移动,没跨越一个磁道花费m,总共需要跨越n条磁道,则花费时间为m*n;所以寻道时间Ts = s + m * n;二:延迟时间Tr:通过旋转磁盘,使磁头定位到目标扇区所需要的时间。设磁盘转速为r(转/秒),

2021-09-30 18:38:18 2614

原创 性能压测

1.首先我们测试Nginx,Nginx进程在运行在192.168.56.10(虚拟机ip)的80端口聚合可以看到,90%请求在4ms内返回了,99%请求在726ms内返回了,吞吐量是5,6682.在测试Gateway,Gateway进程运行在本机的88端口聚合可以看到最快0ms完成,最慢117ms完成,吞吐量15211,90%请求在10ms内返回,99%请求在22ms内完成,可以看出,可以看出网关的性能还是很不错的。3.测试简单服务,映射一个hello,请求聚合可以看到,最快0m

2021-09-29 17:44:49 285

原创 搭建域名访问环境-负载均衡到网关

整体流程是这样1.首先我们将本机的ip地址和域名进行一个映射 192.168.153.1 (虚拟机ip地址)。192.168.153.1 gulimall.com2 客户端发送gulimall.com请求时,在本地找到了对应的ip地址,就不需要DNS解析了。3客户端发送请求给虚拟机,虚拟机中有ngnix监听虚拟机的80端口,设置server_name是gulimall.com4.nginx把请求转发给网关Nginx把请求转发给网关的时候,会丢失Host等信息,所以在转发的时候一定要带上

2021-09-27 13:05:54 541 1

原创 代码优化之栈上分配

如何快速的判断是否发生了逃逸分析,就看new的对象有没有可能在方法外被引用。如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配栗子:-XX:+DoEscapeAnalysis //开启逃逸分析-XX:-DoEscapeAnalysis //不开启逃逸分析1.未开启逃逸分析package GC;/*** @program: JVM** @description: ** @author: Mr.Wang** @create: 2021-06-17 13

2021-09-25 16:06:42 130 1

原创 页面分配策略

驻留集:指请求分页存储管理中,系统给进程分配的物理块的集合。虚拟存储技术的系统中,驻留集大小一般小于进程的总大小。若驻留集太小的话,则会导致进程频繁的缺页,系统性能会有很大的影响。如驻留集太大的话,则会导致多道程序并发度下降,资源利用率降低,所以应该选择一个合适的驻留集大小。因为驻留集有两种分配方法固定分配:操作系统为每个进程分配一组固定数组的物理块,在进程运行期间不在改变,即驻留集大小不变。可变分配:操作系统先为每个进程分配一定数组的物理块,在进程运行期间可变,积驻留集大小可变。页面.

2021-09-24 20:33:22 389 2

原创 页面置换算法

在墨迹一遍!请求分页内存管理和基本分页内存管理的主要区别:在程序执行过程中,当所访问的数据内存中时,由操作系统将所需要的数据从外存调入内存。(请求分页)当内存空间不足时,由操作系统将内存中暂时用不到的信息换出到外存。(页面置换)最佳置换算法每次选择淘汰的页面都是以后不在使用或者是最长时间不再被访问的页面,这样可以保证最低的缺页率。最佳置换算法可以保证最低的缺页率,但是在程序运行过程中,操作系统才能知道要访问哪个页面。操作系统无法提前预判页面访问序列。所以最佳置换算法是无法实现的。先进先

2021-09-23 20:12:58 480 1

原创 java虚拟机的生命周期

1.java虚拟机的启动java虚拟机的启动是通过引导类加载器创建一个初始化来完成的,这个类是由虚拟机的具体实现指定的2.java虚拟机的运行1.一个java虚拟机在运行时有着很清晰的任务:执行java程序2.java程序开始执行时,java虚拟机才开始运行,当然,java程序结束时,java也就停止运行。3.执行一个java程序的时,真真正正的在执行是一个叫做java虚拟机的进程(计算机中是java.exe)。2.1执行这样一段程序 int i = 2; int j

2021-09-22 12:45:23 312 1

原创 商品上架-sku在es中存储模型分析

为什么要使用es搜索引擎?请点击es简介sku在es中存储模型分析在商品里搜索商品时,1.可以通过三级分类作为检索条件2.也可以通过sku_title来进行检索3.也可以通过spu规则来进行检索,因为所有的sku是共享spu的规格的4.也可通过销量,价格等等来作为检索条件所以我们在保存到es中的映射中应该包含skuId,sku_title,spuId,price,saleCount以及一些规格属性等等信息第一种存储方式文档的会稍微大一些,如果有100w个商品,每个文档冗余

2021-09-20 20:00:25 1183 1

原创 动态分区分配算法

文章目录前言首次适应算法邻近适应算法最佳适应算法最坏适应适应算法(最大适应算法)总结前言在动态分配分区方式中,当很多个空闲分区都能满足要求时,应该选择哪一个进行分配?首次适应算法思想:每次都从低地址开始查找,找到第一个满足进程大小的空闲分区。实现:空闲分区按照地址递增次序排列,每次分配时,按顺序查找空闲分区表或者空闲分区链,找到大小能满足要求的第一个空闲分区。分配:按照此算法找到空闲分区时,将空闲分区大小进行更改。邻近适应算法思想:由于首次适应算法每次都是从低地址部分开始开始查找

2021-09-16 20:36:12 1426 1

原创 os内存管理

文章目录1.内存管理1.1内存空间的分配与回收:1.2内存空间的扩展1.3地址转换1.4 存储保护:1.内存管理1.1内存空间的分配与回收:待------------1.2内存空间的扩展英雄联盟的大小为12G,那么按照之前的想法,再运行程序前,要将整个程序装入内存,然后我们发现4G的电脑也可以打英雄联盟,这是为什么呢?定义:把物理小的内存在逻辑上拓展成很大的内存,利用了虚拟技术,操作系统的虚拟性覆盖技术:思想:内存中分一个固定区和若干个覆盖区。1.程序划分为若干个功能上相对独立的

2021-09-16 19:57:13 413 1

原创 os-内存

文章目录前言1.内存是什么?1.1编址方式2.进程运行的基本原理2.1逻辑地址和物理地址2.2从写程序到程序运行2.3三种装入方式绝对装入静态重定位动态重定位2.4三种链接方式(链接:目标模块生成装入模块,链接后形成物理地址)静态链接装入时动态链接:运行时动态链接:前言为什么要有cpu,cpu的出现解决了什么问题?1.内存是什么?什么是内存?cpu用于存放数据的硬件。程序执行前需要先放到内存中才能被cpu处理。存储单元和内存地址存储单元内存,顾名思义,是具有存储功能的,所以他用来存

2021-09-15 18:39:33 302 1

原创 TooManyResultsException

数据库表attr_id值为20的有两行数据if (attrRespVo.getAttrType() == ProductAttrTypeEnum.ATTR_TYPE_BASE.getCode()) { //根据attrId查询attr_Gruop_id在查询groupName AttrAttrgroupRelationEntity entity = attrAttrgroupRelationDao.

2021-09-06 00:34:59 527 1

原创 操作系统-死锁

文章目录死锁的概念什么是死锁?进程死锁,饥饿,死循环的区别死锁产生的必要条件什么时候会发生死锁死锁的处理策略> 1.预防死锁:破坏4个必要条件中的一个或几个> 2.避免死锁:采用算法避免> 3.检测和解除:检测到发生了死锁,采取某种方法解除死锁。死锁的概念什么是死锁?死锁:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程举个

2021-09-05 03:59:26 417 1

原创 mybatis-plus中BaseMapper的insert方法回显id

场景:今天在做保存属性的时候遇到的问题,保存属性的同时呢,还要保存属性和属性分组关系,代码如下 public void saveAttrVo(AttrVo attrVo) { //保存属性 AttrEntity attrEntity = new AttrEntity(); BeanUtils.copyProperties(attrVo,attrEntity); this.save(attrEntity);

2021-09-03 13:58:40 7721 3

原创 信号量机制

信号量机制用户进程可以通过使用操作系统的一对原语(不可被中断的程序)来对信号量进行操作,从而很方便的实现了进程同步,进程互斥。信号量其实就是一个变量,可以用一个信号量来表示系统中某种资源的数量。在实现进程互斥的软件实现方法的时候,在双标志先检查法和双标志后检查法由于“检查”和“上锁”不能一气合成,给了进程的异步性空子可钻,所以干脆我们就让他一气合成,所以我们把“检查”和“上锁”使用原语实现。一对原语:wait(S)和signal(S),wait和signal相当于函数,信号量S就相当于函数

2021-08-30 00:53:34 667 1

原创 JSR303分组校验

JSR303分组校验属于后端校验的一种很方便的方式步骤:1.新建两个接口,用来代表哪两个组,比如,AddGroup,UpdateGroup代表添加分组和修改分组//添加分组package com.jc.common.valid;public interface AddGroup {}//修改分组package com.jc.common.valid;public interface UpdateGroup {}2.给需要验证的实体类的字段上添加对应的校验注解,并且指定

2021-08-29 23:52:41 1088 1

原创 进程互斥与进程同步

文章目录什么是进程同步?什么是进程互斥?同步互斥互斥机制准则什么是进程同步?进程的并发性带来了异步性(各个并发的进程独立的以不可预知的速度向前推进),而有的进程则需要有次序的相互配合来完成作业,所以有了进程同步。进程同步:在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系,。为了协调进程之间的相互制约关系,引入了进程同步的概念。临界资源虽然多个进程可以共享系统中的各种资源,但其中许多资源一段时间内只能为一个进程所使用,我们把一次仅允许一个进程使用的资源称为临界资源。许多物

2021-08-25 23:15:39 10142 2

原创 几种常见的调度算法

文章目录1.先来先服务算法(FCFS,First Come First Service)2.短作业优先算法(SJF,Short Job First)3.高响应比优先算法4.时间片轮转算法5.优先级调度算法6.多级反馈队列算法1.先来先服务算法(FCFS,First Come First Service)算法规则:按照作业/进程先后顺序进行服务。顾名思义,就是先来的先为你服务,类似于生活中的银行叫号排队,和排队买奶茶。算法思想:从公平的角度考虑举个栗子:10个人去买奶茶,第一个排队的人买100杯

2021-08-19 20:52:19 16696 3

原创 操作系统-线程

文章目录前言一、什么是线程?二.线程的属性三.线程的实现方式四.多线程模型总结前言为什么要引入进程?引入线程后,不仅进程之间可以并发,进程内的线程也可以并发,提高了系统的并发度,从而使得一个进程内可以并发处理各种任务(一个任务对应一个线程)。栗子:如果没有线程,qq在视频的同时就不能发消息,传文件…引入线程后,qq可以在视频的同时传文件,发消息等等一、什么是线程?定义:线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的

2021-08-13 22:32:09 202 1

原创 操作系统-进程

文章目录前言一、进程定义二、进程组成三、进程组织方式a.链接方式:b.索引方式:四、进程特征五.进程状态六.进程状态的转换总结:前言早期计算机(只支持单道程序),在程序运行期间,cpu,内存,io设备等都属于它的。程序代码放在内存中的程序段内,程序运行时处理的数据放在内存中的数据段内。引入多道程序技术之后:内存中同时放入多个程序,程序代码和程序数据存放位置不同。在程序并发执行时,系统资源需要分配给不同的程序。每一个程序被分配了哪些资源。。。需要被记录下来,方便系统管理,于是引入了进程,进

2021-08-11 19:19:46 146 1

原创 中断和异常

定义:中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

2021-08-09 19:59:39 45 1

原创 两种CPU状态:用户态和和核心态

cpu有两种状态:1.用户态:应用程序只能在用户态下运行----运行应用程序的时候为用户态(也可称目态)2.核心态:内核程序只能在核心态下运行----运行内核程序的时候为核心态(也可为称内核态)实际运行过程中,CPU状态会在用户态和内核态下切换,CPU指令集也分为特权指令和非特权指令。1.特权指令:cpu在内核态时运行的指令而处于核心态执行中的进程,能访问所有的内存空间和对象,且所占用的处理机是不允许被抢占的。2.非特权指令:cpu在用户态时运行的指令处于用户态执行时,进程所能访问的内存

2021-08-09 19:34:33 5113 1

空空如也

空空如也

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

TA关注的人

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