自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 注解Restcontroller和Controller区别

显然,@RestController = @Controller + @ResponseBody@RestController 被@Controller 和@ResponseBody标注,即拥有二者的注解语义,因此在注解处理时@RestController 比@Controller多了@ResponseBody 语义,这就是@RestController 和@Controller 的区别,也是@RestController 的返回值为何都是经过转换的 json 都原因。使用场景:@Controller

2021-07-10 11:22:10 2083

原创 spring中的总结事务

1. Spring 支持两种方式的事务管理编程式事务管理声明式事务管理(推荐使用(代码侵入性最小),实际是通过 AOP 实现(基于@Transactional 的全注解方式使用最多)。)还有很多………………

2021-07-02 09:29:18 180

原创 缓存雪崩讲解

缓存在同一时间大面积的失效,后面的请求都直接落到了数据库上,造成数据库短时间内承受大量请求解决对策1.采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。2.限流,避免同时处理大量的请求。3.设置不同的失效时间比如随机设置缓存的失效时间。4.缓存永不失效。...

2021-07-02 09:14:43 185

原创 finally

public class Test { public static int f(int value) { try { return value * value; } finally { if (value == 2) { return 0; } } }}如果调用 f(2),返回值将是 0,因为 finally 语句的返回值覆盖了 tr

2021-06-29 21:11:51 125

原创 泛型一般有三种使用方式

泛型一般有三种使用方式:泛型类、泛型接口、泛型方法。1.泛型类://此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型//在实例化泛型类时,必须指定T的具体类型public class Generic<T> { private T key; public Generic(T key) { this.key = key; } public T getKey() { return key;

2021-06-29 19:39:01 1237

原创 索引几连问

1.为什么要使用索引唯一索引可以保证数据库每一行数据的唯一性大大加快查询的速度加快表的连接?将随机io变为顺序io?2.为什么不对表中的每一列创建索引索引需要占用物理空间对表中的数据进行修改时,索引也需要动态维护。3.索引如何提高查询的速度将无序的结构变为有序的数据(平衡二叉树)4.索引的注意事项在经常需要查询的列上面创建索引,可以加快查询速度在where子句中的列创建索引,加快判断的速度在经常需要排序的列上面创建索引,因为索已经排序避免在where字句中对字段施加

2021-06-29 15:05:34 82

原创 为什么索引可以提高查询的速度

基本存储结构是页每个数据页可以组成一个双向列表每个数据页中的记录又可以组成一个单向列表每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。(???)以其他列(非主键)作为搜索条件:只能从最小记录开始依次遍历单链表中的每条记录 所以说,如果我们写select * from user where indexname = 'xxx’这样没有进行任何优化的sql语句,默认会这样做:.

2021-06-29 15:05:11 1329

原创 创建订单模块的实现

我们创建了三个表:tb_order(订单信息表),tb_order_item(订单详情表),tb_order_shipping(订单配送表).tb_order:这里包含了订单的基本信息tb_order_item:订单详情表:订单的详情主要就是购买商品的信息,通过订单的id来实现关联tb_order_shipping:订单配送表:订单系统接口文档,一般我们开发的时候会收到已经写好的接口文档,比如创建订单的接口文档。我们可以看到该接口的url,接口的传入参数和返回值。接下来我们针对这三个来进

2021-06-27 16:43:56 1059 1

原创 2021-06-27

package com.taotao.order.service.impl;import java.util.Date;import java.util.List;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;impo

2021-06-27 15:27:27 58

原创 整合RabbitMQ实现消息异步发送

大概思路1.引入mq的依赖2.在配置文件中mq服务的配置,例如服务所在的主机号、端口号。3.在RabbitmqConfig配置类中创建队列、交换机、路由以及绑定、发送消息的操作组件实例“RabbitTemplate”等Bean组件(都是一个方法)4.我们需要在通用的消息发送服务类 RabbitSenderService中写一段发送消息的方法,该方法用于接收“订单编号”参数,然后在数据库中查询其对应的详细订单记录,将该记录充当“消息”并发送至RabbitMQ的队列中,等待被监听消费:5.最后,是在通

2021-06-27 14:42:15 1572 1

原创 加入购物车功能怎么实现的?

1.首先在前端那边设置一个加入购物车的按钮2.点击按钮之后会通过ajax请求后台接口3.后台接口会先判断用户是否登录4.如果没登录,则提示登陆5.如果登录了,则先查出购物车,看该商品是否已经存在购物车6.如果在则数量+1,如果不在则新增进购物车。https://juejin.im/post/5b7941f8f265da43566f859b...

2021-06-27 10:58:15 3301

原创 扣库存流程

一、同步扣库存在订单生成的时候直接扣MySQL中的库存,但是也有一系列的问题:会造成有很多订单把产品库存扣除而并没有支付,这就需要有一个后台脚本,将一段时间内没有支付的订单的库存释放,把订单取消掉二、异步扣库存库存有两部分:一个缓存redis层,一个数据库mysql层当客服新增了5个库存,那么,缓存redis和数据库mysql层都需要增加5个库存,这个使用分布式事务的最终一致性来满足要么全加,要么全不加库存。当订单生成的时候,先扣除redis库存,如果扣除成功,则生成订单进行支付,支付成功

2021-06-27 10:26:44 652

原创 支付宝支付的实现

支付宝支付的实现1.去支付宝官网申请公司企业账号,签约支付功能。从而得到开发中需要用到的几个参数,①商户appid ②商户公钥、私钥 ③支付宝公钥 ④支付宝网关地址2.将支付宝的SDK集成到项目系统里3.后台使用支付宝的SDK与支付宝进行交互4.需要对外提供3个接口即可用户点击“立即购买”时调用商户后台接口,后台返回加签后的订单信息字符串在支付完成之后,支付宝异步通知商户后台订单的付款情况在支付完成之后,跳转回APP时,APP调用商户后台进行最终付款校验。...

2021-06-27 10:02:42 601

原创 Redis内存回收算法?

LRU算法(淘汰最长时间没被使用的对象)和引用计数器算法(淘汰使用次数最少的对象)(对于创建的每一个对象都有一个与之关联的计数器,这个计数器记录着该对象被使用的次数,垃圾收集器在进行垃圾回收时,对扫描到的每一个对象判断一下计数器是否等于0,若等于0,就会释放该对象占用的内存空间)但是默认情况下,Redis随机挑选5个键,并且从中选取一个最近最久未使用的key进行淘汰...

2021-06-24 21:28:57 573

原创 try catch问题

public class Test {public static void main(String[] args) {System.out.println(test());}private static int test() {int temp = 1;try {System.out.println(temp);return ++temp;} catch (Exception e) {System.out.println(temp);return ++temp;} finally

2021-06-24 18:43:46 74

原创 Zookeeper进阶

ZooKeeper 是一个开源的分布式应用程序协调服务器,其为分布式系统提供一致性服务。其一致性是通过基于 Paxos 算法的 ZAB 协议完成的。其主要功能包括:配置维护、分布式同步、集群管理、分布式事务等。我现在有一个秒杀服务,并发量太大单机系统承受不住,那我加几台服务器也 一样 提供秒杀服务,这个时候就是 Cluster 集群 。但是,我现在换一种方式,我将一个秒杀服务 拆分成多个子服务 ,比如创建订单服务,增加积分服务,扣优惠券服务等等,然后我将这些子服务都部署在不同的服务器上 ,这个时候就是

2021-06-24 18:30:22 63 1

原创 Dubbo的架构

Container: 服务运行容器,负责加载、运行服务提供者。必须。Provider: 暴露服务的服务提供方,会向注册中心注册自己提供的服务。必须。Consumer: 调用远程服务的服务消费方,会向注册中心订阅自己所需的服务。必须。Registry: 服务注册与发现的注册中心。注册中心会返回服务提供者地址列表给消费者。非必须。Monitor: 统计服务的调用次数和调用时间的监控中心。服务消费者和提供者会定时发送统计数据到监控中心。 非必须。关于Dubbo架构的一些自测小问题服务提供者宕机后..

2021-06-24 18:19:50 123 1

原创 为什么要用dubbo?

Dubbo 帮助我们解决了什么问题呢?随着互联网的发展,网站的规模越来越大,用户数量越来越多。单一应用架构 、垂直应用架构无法满足我们的需求,这个时候分布式服务架构就诞生了。分布式服务架构下,系统被拆分成不同的服务比如短信服务、安全服务,每个服务独立提供系统的某个核心服务。但是!当服务越来越多之后,服务调用关系越来越复杂。当应用访问压力越来越大后,负载均衡以及服务监控的需求也迫在眉睫Dubbo 的出现让上述问题得到了解决。负载均衡 : 同一个服务部署在不同的机器时该调用那一台机器上的服务。服务

2021-06-24 16:37:04 385

原创 什么是 RPC?RPC原理是什么?

什么是 RPC?RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。比如两个不同的服务 A、B 部署在两台不同的机器上,那么服务 A 如果想要调用服务 B 中的某个方法该怎么办呢?使用 HTTP请求 当然可以,但是可能会比较慢而且一些优化做的并不好。 RPC 的出现就是为了解决这个问题。RPC原理是什么?客户端(服务消费端) :调用远程方法的一端。客户端 Stub(桩) : 这其实就是一代理类。代理类主要做

2021-06-24 16:10:25 515 1

原创 spring与springboot的区别

什么是Spring呢?它包含一些很好的功能,如依赖注入和开箱即用的模块,如:Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test这些模块缩短应用程序的开发时间,提高了应用开发的效率例如,在Java Web开发的早期阶段,我们需要编写大量的代码来将记录插入到数据源中。但是通过使用Spring JDBC模块的JDBCTemplate,我们可以将这操作简化为只需配置几行代码。此外,使用AOP可以大大减少

2021-06-24 10:17:00 200 1

原创 常见的注解

1.@SpringBootApplication可知SpringBoot官网,这三个注解的作用分别是:@EnableAutoConfiguration:启用 SpringBoot 的自动配置机制@ComponentScan:扫描被@Component( @Service, @Controller)注解的bean,注解默认会扫描该类是包下所有的类。@Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类2.@Component, @Repository,

2021-06-23 20:38:23 116

原创 Spriingboot面试题

1.Spring Boot 有哪几种读取配置的方式?@PropertySource @Value2.SpringBoot 实现热部署有哪几种方式?Spring LoadedSpring-boot-devtools??3.你如何理解 Spring Boot 配置加载顺序???4.Spring Boot 如何定义多套不同环境配置?5.什么是YAML?与属性文件相比,如果我们想要在配置文件中添加复杂的属性,YAML文件就更加结构化,而且更少混淆。可以看出YAM

2021-06-23 19:25:35 71

原创 SpringMVC 工作原理了解吗?

流程说明(重要):客户端(浏览器)发送请求,直接请求到 DispatcherServlet。DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。解析到对应的Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。HandlerAdapter 会根据 Handler 来调用真正的处理器来处理请求,并处理相应的业务逻辑。处理器处理完业务后,会返回一个 ModelAndVi.

2021-06-23 17:06:40 125

原创 并发的容器

JDK 提供的这些容器大部分在 java.util.concurrent 包中。ConcurrentHashMap: 线程安全的 HashMapCopyOnWriteArrayList: 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector.ConcurrentLinkedQueue: 高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。BlockingQueue: 这是一个接口,JDK 内部通过链表、数组等方式实现了这个

2021-06-23 11:45:48 63

原创 对象的初始化过程

class X{ Y y=new Y(); public X(){ System.out.print("X"); }}class Y{ public Y(){ System.out.print("Y"); }}public class Z extends X{ Y y=new Y(); public Z(){ System.out.print("Z"); } public static void main(String[] args) { new Z(); }}

2021-06-23 09:40:07 190

原创 讲一下 JMM(Java 内存模型

当前的 Java 内存模型下,线程可以把变量保存本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,就需要把变量声明为 volatile ,这就指示 JVM,这个变量是共享且不稳定的,每次使用它都到主存中进行读取。volatile 关键字 除了防止 JVM 的指令重排 ,还有一个重要的作用就是保证变量的可见性。...

2021-06-22 20:54:59 200

原创 并发编程的三个重要特性

原子性 :一个的操作或者多次操作,要么所有的操作全部都得到执行并且不会收到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。synchronize可以保证代码片段的原子性。可见性 :当一个变量对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。volatile 关键字可以保证共享变量的可见性。有序性 :代码在执行的过程中的先后顺序,Java 在编译器以及运行期间的优化,代码的执行顺序未必就是编写代码时候的顺序。volatile关键字可以禁止指令进行重排序优化。..

2021-06-22 20:54:42 81

原创 乐观锁与悲观锁

悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于写比较少的情况下(多读场景)一般多写的场景下用悲观锁就比较合适。...

2021-06-22 20:50:54 37

原创 AQS简述

AQS 核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是用 CLH 队列锁实现的,即将暂时获取不到锁的线程加入到队列中AQS 定义两种资源共享方式1.Exclusive(独占):只有一个线程能执行,如 ReentrantLock。又可分为公平锁和非公平锁2.Share(共享):多个线程可同时执行...

2021-06-22 20:45:35 114

原创 .讲讲 AtomicInteger 的使用

原子类说简单点就是具有原子/原子操作特征的类。JUC 包中的原子类是哪 4 类?基本类型、数组类型、引用类型、对象的属性修改类型讲讲 AtomicInteger 的使用AtomicInteger 类常用方法public final int get() //获取当前的值public final int getAndSet(int newValue)//获取当前的值,并设置新的值public final int getAndIncrement()//获取当前的值,并自增public final

2021-06-22 20:41:17 838

原创 为什么要用线程池?

1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2.提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。...

2021-06-22 20:02:44 3863 1

原创 run和start方法的区别

调用 start()方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。但是,直接执行 run() 方法,会把 run() 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。调用 start() 方法方可启动线程并使线程进入就绪状态,直接执行 run() 方法的话不会以多线程的方式执行...

2021-06-22 16:28:19 123

原创 读写分离&分库分表

1.读写分离主要是为了将数据库的读和写操作分不到不同的数据库节点上。主服务器负责写,从服务器负责读。读写分离可以大幅提高读性能,小幅提高写的性能。因此,读写分离更适合单机并发读请求比较多的场景。我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多的特点。**读写分离会带来什么问题?**如何解决?你写完主库之后,主库的数据同步到从库是需要时间的,这个时间差就导致了主库和从库的

2021-06-22 15:41:52 2955

原创 Rabbit

消息中间件,RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。Producer(生产者) :生产消息的一方(邮件投递者)Consumer(消费者) :消费消息的一方(邮件收件人)消息一般由 2 部分组成:消息头(或者说是标签 Label)和 消息体。息头则由一系列的可选属性组成,这些属性包括 routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。**生产者把消息交由 Rabbit

2021-06-22 14:58:54 137

原创 MySQL高性能优化建议

.如何选择索引列的顺序(不懂)区分度最高的放在联合索引的最左侧(区分度=列中不同值的数量/列的总行数)尽量把字段长度小的列放在联合索引的最左侧(因为字段长度越小,一页能存储的数据量越大,IO 性能也就越好)使用最频繁的列放到联合索引的左侧(这样可以比较少的建立一些索引)避免建立冗余索引和重复索引(增加了查询优化器生成执行计划的时间)重复索引示例:primary key(id)、index(id)、unique index(id)冗余索引示例:index(a,b,c)、index(a,b)、

2021-06-21 18:50:15 82

原创 行级锁与表级锁的区别

表级锁: 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。但触发锁冲突的概率最高,并发度最低行级锁: 粒度最小 的一种锁,只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。并发度高,但加锁的开销也最大,加锁慢,会出现死锁。...

2021-06-21 15:55:04 1424

原创 3种常用的缓存读写策略

一、旁路缓存模式写 :先更新 DB然后直接删除 cache 。读 :从 cache 中读取数据,读取到就直接返回cache中读取不到的话,就从 DB 中读取数据返回再把数据放到 cache 中。缺陷1:首次请求数据一定不在 cache 的问题缺陷2:写操作比较频繁的话导致cache中的数据会被频繁被删除,这样会影响缓存命中率 。问题一 “在写数据的过程中,可以先删除 cache ,后更新 DB 么?”不可以。会导致数据不一致。请求1 先写数据A,请求2随后读数据A的话就很

2021-06-21 15:35:42 826

原创 如何保证缓存和数据库数据的一致性?

更新 DB,然后直接删除 cache如果更新数据库成功,而删除缓存这一步失败的情况的话,可以缓存失效时间变短

2021-06-19 15:23:42 38

原创 事务的四大特性

原子性(Atomicity): 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;持久性(Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的一致性(Consistency): 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;Redis 是不支持 roll back 的,因而不满足原子性的(而且不满足持久.

2021-06-19 15:02:58 70

原创 五种数据类型的详细介绍

1.String常用命令: set,get,strlen,exists,decr,incr,setex应用场景 :一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量127.0.0.1:6379> set key value #设置 key-value 类型的值OK127.0.0.1:6379> get key # 根据 key 获得对应的 value"value"127.0.0.1:6379> exists key # 判断某个 key 是否存在(int

2021-06-19 11:21:08 1518

空空如也

空空如也

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

TA关注的人

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