自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ高级特性

RabbitMQ高级特性1、消息的可靠性传递生产者在使用rabbitmq的时候,消息的发送方会杜绝消息的丢失或者投递失败的场景,所以rabbitmq为我们提供了两种解决方式:1、confirm2、returnrabbitmq整个消息投递的路径为:producer—>rabbitmq broker—>exchange—>queue—>consumer当消息从producer—>exchange 会返回一个confirmReturn;消息从producer—&g

2022-03-29 17:48:43 2505

原创 redis底层数据结构及其应用

redis底层数据结构我们都知道redis有5种数据结构:String、list、hash、set、zset但是作为一名优秀的程序员,不仅仅知道这5种数据结构,还要知道这5种数据结构底层的实现原理String127.0.0.1:6379> set key 111OK127.0.0.1:6379> object encoding key"int"当对一个key设置值为整形的时候,通过查看底层编码,其是一个int类型127.0.0.1:6379> set key ewrw1

2022-03-22 15:10:59 1131

原创 redis缓存设计与性能优化

缓存设计一、缓存穿透查询一个一定不存在的数据就是缓存穿透。造成条件:1、自己的业务代码或者设计出现问题2、一些个黑客网站进行攻击,用一些压测软件进行高并发的访问解决:1、对该key缓存控对象(切记:设置一个过期时间)2、布隆过滤器布隆过滤器是在redis上设置了一层过滤器,这个过滤器通过一定的算法(例如:CRC12,CRC16算法),根据redis的key进行一个除余操作,得到一个数值,然后将相应数值上的位变为1,一个key会根据不同的算法进行多次计算,下次进行访问的时候,先根据key进行

2022-03-21 11:58:04 1352

原创 商城下单逻辑

1、为了保证接口防刷,防止多次点击下单造成数据的冗余,需要保证下单接口的幂等性,本文通过防重令牌的方式,防止订单多次被点击。将服务器(redis)中放一分令牌,页面存一份令牌,在保存订单数据之前需要验证页面带过来的令牌,如果令牌相同则进行创建订单,同时删除令牌(保证获取令牌、令牌比较和令牌的删除是一个原子操作,防止点击过快,两个请求同时获取令牌,同时比较,同时删令牌,这样订单数据就会出现冗余)使用lua脚本2、令牌验证成功后需要创建订单-验证价格,价格验证成功后需要保存订单,同时锁定库存,由于锁定库存服务

2021-09-14 13:32:52 940

原创 商城购物车逻辑

商城购物车逻辑一、添加商品到购物车1、首先需要判断当前购物车服务用户是否进行登录,如果是登录状态,则会判断当前商品在用户购物车中是否存在,如果存在,则只累加次数,否则添加。2、如果用户没有进行登录,则会添加进临时购物车中(在文章最下边会讲解临时用户),逻辑同上:判断该商品是否在临时购物车中,如果有就会累加次数,否则添加。二、获取用户购物车所有商品1、判断用户是否登录,没有登录则直接返回临时购物车中的所有商品数据。2、用户进行登录,则先将临时用户购物车中的商品和用户购物车中的商品进行合并,合并完成

2021-09-10 11:10:28 1950

原创 用户注册、验证码防刷、用户登录、spring session解决session共享(逻辑)

一、用户注册1、用户注册首先需要接收相应的参数,传到后台,可以通过JSR303进行参数的验证。2、验证完后,获取注册验证码,根据下边的验证码防刷逻辑判断验证码是否和用户输入的相等。3、如果验证码相等,则先将redis中的验证码进行删除,调用注册服务进行用户信息注册。4、注册前需要判断当前填写的手机号和用户名是否存在,如果存在,则不进行注册。5、以上步骤通过后,开始准备需要保存的数据,用户的登录密码使用盐值加密(防止使用MD5加密被暴力破解),最后将数据保存进数据库中。二、验证码防刷1、首先需要

2021-09-09 15:25:55 431

原创 Rabbitmq主从集群和镜像集群搭建

主从架构集群搭建一、安装rabbitmq百度网盘链接:https://pan.baidu.com/s/1CfjjCL–G4TX9zzs-hzxNg提取码:sq5z这里有三个安装包1、mq是使用erlang语言开发的,所以首先安装erlang-22.0.7-1.el7.x86_64包rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm2、安装socat-1.7.3.2-2.el7.x86_64rpm -ivh socat-1.7.3.2-2.el7.x86_64.

2021-08-26 11:02:56 1703

原创 IDEA个人所用基本设置

IDEA个人所用基本设置一、字体设置1、进入IDEA,点击“File"->“Settings”2、点击"Editor"->“font” 或者搜索“font"修改字体类型和大小二、背景颜色设置(护眼绿)点击File->settings->Editor->Color Scheme 可以设置软件默认的颜色,旁边的小齿轮可以自定义颜色第一种方法:IDEA设置一张背景图片,路径:File->Settings->Appearance&Beha

2021-05-24 17:48:39 818 5

原创 虚拟机安装docker,同时安装mysql镜像和redis镜像

一、docker安装进入docker官网在浏览器中输入docker进入后我们找到centos安装docker的文档1、首先,我们需要卸载旧的docker版本$ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \

2020-12-22 14:08:12 667 1

原创 使用vagrant快速初始化虚拟机

一、相关资源下载1、首先下载并安装好VirtualBox虚拟机要使用vagrant必须先安装好VirtualBox,vagrant是基于VirtualBox的官网:VirtualBox 6.0.10版本2、下载并安装vagrant官网:vagrant这个下载需要有耐心。。。。二、初始化虚拟机接着进入cmd窗口,输入vagrant,如果有以下提示说明vagrant安装成功然后我们输入想要初始化的虚拟机系统,例如 centos7在窗口中输入 vagrant init centos/7然后

2020-12-21 09:29:40 723

原创 springboot项目统一日志处理

一、配置日志级别日志记录器(Logger)的行为是分等级的。如下表所示:分为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别# 设置日志级别logging.level.root=WARN这种方式只能将日志打印在控制台上二、Logback日志spring boot内部使用Logback作为日志实现的框架。Logback和log4j非常相似,如果你对log4j很熟悉,那

2020-11-30 11:19:36 271

原创 sprintboot项目统一异常处理

一、什么是统一异常处理我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理统一异常处理需要两个注解进行搭配@ControllerAdvice@ExceptionHandler@ControllerAdvice有三大作用:全局异常处理全局数据绑定全局数据预处理@ExceptionHandler注解可以用来统一处理方法抛出的二、全局异常处理首先需要在类上加上注解@ControllerAdvice然后编写全局异常处理的方法例如:/**

2020-11-29 15:43:00 99

原创 springBoot项目中分页插件配置

在全局配置类中添加插件/** * 分页插件 */ @Bean public PaginationInterceptor paginationInterceptor() { return new PaginationInterceptor(); }分页controller方法@ApiOperation(value = "分页讲师列表")@GetMapping("{page}/{limit}")public R pageList( @ApiParam(name = "p

2020-11-29 10:51:15 383

原创 springboot项目中统一返回数据格式

项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致、轻松。一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含状态码、返回消息、数据这几部分内容例如,我们的系统要求返回的基本数据格式如下:列表{ "success": true, "code": 20000, "message": "成功", "data": { "items":

2020-11-29 10:41:33 881

原创 swagger2 Api文档配置

一、Swagger2介绍前后端分离开发模式中,api文档是最好的沟通方式。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。及时性 (接口变更后,能够及时准确地通知相关前后端开发人员)规范性 (并且保证接口的规范性,如接口的地址,请求方式,参数及响应格式和错误信息)一致性(接口信息一致,不会出现因开发人员拿到的文档版本不一致,而出现分歧)可测性 (直接在接口文档上进行测试,以方便理解业务)二、配置第一步:引入依赖<!--s

2020-11-29 10:19:33 1643 2

原创 统一返回json的时间格式

当我们在操作时间格式类型的数据时,有时会发现后端返回的时间数据是正常的时间格式,但是前端返回的格式是T类型的如下图:这时候我们是需要在配置文件中加上注解:#返回json的全局时间格式spring.jackson.date-format=yyyy-MM-dd HH:mm:ssspring.jackson.time-zone=GMT+8然后会在前端显示正常的时间格式:...

2020-11-29 09:52:59 579

原创 mybatis plus性能分析插件

性能分析插件能够很好的分析每条sql语句执行的时间,以至于我们可以去进行sql优化我们只需要在配置类中添加/** * SQL 执行性能分析插件 * 开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 * dev:开发环境 * test:测试环境 * prod:生产环境 */@Bean@Profile({"dev","test"})// 设置 dev test 环境开启public PerformanceInterceptor performanceIntercep

2020-08-12 19:32:33 2453 2

原创 mybatis plus实现逻辑删除

数据库中的数据删除会分为两种:物理删除 和 逻辑删除物理删除物理删除就是我们删除数据库中的一条数据时,数据会真的被删除逻辑删除逻辑删除指的是我们删除一条数据时,数据不会在数据库中消息,逻辑删除是我们现在开发中经常使用到的一种删除(1)首先我们需要在实体类和数据表中添加一个逻辑删除字段deleted,默认为0数据库(这里以user表为例)实体类我们可以在application.properties文件中进行deleted字段值修改,比如说,10代表没删除,11代表已经逻辑删除mybat

2020-08-12 19:17:54 2715 4

原创 mybatis plus实现乐观锁

乐观锁主要用于解决数据更新丢失的问题比如:多个人同时修改一条数据时,最后一个提交的会把之前提交的全部覆盖(典型的就是12306抢票问题)悲观锁:简单来说就是串行操作,一个人在进行数据修改时,其他人不能对数据进行操作乐观锁:通过版本号version来控制数据的操作,当多人同时对一条数据进行操作时,会通过对版本号进行比较,当当前版本号与你的版本号相同,则操作数据成功,操作成功之后,版本号version加1,不同时操作失败操作乐观锁(1)首先我们需要在数据库中和bean实体类中添加version字段

2020-08-12 16:56:02 3094

原创 mybatis_plus实现数据自动填充

1)首先我们在实体类中加两个字段createTime和updateTime @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime;相应的数据库中也得加上这两个字段@TableField(fill = FieldFill.INSERT)表示插入数据时,该字段实现自动填

2020-08-12 15:28:47 840

原创 lombok插件使用

lombok主要用来简化实体类:我们只需要一个注解就可以轻松解决Get Set、构造方法等1)首先我们需要引入lombok依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>2)引入之后我们需要下载lombok插件(1)

2020-08-12 15:10:19 203

原创 springboot配置redis序列化规则,防止乱码

直接上问题:当我们使用redis缓存时,发现保存在redis中的数据被默认的序列化规则所导成类似成下图:所以我们需要自己写一个redis配置类,修改默认的序列化规则创建一个MyRedisConfig配置类@Configurationpublic class MyRedisConfig { @Bean public RedisCacheManager redisCacheManager(RedisConnectionFactory connectionFactory) {

2020-08-04 16:49:02 229

原创 Mysql中获取刚插入时自增长的id的值(@Options)

有时候我们会碰到比较头疼的问题,就是我们怎么获取刚插入的数据的自增长id的值本文基于mybatis框架中的注解Options进行讲解问题:我们向数据库中插入一条数据时,想要不能够直接的获取它的id,解决:在mybatis框架中,有一个注解Options设置@Options属性userGeneratedKeys的值为true,并指定实例对象中主键的属性名keyProperty(一般主键名都为id)。 @Options(useGeneratedKeys = true,keyProperty =

2020-08-03 10:33:58 549

原创 1251 - Client does not support authentication protocol 解决办法

在docker中安装完mysql,能够连接本地localhost的,但是用Navicat连接远程ip时报错1251 - Client does not support authentication protocol (1251-客户端不支持服务器请求的认证协议),出现这个问题简单地说是因为安装mysql的版本太高了,导致mysql服务器要求的认证协议与客户端不一致,安装时我用的命令是:docker pull mysql使用这个命令下载的是最新版的mysql所以我们需要将之前下载的mysql镜像删除,

2020-08-02 19:59:19 1152

原创 docker学习及常用命令

一、何为docker?Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中, 然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低总之核心是:Docker支持将软件编译成一个镜像;然后 在镜像中各种软件做好配置,将镜像发布 出去,其他使用者可以直接使用这个镜像。 运行中的这个镜像称为容器,容器启动是

2020-08-02 19:49:52 108

原创 关于IO、BIO、NIO的理解

IO、BIO、NIO理解简介BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO:同步非阻塞式IO,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。AIO(NIO.2):异步非阻塞式IO,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服

2020-07-21 15:10:11 1175

原创 Nginx代理服务器

Nginx 相关介绍(Nginx是什么?能干嘛?)Nginx的产生没有听过Nginx?那么一定听过它的"同行"Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(Uniform Resources Identifier)URI或者统一资源定位符(Uniform Resources Locator)URL作为沟通依据,通过HTTP协议提供各种网络服务。然而,这些服务器在设计之初受到当时环境的局限,例如当时的用户规模,网络带宽,产品特点等局限并且各自的

2020-07-20 20:41:11 93

原创 数据结构之排序算法三(Java版)

数据结构之排序算法一(Java版)数据结构之排序算法二(Java版)归并排序归并排序介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序思想示意图1-基本思想:说明:可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。

2020-07-20 20:23:47 76

原创 数据结构之排序算法二(Java版)

数据结构之排序算法一(Java版)接下来接着说排序算法希尔排序简单插入排序存在的问题我们看简单的插入排序可能存在的问题.数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响.希尔排序法介绍希尔排序是希尔(Donald S

2020-07-20 20:15:25 72

原创 数据结构之排序算法一(Java版)

排序算法的介绍排序也称排序算法 (Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类:内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序。外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。常见的排序算法分类(见下图):冒泡排序基本介绍冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象

2020-07-20 20:05:46 127

原创 数据结构+算法--八皇后问题(Java版)

递归-八皇后问题(回溯算法)八皇后问题介绍八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。这里我们给出一个可以玩这个游戏的网址,大家可以体验一下:八皇后小游戏下边我们给出这个游戏的思路分析:八皇后问题算法思路分析1)第一个皇后先放第一行第一列2)第二个皇后放在第二行第一列、然后判断是否OK, 如果不OK,

2020-07-10 21:01:03 244

原创 数据结构递归-迷宫问题(Java版)

迷宫问题红色区域代表墙,白色区域代表小球可以走的路径要求:从左上角第一个白格起步,一直到右下角的白格在讲到该题之前,我们先了解一下递归递归的概念简单的说: 递归就是方法**自己调用自己,**每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。递归能解决什么样的问题递归用于解决什么样的问题1)各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治

2020-07-10 19:30:28 844

原创 数据结构之后缀表达式-逆波兰表达式(Java版)

在这里我们先介绍一下中缀表达式和后缀表达式,如果有同学对前缀表达式感兴趣,可以进行相关知识的学习,我这里就不做讲解中缀表达式中缀表达式就是常见的运算表达式,如(3+4)×5-6中缀表达式的求值是我们人最熟悉的,但是对计算机来说却不好操作(前面我们讲的案例就能看的这个问题),因此,在计算结果时,往往会将中缀表达式转成其它表达式来操作(一般转成后缀表达式.)后缀表达式后缀表达式又称逆波兰表达式,与前缀表达式相似,只是运算符位于操作数之后中举例说明: (3+4)×5-6 对应的后缀表达式就是 3 4

2020-07-09 19:34:28 224

原创 栈的学习以及用数组模拟栈(Java版)

栈的一个实际需求请输入一个表达式计算式:[722-5+1-5+3-3] 点击计算【如下图】请问: 计算机底层是如何运算得到结果的? 注意不是简单的把算式列出运算,因为我们看这个算式 7 * 2 * 2 - 5, 但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串),我们讨论的是这个问题。-> 栈栈的介绍栈的英文为(stack)栈是一个先入后出(FILO-First In Last Out)的有序列表。栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端

2020-07-07 21:25:33 344

原创 单向环形链表应用场景-约瑟夫环(Josepfu)问题(Java版)

Josephu(约瑟夫、约瑟夫环) 问题Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。提示:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个

2020-07-05 19:29:00 266

原创 数据结构之双向链表(java版)

为什么需要双向链表?单链表的结点都只有一个指向下一个结点,单链表的数据元素无法直接访问其前驱元素,所以逆序访问单链表中元素极其耗时;思想有点类似使用空间复杂度换时间复杂度。双向链表:在单链表的结点中增加一个指向其前驱的pre指针;该链表中第一个结点的前趋结点为NULL,最后一个结点的后继结点为NULL 。双向链表具有单链表的所有操作:添加元素、插入元素、删除元素、遍历元素;双向链表应用实例使用带head头的双向链表实现 –水浒英雄排行榜管理单向链表的缺点分析:单向链表,查找的方向只能是

2020-07-01 20:23:13 205

原创 java基础之IO操作

JAVA中针对文件的读写操作设置了一系列的流,FileInputStream,FileOutputStream,FileReader,FileWriter是四种最为常用的流FileInputStream该流用于从文件读取数据,它的对象可以用关键字 new 来创建。有多种构造方法可用来创建对象。可以使用字符串类型的文件名来创建一个输入流对象来读取文件:InputStream f = new FileInputStream("C:/java/hello");也可以使用一个文件对象来创建一个输入流对

2020-07-01 07:21:33 162

原创 CSS样式学习

CSS简介什么是 CSS?CSS 指层叠样式表 (Cascading Style Sheets)样式定义如何显示 HTML 元素样式通常存储在样式表中把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题外部样式表可以极大提高工作效率外部样式表通常存储在 CSS 文件中多个样式定义可层叠为一个CSS 实例CSS 规则由两个主要的部分构成:选择器,以及一条或多条声明:选择器通常是您需要改变样式的 HTML 元素。每条声明由一个属性和一个值组成。属性(property

2020-06-30 08:13:32 274

原创 数据结构之单链表(java版)

链表(LinkedList)介绍链表是有序的列表,但是它在内存中是存储如下:小结:链表是以节点的方式来存储,是链式存储每个节点包含 data 域, next 域:指向下一个节点.如上图:发现链表的各个节点不一定是连续存储.链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定单链表单链表(带头结点) 逻辑结构示意图如下单链表的应用实例1)使用带head头的单向链表实现 –水浒英雄排行榜管理2)完成对英雄人物的增删改查操作, 注: 删除和修改,查找 可以考虑学员独立完成,也

2020-06-29 21:52:34 424

原创 HTML基础学习(菜鸟教程和W3school参考手册)

关于html基础学习个人参考菜鸟教程网盘HTML视频基础学习连接:https://pan.baidu.com/s/1AHMc_r1aGJ71a4npq4Q0AQ提取码:wg07附上菜鸟教程和W3school参考文档菜鸟教程参考文档链接:https://pan.baidu.com/s/1zdOtHXYQFpZ4jDOOguqIwQ提取码:uf6lW3school参考文档链接:https://pan.baidu.com/s/1lkQSBXbcp2XPd1BhKGRx9w提取码:pvzn.

2020-06-29 09:46:21 894

空空如也

空空如也

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

TA关注的人

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