自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 并发秒杀系统中超卖问题与重复下单问题的解决思路

什么是超卖问题问题原始描述:两用户查询某商品库存都是1,导致卖出2个商品,产生了超卖问题。超卖导致的原因:不同用户检查库存够用,然后并发下订单,减库存,由于检查库存和减少库存这两个操作不保证原子性,所以可能会出现本线程检查库存够用到实际减少库存操作之间,其他线程抢先扣除库存导致本线程扣除库存后库存出现负数,引发超卖。秒杀下单流程判断用户是否登陆,是否有收货地址等判断库存是否够用判断是否已经秒杀到了,防止重复下单减库存创建订单流程中可能会出现的问题超卖问题,由于步骤2与步骤4并不是

2022-02-07 22:25:09 5674 3

原创 深入了解Redis底层设计 之数据结构与对象机制(redis对象在内存中是如何存储的)

Redis底层设计对象机制redisObjectredisObject 是 Redis 类型系统的核心, 数据库中的每个键、值, 以及 Redis 本身处理的参数, 都表示为这种数据类型.就是Redis中数据相关的类型都是redisObject类型,类似Controller层的统一返回值R。/* * Redis 对象 */typedef struct redisObject { // 类型 unsigned type:4; // 编码方式 unsigned

2022-01-25 23:51:54 777

原创 MySQL底层逻辑架构,一条SQL语句的执行过程与MySQL日志之间的关系

​概述 第一层 连接层最上层为一些客户端和连接服务,主要完成一些类似于连接处理/授权认证.及相关的安全方案connectors 连接connection pool 连接池第二层 业务逻辑处理层(服务层)Management service & Utilties 安全,集群,容灾恢复等工具SQL Interface SQL接口 表示接受用户的SQL命令,并且返回用户需要查询的结果,Parser 解析器 解析指令,权限控制,{判断

2022-01-24 23:31:03 2253

原创 高并发应用实践——限流手段

每个系统都有服务的上线,所以当流量超过服务极限能力时,系统可能会出现卡死、崩溃的情况,所以就有了降级和限流。当高并发或者瞬时高并发时,为了保证系统的稳定性、可用性,系统以牺牲部分请求为代价或者延迟处理请求为代价,保证系统整体服务可用。

2022-08-25 16:04:49 385 1

原创 高并发应用实践——缓存简介

随着互联网的普及,内容越来越复杂,用户和数据量越来越大,所以我们的应用应该支持更高的并发数,但是由于我们的服务器和数据库服务器资源量是有限的缓存的使用可以出现在1~4的各个环节中,每个环节的缓存方案与使用各有特点。图:互联网应用一般流程。...

2022-08-17 14:28:12 509

原创 理解架构的模式(架构中技术点的抽象)

网站越大,功能越复杂,服务和数据处理的种类越多,将这些不同的功能服务分开,包装成独立的高内聚低耦合的模块单元,能够有助于软件的开发与维护,同时提高了网站的并发处理能力和扩展能力。所以虽然分层架构模式最初的目的是规划软件清晰的逻辑结构以便于开发维护,但在网站的发展过程中,分层结构对网站支持高并发向分布式方向的发展至关重要。大型网站的分隔粒度可能会很小,比如在应用层将不同的业务进行分隔,将购物,论坛,搜索等分隔成不同的应用,有不同的独立团队负责,部署在不同的服务器中。在现在的软件设计中,缓存已经无处不在。...

2022-08-15 15:01:40 242

原创 架构的演进

随着业务量增大,一些核心系统数据库单表数量达到几千万甚至亿级,这时候对该表的数据操作效率会大大降低,并且虽然有缓存来抗读的压力,但是对于大量的写操作和一些缓存miss的流量到达一定量时,单库的负荷也会到达极限,这时候需要将表拆分,一般直接采用分库分表,因为只做分表的话,单个库的连接瓶颈仍然无法解决。大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据,任何简单的业务一旦需要处理数以P计的数据和面对数以亿计的用户,问题就会变得很棘手。大型网站架构主要就是解决这类问题。),从而成为网站的性能瓶颈。.

2022-08-12 15:33:49 227

原创 从不同视角理解架构

在学习架构时,首先要理清楚架构的视角,。对于不同职位的视角是不一样的,比如开发而言他更多的看到的是开发架构;对售前人员,他可能更多的看到的是业务架构;对于运维人员,他看到的可能是运维架构;而对于技术支持和部署人员,他更多的看到的网络和物理架构。...

2022-08-11 09:58:36 543

原创 软件架构简介

抽象而言,架构就是对系统中的实体以及实体之间的关系所进行的抽象描述,是对物/信息的功能与形式元素之间的对应情况所做的分配,是对元素之间的关系以及元素同周边环境之间的关系所做的定义。架构能将目标系统按某个原则进行切分,切分的原则,是要便于不同的角色进行并行工作,结构良好的创造活动要优于毫无结构的创造活动。软件开发区别于其他行业的重要一点,程序员往往不需要考虑现实规律的束缚,一个软件的设计开发,完全依赖于程序员的创造力思维和思维组织能力,这意味着在软件开发中最大的限制其实是我们能否正确理解我们正在创建的对象。.

2022-08-10 10:48:23 325

原创 浅谈敏捷开发

敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切成多个子项目,各个子项目的成果都是经过测试,具备集成和可运行性。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的子项目,并分别完成,在此软件过程中软件一直处于可使用状态。...

2022-07-27 16:59:46 348

原创 微服务连接云端Sentinel 控制台失败及连接成功后出现链路空白问题(已解决)

微服务连接云端Sentinel 控制台失败及连接成功后出现链路空白问题

2022-06-07 10:25:25 3023 2

原创 58同城2021校招笔试-二叉树遍历

对给定的二叉树依次完成前序,中序,后序遍历,并输出遍历结果。每行输入为一个二叉树,一维数组形式。其中-1表示Nil节点,例如:1,7,2,6,-1,4,8 构成的二叉树如下图所示:结果以二维数组形式输出(前序,中序,后序遍历的结果),其中Nil节点不用输出。输入例子1:[1,7,2,6,-1,4,8]输出例子1:[[1,7,6,2,4,8],[6,7,1,4,2,8],[6,7,4,8,2,1]]例子说明1:注意二维数组中的结果依次为:前序,中序,后序遍历的结果,Nil(-1)节点不用输出。

2022-04-09 18:23:36 867

原创 LeetCode热题100 17. 电话号码的字母组合

电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例 1:输入:digits = “23”输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]示例 2:输入:digits = “”输出:[]示例 3:输入:digits = “2”输出:[“a”,“b”,“c”]提示:0 <= digits.l.

2022-03-28 15:21:43 259

原创 LeetCode热题100 05.最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”class Solution { public String longestPalindrome(String s) { //动态规划求解思路:若字符串头尾相同,那么这个字符串是否是回文串,就只需要看去掉头尾的字串是否是回文串了 //状态定义:dp[i][j]表示

2022-03-28 12:08:37 323

原创 并发编程八股文

sleep()方法和wait()方法的区别和共同点?相同点:两者都可以暂停线程的执行,都会让线程进入等待状态不同点:sleep方法没有释放锁,wait方法释放了锁sleep方法属于 Thread 类的静态方法,作用于当前线程;而wait方法是Object类的实例方法,作用于对象本身执行sleep方法后,可以通过超时或interrupt方法唤醒休眠中的线程;执行wait方法后,只能通过notify或notifyAll方法唤醒等待线程线程安全有那些实现思路互斥同步synchroni

2022-03-22 11:42:28 163

原创 无助的产品经理(最长升序子序列)

在某厂,产品经理同学的工作职责除了给开发同学提需求,还有一件极其重要的事:对产品运营数据做归因分析。某天,该产品经理同学接到老板要求:根据在过去一段时间内产品的“每日活跃用户数”,统计出最长的增长总天数,也就是把保持增长势头(可以不连续)的天数抽出来,你可能会得到多个新序列,计算最长的那个序列的总天数。我们把该产品自上线以来“每日的活跃用户数”,都按照顺序放入一个数组,比如:[1,5,122,34,45,232,342,34],以这组数据为例,把其中所有的增长子序列罗列出来:形成了第一个子序列:

2022-03-21 12:13:30 639

原创 计算派出机器人的数量(奇安信秋招Java方向试卷2)

有一个大型仓库使用拣货机器人从不同的货架间取货。已知:1、货架呈二维网格排列,网格中的每个货架只会放置一种商品。2、受这代设备的技术水平所限,机器人只能沿上下左右四个方向移动,还不能沿斜线移动,请理解。仓库当前使用的拣货算法是这样:1、一张订单会包含X种商品,分布在X个货架上2、结合将这X种商品的所在位置,将地图上的商品分解为Y个“商品堆”,然后同时派出Y个机器人,并发取货,每个机器人只负责一个“商品堆”。3、“商品堆”的定义是上下左右彼此相邻的一组商品。在订单被分析后,给你一个由 ‘1’(

2022-03-21 12:11:57 680

原创 剑指 Offer 48. 最长不含重复字符的子字符串

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。提

2022-03-20 16:09:48 93

原创 MySQL面试整合

索引什么是索引?索引是一种数据结构,作用是帮助快速的对数据进行查找索引是什么样的数据结构?索引的数据结构与存储引擎的具体实现有关,MySQL中有Hash索引,B树索引,B+树索引等,InnoDB中使用的是B+树索引。为什么使用索引(索引的好处)?索引能大大加快检索速度,这是创建索引的主要原因、通过唯一索引能够保证数据表中的数据唯一性索引能够避免排序和临时表将随机IO转变为顺序IO为什么InnoDB建议使用自增的ID作为主键?首先InnoDB会默认为主键创建聚集索引(与其说是为主键创

2022-03-13 17:59:06 1096

原创 Spring面试整合

什么是Spring FrameworkSpring 是一个开源的应用框架,目的是降低程序开发的复杂度。具有的特点有:轻量级与低耦合,支持AOP与IOC它是分层的体系结构,能够运行用户选择组件,同时能够整合其他框架,如mybatis等SpringFramework特点轻量级:spring在代码量和透明度方面都很轻便非入侵式 : 基于Spring开发的应用程序可以不用依赖spring的APIIOC:控制反转,降低系统间耦合AOP:面向切面,能够将业务逻辑与系统服务分离,实现高内聚容器 :对象

2022-03-10 14:51:23 1438 1

原创 计算机网络八股文

浏览器输入一个网站后,具体发生了什么进行DNS解析操作,根据DNS解析结果查找到服务器IP地址通过IP寻址找到服务器,并利用三次握手建立TCP连接浏览器生成HTTP保温,发送HTTP请求,等待服务器响应服务器处理请求,返回服务器根据HTTP是否开启长链接,进行TCP挥手浏览器根据静态资源进行页面渲染了解REST API吗REST API全称为表述性转移状态,即,利用HTTP中的get、post、put、delete以及其他的HTTP方法构成REST请求中的数据资源增删改查的操作GET方

2022-03-09 11:41:47 2513

原创 剑指 Offer 13. 机器人的运动范围

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:m = 3, n

2022-03-07 10:38:14 80

原创 剑指 Offer 11. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0class Solution { public int minArray(int[] number

2022-03-07 10:23:37 65

原创 剑指 Offer 52. 两个链表的第一个公共节点

输入两个链表,找出它们的第一个公共节点。如下面的两个链表:在节点 c1 开始相交。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,

2022-03-07 10:09:33 122

原创 并发编程八股文

sleep()方法和wait()方法的区别和共同点?相同点:两者都可以暂停线程的执行,都会让线程进入等待状态不同点:sleep方法没有释放锁,wait方法释放了锁sleep方法属于 Thread 类的静态方法,作用于当前线程;而wait方法是Object类的实例方法,作用于对象本身执行sleep方法后,可以通过超时或interrupt方法唤醒休眠中的线程;执行wait方法后,只能通过notify或notifyAll方法唤醒等待线程​Thread.sleep(0)的作用是什么?由于J

2022-03-07 10:02:27 367

原创 JVM理论基础

类加载机制类加载的生命周期?**类加载过程包含了加载,验证,准备,解析,初始化五个阶段。**在这五个阶段中,加载验证准备和初始化这四个阶段发生的顺序是一定的,而解析阶段不一定,他在某些情况下可以在初始化后开始。加载:查找并加载类的二进制数据连接:2.1验证:确保被加载类的正确性(语义正确等)2.2准备:为类的静态变量分配内存,并将其初始化为默认值2.3解析:将类中的符号引用转为直接引用3.初始化:为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要是对类的变量进行初始化Cl

2022-03-05 11:32:57 730 1

原创 举例说明一下消息队列的应用场景

消息队列是分布式系统中重要的组件,主要实现了:异步消息,应用解耦,流量控制等功能。应用场景1.异步处理以注册用户为例,假设用户注册需要发送注册邮件,发送短信及数据入库用户注册后 首先进行数据入库,入库后的两个操作通常有并行与串行两种执行方式1.串行:两个功能顺序执行,先发邮件后发短信,或先发短信后发邮件2.并行:发短信和发邮箱两个功能同时异步执行,以上三个任务完成后,返回给客户端。假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时

2022-03-02 23:59:42 1140

原创 剑指 Offer 03. 数组中重复的数字

找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000class Solution { public int findRepeatNumber(int[] nums) { //原地交换法

2022-03-02 09:31:50 61

原创 剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]提示:节点总数 <= 1000/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left;

2022-02-20 16:48:21 112

原创 剑指 Offer 12. 矩阵中的路径

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。示例 1:输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E

2022-02-16 16:26:23 151

原创 剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。示例 1:Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output: [3,9,20,null,null,15,7]示例 2:Input: preorder = [-1], inorder = [-1]Output: [-1]限制:0 <= 节点个数 &lt

2022-02-13 15:29:39 211

原创 剑指 Offer 04. 二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30]]给定 target = 5,返回 true。给定 ta

2022-02-13 14:26:30 324

原创 剑指 Offer 26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3/ \4 5/ 1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。class Solution { public boolean isSubStructure(TreeNode A, TreeNode B) { //判断以ab为根的树 b是否是a的子结构

2022-02-12 23:30:45 83

原创 剑指 Offer 56 - I. 数组中数字出现的次数

剑指 Offer 56 - I. 数组中数字出现的次数一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]限制:2 <= nums.length <= 10000class Solution {

2022-02-10 14:58:08 263

原创 spring底层之AOP面向切面编程原理及配置使用

概述AOP是什么AOP为Aspect Oriented Programming的缩写,意为:面向切面编程AOP最早是由AOP联盟的组织提出的,指定的一套规范,spring将AOP的思想引入框架之中,通过预编译方式和运行期间动态代理实现程序的统一维护的一种技术​引例中关于给service添加日志的方法著作权归https://pdai.tech所有。​public class UserServiceImpl implements IUserService {/** * find user

2022-02-06 00:53:22 985

原创 Spring底层之控制反转-IOC使用配置及原理

Spring bean是什么IoC Container管理的是Spring Bean, 那么Spring Bean是什么呢?​Spring里面的bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的,这里所定义的bean就相当于给了你一个更为简便的方法来调用这个组件去实现你要完成的功能。​​IOC是什么Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的

2022-01-29 17:12:57 917

原创 Spring各模块介绍与Spring要点引入(IOC控制反转,AOP面向切面编程的引入)

Spring 是分层的 Java SE/EE 一站式轻量级开源框架,以 IoC(Inverse of Control,控制反转)和 AOP(Aspect Oriented Programming,面向切面编程)为内核。​我们一般说 Spring 框架指的都是 Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们进行开发。​就是说我们平时说的使用Spring,指的是使用Spring Framework中的某些模块来完成自己的需求Spring的特点特性:非入侵

2022-01-27 20:15:53 957

原创 Redis搭建集群的基础——Redis主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。(侧面说明了只有主机能写,而从机只能读)主从复制的作用备份数据:主从复制能够提供数据的热备份,是持久化操作之外的一个数据冗余方式故障恢复:当主节点出现故障后,可以由从节点提供服务,实现快速的故障恢复;负载均衡:写少读多的场景下,将读写分离到不同的服务器上,主机只负责写操作,降低服务器压力高可用:主从复制还是哨兵和集群能

2022-01-26 10:16:19 312

原创 什么是Redis事务与Redis事务详解

Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。​总结说:redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。Redis事务相关命令MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。EXEC:执行事务中的所有操作命令。DISCARD:取消事务,放弃执行事务

2022-01-26 10:16:13 965

原创 Redis持久化机制之RDB与AOF机制含义与实现

为了防止数据丢失以及服务重启时能够恢复数据,Redis支持数据的持久化,主要分为两种方式,分别是RDB和AOF; 当然实际场景下还会使用这两种的混合模式。为什么需要Redis持久化Redis是一个基于内存的数据库,这意味着一旦服务宕机,内存中的数据会全部丢失。通常的解决方案是从后端的持久化数据库中(如mysql)去恢复这些数据,但是后端数据库有一定的性能瓶颈,如果大数据量的恢复会对后端数据库造成巨大的压力​Redis共提供了四种持久化方案,分别是RDB,AOF,VM虚拟内存,DISKSTORE.

2022-01-26 10:16:06 241

空空如也

空空如也

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

TA关注的人

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