自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式雪花算法

1第一个服务节点在获取时,Redis 可能是没有 snowflake_work_id_key 这个 Hash 的,应该先判断 Hash 是否存在,不存在初始化 Hash,dataCenterId、workerId 初始化为 0。分布式系统中,有一些需要使用全局唯一 ID 的场景,这种时候为了防止 ID 冲突可以使用 36 位的 UUID,但是 UUID 有一些缺点,首先他相对比较长,另外 UUID 一般是无序的。如果是全局唯一,所有使用雪花算法的应用,要用同一个 Redis 节点。

2024-08-07 14:34:45 913

原创 Redis经典五大数据结构底层原理

只有整数才会使用 int,如果是浮点数,Redis 内部其实先将浮点数转化为字符串值,然后再保存。embstr 与 raw 类型底层的数据结构其实都是SDS (简单动态字符串,Redis 内部定义 sdshdr 一种结构)。1 intLong类型整数时,RedisObject中的ptr指针直接赋值为整数数据,不再额外的指针再指向整数了,节省了指针的空间开销。2 embstr当保存的是字符串数据且字符串小于等于44字节时,embstr类型将会调用内存分配函数,只分配一块连续的内存空间,空间中依次包含。

2024-08-06 23:37:26 910

原创 布隆过滤器

文章目录是什么能干嘛布隆过滤器原理添加key时查询key时哈希冲突导致数据不精确使用步骤初始化bitmap添加占坑位判断是否存在为什么不要删除小总结使用场景解决缓存穿透的问题缓存穿透是什么可以使用布隆过滤器解决缓存穿透的问题黑名单校验安全连接网址,全球上10亿的网址判断手写布隆过滤器Mybatis通用Mapper4项目过程Redis乱码,添加java的config类新增布隆过滤器优缺点优点缺点是什么由一个初值都为零的bit数组和多个哈希函数构成用来快速判断集合中是否存在某个元素。布隆过滤器是一种类似s

2024-08-06 23:34:49 922

原创 缓存双写一致性

binlog日志可以记录数据库所有执行的DDL 和 DML 等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、| ROW模式 除了记录sql语句之外,还会记录每个字段的变化情况,能够清楚的记录每行数据的变化历史,但会占用较多的空间。A线程先成功删除了redis里面的数据,然后去更新mysql,此时mysql正在更新中,还没有结束。在业务程序运行的时候,统计下线程读数据和写缓存的操作时间,自行评估自己的项目的读数据业务逻辑的耗时,

2024-08-06 23:33:20 930

原创 RedLock算法分析

Redis也提供了Redlock算法,用来实现分布式锁。锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。Redlock算法是实现高可靠分布式锁的一种有效解决方案,可以在实际开发中使用。

2024-08-06 23:29:53 880

原创 手写Redis分布式锁

Resource@Resourcetry {//1 查询库存信息//有库存retMessage = "恭喜你,成功卖出一个商品,库存剩余:" + inventorynumber;System.out.println(retMessage + "\t" + "服务端口号:" + port);} else {retMessage = "库存不足";return retMessage + "\t" + "服务端口号:" + port;

2024-08-06 23:27:51 948

原创 网络IO模型及零拷贝问题

select方式,既做到了一个线程处理多个客户端连接(文件描述符),又减少了系统调用的开销(多个文件描述符只有一次 select 的系统调用 + N次就绪状态的文件描述符的 read 系统调用)。

2024-08-06 23:21:42 996

原创 java线程池解析

创建一个可缓存的无界线程池,如果线程池长度超过处理需要,可灵活回收空线程,若无可回收,则新建线程。当线程池中的线程空闲时间超过60s,则会自动回收该线程,当任务超过线程池的线程数则创建新的线程,线程池的大小上限为Integer.MAX_VALUE,可看作无限大。创建一个单线程化的线程池,它只有一个线程,用仅有的一个线程来执行任务,保证所有的任务按照指定顺序(FIFO,LIFO,优先级)执行,所有的任务都保存在队列LinkedBlockingQueue中,等待唯一的单线程来执行任务。

2024-08-06 23:05:45 814

原创 ConcurrentHashMap

JDK1.7底层采用分段的数组+链表实现JDK1.8采用的数据结构跟HashMap1.8的结构一样,数组+链表+红黑树。

2024-08-06 23:04:11 898

原创 java集合框架

Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1)HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。

2024-08-06 23:03:41 651

原创 操作系统03:调度算法和文件系统

这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。在 Linux 文件系统中,用户空间、系统调用、虚拟文件系统、缓存、文件系统以及存储之间的关系如下图:

2024-08-06 22:58:53 756

原创 操作系统02

应用程序只想读取磁盘上文件 A 的 offset 为 0-3KB 范围内的数据,由于磁盘的基本读写单位为 block(4KB),于是操作系统至少会读 0-4KB 的内容,这恰好可以在一个 page 中装下。但是操作系统出于空间局部性原理(靠近当前被访问数据的数据,在未来很大概率会被访问到),会选择将磁盘块 offset [4KB,8KB)、[8KB,12KB) 以及 [12KB,16KB) 都加载到内存,于是额外在内存中申请了 3 个 page;

2024-07-30 19:16:52 964

原创 操作系统01

::info64 位相比 32 位 CPU 的优势在哪吗?64 位 CPU 的计算性能一定比 32 位 CPU 高很多吗?:::64 位相比 32 位 CPU 的优势主要体现在两个方面:64 位 CPU 可以一次计算超过 32 位的数字,而 32 位 CPU 如果要计算超过 32 位的数字,要分多步骤进行计算,效率就没那么高,但是大部分应用程序很少会计算那么大的数字,所以只有运算大数字的时候,64 位 CPU 的优势才能体现出来,否则和 32 位 CPU 的计算性能相差不大。

2024-07-30 15:44:47 652

原创 计算机网络04

如上图中的蓝色部分。

2024-07-30 15:42:11 433

原创 计算机网络03

我们可以自定义一个消息结构,由包头和数据组成,其中包头包是固定大小的,而且包头里有一个字段来说明紧随其后的数据有多大。比如这个消息结构体,首先 4 个字节大小的变量来表示数据长度,真正的数据则在后面。当接收方接收到包头的大小(比如 4 个字节)后,就解析包头的内容,于是就可以知道数据的长度,然后接下来就继续读取数据,直到读满数据的长度,就可以组装成一个完整到用户消息来处理了。

2024-07-30 15:41:21 379

原创 计算机网络02

*TCP 是面向连接的、可靠的、基于字节流的传输层通信协议。**面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。

2024-07-30 15:39:35 955

原创 计算机网络01

但是,这存在一个问题,在高性能网络场景下,网络包的数量会非常多,那么就会触发非常多的中断,要知道当 CPU 收到了中断,就会停下手里的事情,而去处理这些网络包,处理完毕后,才会回去继续其他事情,那么频繁地触发中断,则会导致 CPU 一直没完没了的处理中断,而导致其他任务可能无法继续前进,从而影响系统的整体效率。首先,会先进入到网络接口层,在这一层会检查报文的合法性,如果不合法则丢弃,合法则会找出该网络包的上层协议的类型,比如是 IPv4,还是 IPv6,接着再去掉帧头和帧尾,然后交给网络层。

2024-07-30 15:33:49 962

原创 算法题目整合5

思路:利用left和right记录连续相同的字符串索引,计算长度len,如果是0,1,2,4这种情况直接输出-1并return。如果是奇数直接输出,如果是偶数的话,可以拆成3和len-3两个部分。的最小值是101100,求其第4554小即在从后数的四个问号位置分别加上‘3’,‘5’,‘5’,‘4’即可,即551153;表示当前卡牌正面(或反面)加上上一个取余结果再对3取余的值,举个例子,比如说。),由于不同的取余方案搭配上正反面的组合,共有6中结果,所以在。,表示当前卡牌正面为1,当遍历的。

2024-07-23 17:36:37 971

原创 算法题目整合4

三个元素都保证了replacePre这个变量记录的是替换后的「连续子数组的最大和」。思路:就是leetcode210:课程表II的原题,换了个名词而已,直接bfs拓扑排序。leetcode239题变形,采用两个PriorityQueue即可,注意数据的读取。由于最多只能改变一次值,所以我们可以用一个replacePre变量记录改变后的最大值。第二个元素表示未替换过的最大值加上需要替换的数字;了,所以接下来还需要考虑替换的情况,那就是令。第三个元素表示替换过的最大值加上正常的数字。如果是笔试,可以直接利用。

2024-07-22 23:15:09 1058

原创 算法题目整合3

构造有向图的领接表,然后利用dfs求解,每次选择编号最小的叶子结点+1,返回时也是将最小编号返回(需要和当前start进行比较)排列的个数等于每个数字出现的个数的乘积,计算每个数个数字出现的乘积,然后再累加即可。rowMin表示从左边到达的最小值,当前位置不是’表示不可达,所以就需要进行判断三个可能的方向。colMin表示从上边到达的最小值。'时,每次循环会对其进行更新。列需要的最小步数,需要注意。很显然的动态规划题,

2024-07-21 15:43:11 602

原创 算法题目整合2

利用dfs进行求解,本质上就是求岛屿数量问题leetcode200,只不过需要自己进行建图处理。构建一个环形链表,距离需要用。dfs+List记录相邻节点。

2024-07-19 15:32:07 150

原创 算法题目整合

小红拿到了两个长度为 n 的数组 a 和 b,她仅可以执行一次以下翻转操作:选择a数组中的一个区间[i, j],(i!例如,对于 a = [2,3,4,1,5,6],小红可以选择左闭右闭区间[2,4],数组 a 则变成[2,3,5,1,4,6]。思路:考虑先找到满足条件的最大left索引和最小right索引,然后进行循环:每次循环left–,right++,如果说A[left]==B[right],说明翻转后还是相同,直到两者不等,那么此时就可以break了。初始 a 数组和 b 数组必定不相同。

2024-07-17 19:08:56 619

原创 leetcode05

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。MinStack()初始化堆栈对象。将元素val推入堆栈。void pop()删除堆栈顶部的元素。int top()获取堆栈顶部的元素。获取堆栈中的最小元素。使用辅助栈的解法,空间复杂度On不使用辅助栈的方法,空间复杂度O1。

2024-07-03 14:42:16 192

原创 leetcode04

方法获取的是队列的头部节点值,而。不实用辅助栈的方法,空间复杂度。使用辅助栈的解法,空间复杂度。方法获取的是栈的顶部值!

2024-05-21 01:05:36 225

原创 Linux常见命令

rpm用于互联网下载包的打包以及安装工具,它包含在某些Linux分发版本中.它生成具有.RPM扩展名的文件.类似于windows中的setup.exe查询已经安装的rpm列表rpm -qi 软件包名显示信息rpm -qf 文件全路径名显示文件所属的软件包rpm -ql 软件包名查询软件包中的文件rpm -e RPM包的名称卸载rpm包如果其他软件包依赖于要卸载的软件包,卸载是会产生错误信息如果强制删除,增加参数 --nodepsrpm -ivh RPM包全路径文件安装rpm包。

2024-05-03 18:01:52 851 1

原创 [leetcode]03

排序完成后就是建立答案的集合,如果集合为空,就先将数组第一个元素放进去,如果不为空就进行比较:若当前区间的左边比答案最右边区间的右边还大(例如interval为[3,5],但是res最右边的元素为[1,2]),那么就添加这个区间进入集合。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]那么这种情况是合理的吗?输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

2024-05-02 22:02:47 959 1

原创 [SSM]03

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称(),但它通常被称为“Spring MVC”。在控制层框架历经Strust、WebWork、Strust2等诸多产品的历代更迭之后,目前业界普遍选择了SpringMVC作为Java EE项目表述层开发的首选方案。Spring 家族原生产品,与IOC容器等基础设施无缝对接表述层各细分领域需要解决的问题全方位覆盖,提供。

2024-04-29 01:00:14 650

原创 [SSM]02

JDBCSQL 夹杂在Java代码中耦合度高,导致硬编码内伤维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见代码冗长,开发效率低Hibernate 和 JPA操作简便,开发效率高程序中的长难复杂 SQL 需要绕过框架内部自动生成的 SQL,不容易做特殊优化基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。反射操作太多,导致数据库性能下降MyBatis轻量级,性能出色SQL 和 Java 编码分开,功能边界清晰。

2024-04-28 22:04:17 934

原创 【SSM】01

广义的Spring:Spring技术栈狭义的Spring:Spring Framwork(基础框架)狭义的Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。Spring框架提供了很多功能,比如依赖注入(DI)、面相切面编程(AOP)、声明式事务管理(TX)等。回顾常规的三层架构处理请求流程:整个项目就是由各种组件搭建而成的:Spring框架可以替代程序员原有的new对象和对象属性赋值动作等!Spring具体的组件管理动作包括:组件对象实例化。

2024-04-28 19:25:30 510 1

原创 [leetcode02]

记录leetcode刷题的笔记,参考了leetcode的高赞答案和官方解答.

2024-04-26 12:51:12 617 1

原创 【Java Web】Servlet

什么是Servlet的生命周期应用程序中的对象不仅在空间上有层次结构的关系,在时间上也会因为处于程序运行过程中的不同阶段而表现出不同状态和不同行为——这就是对象的生命周期。简单的叙述生命周期,就是对象在容器中从开始创建到销毁的过程。Servlet容器Servlet对象是Servlet容器创建的,生命周期方法都是由容器(目前我们使用的是Tomcat)调用的。Servlet主要的生命周期执行特点生命周期对应方法执行时机执行次数构造对象构造器第一次请求或者容器启动1初始化init()

2024-04-24 16:00:04 739

原创 [MySQL]事务02

MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。Readview就是事务在使用MVCC机制进行快照读操作时产生的读视图。当事务启动时,会生成数据库系统当前的一个快照。

2024-04-24 00:35:51 929

原创 [MySQL]范式和事务01

*事务:**一组逻辑操作单元,使数据从一种状态变换到另一种状态。**事务处理的原则:**保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。事务执行过程中可能遇到各种错误,比如服务器本身的错误操作系统错误,甚至是突然断电。

2024-04-23 23:24:56 967

原创 [MySQL]索引03

就是索引列+主键包含SELECT到FROM之间查询的列。

2024-04-23 12:31:39 749

原创 [MySQL]MySQL的逻辑架构

中的,而所谓的表空间只不过是InnoDB对文件系统上一个或几个实际文件的抽象,也就是说我们的数据说到底还是存储在磁盘上的。在InnoDB存储引擎中,有一部分数据会放到内存中,缓冲池占了这部分内存的大部分,它用来存储各种数据缓存,其中包括了数据页,索引页,插入缓冲,锁信息,自适应Hash和数据字典信息等.这个原则是一个重要的原则.毕竟缓冲池大小是有限的,比如磁盘有200G,内存只有16G,缓冲池大小只有1G,我们无法把所有的数据加载到缓冲池里面,所以就。不同的存储引擎具有的功能不同,这样。

2024-04-23 00:10:11 1123

原创 [MySQL]索引02

MySQL 中的 Memory 存储引擎支持 Hash 存储,如果我们需要用到查询的临时表时,就可以选择 Memory 存储引擎,把某个字段设置为 Hash 索引,比如字符串类型的字段,进行 Hash 计算之后长度可以缩短到几个字节。当字段的重复度低,而且经常需要进行。Hash 索引存在着很多限制,相比之下在数据库中 B+ 树索引的使用面会更广,不过也有一-些场景采用 Hash 索引效率更高,比如在键值型(Key-Value)数据库中,即使多个存储引擎支持同一种类型的索引,但是他们的实现原理也是不同的。

2024-04-23 00:09:59 676

原创 [MySQL]存储引擎和索引01

默认事务型引擎对内存要求较 高。

2024-04-23 00:09:39 830

原创 [leetcode]01

给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。可以按任意顺序返回结果列表。输入:{1,3,5},{2,4,6},返回{1,2,3,4,5,6}输入:{1,2,3,4,5},2,4,返回{1,4,3,2,5}

2024-04-22 18:29:08 920

空空如也

空空如也

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

TA关注的人

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