自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 springboot 发送邮箱

springboot发送邮箱

2023-01-28 20:17:08 8

原创 springboot websocket简单聊天

springboot websocket

2023-01-28 18:32:05 5

原创 springboot 定时任务

springboot定时任务

2023-01-28 15:18:09 492

原创 springboot 线程池

springboot 线程池

2023-01-28 11:15:02 463

原创 springboot 入门

springboot入门

2023-01-27 20:40:39 365

原创 springboot aop记录接口访问日志例子

springboot aop记录接口访问日志例子

2023-01-27 10:58:59 30

原创 Mybatis 入门

mybatis

2023-01-25 17:45:27 871

原创 JVM CAS与原子类

CAS与原子类

2023-01-10 20:00:02 232

原创 JVM Java内存模型(JMM)

Java内存模型

2022-12-16 21:07:40 392

原创 JVM 运行期优化 & 反射优化

运行期优化 & 反射优化

2022-11-12 10:40:34 235

原创 JVM 类加载器

类加载器

2022-11-01 20:28:19 169

原创 spring 入门

spring

2022-10-21 21:52:32 306

原创 JVM 类加载

类加载

2022-10-20 21:16:17 358

原创 JVM 编译期处理(语法糖)

JVM 编译期处理 - 语法糖

2022-10-02 22:05:21 518

原创 JVM 类加载与字节码技术(2)《字节码指令/图解/条件判断指令/例子》

JVM 类加载与字节码技术

2022-09-20 21:17:57 139

原创 JVM 类加载与字节码技术(1)《类文件结构》

JVM 类文件结构

2022-07-28 20:59:47 82

原创 JVM 垃圾回收(四)《GC调优/案例》

JVM基础

2022-07-16 08:40:02 159

原创 JVM 垃圾回收(三)《垃圾回收器/G1》

JVM基础

2022-07-09 09:49:00 226

原创 JVM 垃圾回收(2)《垃圾回收算法/分代回收》

JVM垃圾回收

2022-06-21 21:01:07 100

原创 JVM 垃圾回收(1)《根对象/四种引用》

JVM垃圾回收

2022-06-08 20:56:06 283

原创 Redis 基础 - 点赞/点赞排行榜

点赞/点赞排行榜

2022-06-07 20:42:35 274

原创 Redis 基础 - 优惠券秒杀《基于Redis消息队列实现》

使用Redis消息队列stream实现秒杀

2022-06-01 21:30:22 250

原创 Redis 基础 - 优惠券秒杀《初步优化(异步秒杀)》

Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息Redis 基础 - 优惠券秒杀《非集群》Redis 基础 - 优惠券秒杀《分布式锁(初级)》Redis 基础 - 优惠券秒杀《分布式锁(使用Redisson)》Redis优化秒杀回顾秒杀业务的流程前端发起请求,到达Nginx,Nginx会把请求负载均衡到Tomcat,在Tomcat内部的业务流程是,根据优惠券id查询优惠券->判断

2022-05-30 20:18:44 210

原创 Redis 基础 - 优惠券秒杀《分布式锁(使用Redisson)》

Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息Redis 基础 - 优惠券秒杀《非集群》Redis 基础 - 优惠券秒杀《分布式锁(初级)》基于setnx实现的分布式锁存在的问题1)不可重入同一个线程无法多次获取同一把锁2)不可重试获取锁只尝试一次就返回false,没有重试机制3)超时释放锁超时释放虽然可以避免死锁,但如果是业务执行耗时较长,也会导致锁释放,存在安全隐患4)主

2022-05-26 20:21:58 309

原创 Redis 基础 - 优惠券秒杀《分布式锁(初级)》

参考Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息Redis 基础 - 优惠券秒杀《非集群》synchronized在集群上使用时的问题synchronized只能够保证一个JVM内部的多个线程之间的互斥,而无法在集群之间互斥,要想解决这个问题必须要使用分布式锁。分布式锁是满足分布式系统或集群模式下“多进程可见”并且能“互斥”的锁。为何需要分布式锁比如有两个JVM,JVM1和JVM2

2022-05-24 21:06:36 165

原创 JVM 直接内存

直接内存 Direct Memory直接内存不是JVM里的内存,而是操作系统里的内存。(1)常见于NIO操作时,用于数据缓冲区(比如ByteBuffer使用的是直接内存)(2)分配、回收成本较高,但读写性能高// 演示ByteBuffer作用public class Demo { static final String FORM = "D:\\asd\\asd.mp4";// 选的是比较大的文件,比如200多兆 static final String TO = "D:\\asd.mp4";

2022-05-23 20:44:18 800

原创 JVM 方法区 - 常量池(2)StringTable

JVM 方法区 - 常量池(1)概念StringTable(串池)是运行时常量池中的重要部分。public class Demo { public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "a" + "b"; }}假设有这段代码,先编译,编译成字节码以后,再通过反编译,查看他的常量池到底长什么样子。javap -v Demo.class在输出的一堆人类可看

2022-05-22 11:25:32 191

原创 Redis 基础 - 优惠券秒杀《非集群》

参考Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息摘要用Redis生成保证唯一性的订单id代码示例1~代码示例8是优惠券秒杀简单代码的修改过程,可以加深印象,还可以巩固基础知识本文仅限于非集群模式的场景关于订单id当商铺发优惠券后,大量用户就会去抢购。抢购后,就会生成订单,并插入到订单表。当使用数据表自增主键做订单id时id的规律性太明显比如某用户今天下单后,其订单号

2022-05-20 21:01:16 277

原创 Redis 基础 - 用Redis查询商户信息

请参考Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录本文摘要本文是Redis缓存的简单应用,以根据id查询商户信息为例,先简单介绍基本使用。接着根据缓存更新策略对代码实例进行简单修改。最后再简单介绍缓存穿透、缓存雪崩、缓存击穿的问题以及代码修改。Redis缓存简单应用缓存是存储数据的临时地方,一般读写性能较好。前端请求时,先到达Redis。查看有无数据,有则直接返回。没有时才会去数据库查。能大大减轻数据库的压力。当然,查数据库后,

2022-05-18 21:35:44 268

原创 Redis 基础 - 短信验证码登录

本文摘要先简单列出用session方式,然后简单换为用Redis的方式,并最后通过优化来解决一些小问题。基于session实现短信登陆的简单流程发送验证码前端把手机号传给服务端,后端经过校验后,生成验证码并存入到session中,并通过第三方平台给用户手机发短信验证码。登陆/注册前端把登陆用的手机号和刚才接收的验证码传给服务端,后端经过校验后,若没毛病就用手机号去查用户表,没有用户的话给他注册,若有用户,就算是登陆成功。注册/登陆成功后,把用户的部分信息(除去敏感信息)放到session中。1

2022-05-16 21:48:17 1325

原创 JVM 方法区 - 常量池(1)

概念方法区是所有Java虚拟机线程共享的区域(这点跟堆有点像),这里存储了跟类的结构相关的一些信息,比如成员变量、方法数据以及成员方法、构造方法的代码部分,还有特殊方法(主要是指类的构造器)。因此可看出来,方法区存的是跟类相关的一些信息,还有运行时常量池。方法区是在虚拟机启动时被创建,方法区在逻辑上是堆的组成部分(可以理解为他在概念上定义了方法区,但是具体不同的JVM厂商去实现方法区时,不一定遵从这种逻辑上的定义,实际上是不是堆的一部分,不同的JVM厂商实现方式上是不一样的),这个规范并不强制你这个方法

2022-05-14 11:16:05 245

原创 Redis基础 - Java客户端

在Redis官网中提供了各种语言的客户端。地址:https://redis.io/clients前三名客户端是jedis、lettuce、redisson。jedis:以Redis命令作为方法名称,学习成本低,简单实用。但是jedis实例是线程不安全的,所以每个线程都要建立单独的jedis势力,所以多线程环境下需要基于连接池来使用。lettuce:是基于netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。redisson:是一个基于Re

2022-05-13 22:54:00 229

原创 Redis基础 - 基本类型及常用命令

Redis数据结构介绍Redis是一个key-value的数据库,key一般是string类型,不过value的类型多种多样:string《 hello world 》Hash《 {name: “jack”, age: 12} 》List 《 [A -> B -> C -> C] 》Set 《 {A, B, C} 》SortedSet 《 {A: 1, B: 2, C: 3} 》GEO 《 {A: (120.3, 30.5)} 》BitMap 《 011101010101

2022-05-13 22:28:02 475

原创 Redis基础 - 安装

centOS7 安装Redis安装Redis依赖Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖。yum install -y gcc tcl上传安装包并解压把Windows本地下载的Redis安装包(如:redis-6.2.6.tar.gz)上传到Linux的任意目录(如:/usr/local/src/),因为这个目录一般放安装文件。进入该目录cd /usr/local/src/解压安装包tar -zxvf redis-6.2.6.tar.gz解压后出现

2022-05-13 21:54:18 207

原创 JVM 堆

定义像程序计数器、本地方法栈、虚拟机栈都是线程私有的,而堆(Heap)、方法区都是线程共享的区域。通过new关键字创建的对象都会使用堆内存。特点它是线程共享的,堆中对象都需要考虑线程安全的问题。有垃圾回收机制,即堆中不再被引用的对象就会当成垃圾进行回收,已释放空闲的内存,这样不至于堆被创建的对象给撑爆。堆内存溢出堆内存有垃圾回收器,为何还会存在堆内存溢出问题呢?比如,对象被当做垃圾回收的条件是这个对象没人再使用他,但是如果不断的产生对象,而产生的这些新对象仍然有人在使用他呢?是不是意味着

2022-05-13 21:25:16 81

原创 JVM 栈

栈的数据结构先进后出Java虚拟机栈的概念英文全称是Java virtual machine stacks。比如,Java中每个线程运行的时候,需要给每个线程划分一个内存空间。虚拟机栈其实是线程运行时需要的内存空间。一个线程,就需要一个栈,如果是多个线程,就需要多个虚拟机栈。栈内由什么组成一个栈内,可以看做是由多个栈帧组成,比如,一些元素要放入栈的话,这些元素都称之为栈帧。什么是栈贞一个栈帧对应着一次方法的调用。因为线程最终是为了要执行代码的,这些代码又是由一个个的方法组成的,所以线程运行的时

2022-05-12 21:26:59 554

原创 JVM 程序计数器

概念程序计数器的英文全称是Program Counter Register,又叫程序计数寄存器。Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。即在物理上实现程序计数器是通过一个叫寄存器来实现的,我们的程序计数器是Java对物理硬件的屏蔽和抽象,他在物理上是通过寄存器来实现的。寄存器可以说是整个CPU组件里读取速度最快的一个单元,因为读取/写指令地址这个动作是非常频繁的。所以Java虚拟

2022-05-11 12:11:57 1614

原创 排序算法 - 插入排序(Insertion Sort)

插入排序插入式排序属于内部排序法, 是对于欲排序的元素以插入的方式找寻该元素的适当位置, 以达到排序的目的。* 插入排序的问题: 当需要排序的数组中小值越靠后, 就会循环判断次数越多(希尔排序是插入排序的优化版本, 又称缩小增量排序)插入排序的演变过程(从小到大)把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素, 无序表中包含有 n-1 个元素, 排序过程中每次从无序表中取出第一个元素, 把它的排序码依次与有序表元素的排序码进行比较, 将它插入到有序表中的适当位置

2020-12-23 15:49:27 85

原创 排序算法 - 选择排序(Selection Sort)

选择排序(Selection Sort)选择式排序也属于内部排序法, 是从欲排序的数据中, 按指定的规则选出某一元素, 再依规定交换位置后达到排序的目的。选择排序的演变过程(从小到大)第一次从 arr[0]~arr[n-1]中选取最小值,与 arr[0] 交换第二次从 arr[1]~arr[n-1]中选取最小值, 与 arr[1] 交换第三次从 arr[2]~arr[n-1]中选取最小值, 与 arr[2] 交换第 i 次从 arr[i-1]~arr[n-1]中选取最小值, 与 arr[i-1

2020-12-21 16:44:42 137

原创 排序算法 - 冒泡排序(Bubble Sort)

冒泡排序(Bubble Sort)排序过程: 从数组下标 0开始比较相邻元素, 当发现逆序时交换,很像水低开始往上冒泡冒泡排序的演变过程(从小到大)外循环共进行数组的大小-1次内循环的循环次数是跟着外循环递减如果内循环中, 没有发生一次交换, 说明排序以完成,可以提前结束排序public static void main(String[] args) { int arr[] = {3, 9, -1, 10, -2}; int temp; System.out.println("排序

2020-12-17 17:27:27 114

空空如也

空空如也

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

TA关注的人

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