自定义博客皮肤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)
  • 收藏
  • 关注

原创 幂等问题及解决方案

二、应用支付场景:下订单时,如何保证没有重复订单,比如用户将商品添加购物车后,反复点击去支付按钮,此时后端会收到多条创建订单的请求,如何保证不重复生成订单?首次提交数据,删除成功,此时有新数据进来,重复提交的delete请求就会删除新数据导致数据幂等性问题;订单被删除多次产生多个商品id、用户id、订单未支付状态、逻辑删除,导致触发唯一索引,实际上这种情况是被允许的;3、设计幂等表,将唯一索引里面的字段提出来,单独放一个表,先查防重幂等表,如果发现有数据,直接返回,没有数据,则insert;

2024-07-25 17:32:39 228

原创 PostgreSQL约束、表空间、视图、物化视图、索引、事务(MVCC和锁)、数据备份和恢复

在PostgreSQL中,在存储数据时,数据必须要落到磁盘。(select id,name,real_name from user) ---- 仅查询部分字段,不查询密码。如:对表进行insert、update、delete、truncate时,会触发表的Trigger。当创建表时指定了表空间,则默认存储表空间存储了一个链接,指向指定的实际存储的磁盘目录。简单视图允许写操作,但不推荐,因为视图实际上是写的表数据。(5)外键约束(不建议,会导致级联关联)

2024-07-22 17:06:40 547

原创 PostgreSQL的引号、数据类型转换和数据类型

(2)pgsql对boolean类型不敏感,也可以是'yes'或者'no',大小写也不敏感;2、在pgsql中,实际字符串用单引号,双引号相当于mysql的``,用来包含关键字;decimal(n,m),本质是numeric,pgsql会帮转换。1、场景:字符串默认情况下是text类型,浮点默认是numeric;int,int4,int,integer:都是4位。(2)第二种方式,也可以在具体值的后面加 ::类型。(1)可以存储true,false,和null;|/ 平方根 |/4=2。

2024-07-19 11:48:08 522

原创 PostgreSQL创建表和自增序列

2、pgsql没有auto_increment的概念,如何实现id自增?1、在mysql没有序列的概念,id自增通过auto_increment实现;二、查询、修改和删除和mysql没差别。方式一:创建序列,绑定表;

2024-07-18 17:07:17 249

原创 PostgreSQL的逻辑架构

一、PostgreSql的逻辑架构:所有者:

2024-07-18 16:32:46 203

原创 PostgreSQL简介和安装

windows下找到安装目录下的data下:postgresql.conf和pg.hba.conf配置文件;可以对pgsql的日志存储方式,端口,允许远程连接等进行配置;注意:postgresql默认的端口是5432,并且在linux下,不支持root用户管理,需要新建非root用户进行配置、连接和操作;注意:在安装过程中,遇到提示输入默认超级管理员postgres密码时,需要设置密码,否则默认账号postgres无法登录;1、PostgreSql是功能强大的,开源的关系型数据库,底层基于C语言实现;

2024-07-18 16:02:47 498

原创 Git入门

在外网环境下,可以使用GitHub或者Gitee作为代码托管中心,GitHub是国外的、已经搭建好的代码托管中心,Gitee是阿里的、国内的代码托管中心,相对来说,在国内,Gitee会比GitHub快一些;git init 本地仓库初始化 ,会生成隐藏的.git文件夹,使用ll -la查看,.git目录下的内容不要删除和修改。git commit -m "" 将暂存区的内容提交到本地仓库,-m写备注,后面“”的内容就是备注。公司A的用户A进行项目创建,并将代码push到公司A的远程仓库;

2024-07-17 08:46:12 296

原创 mysql 8新特性

(3)类似于使用partition by 代替group by,因为group by使用的时候有很多限制,比如select的时候,只能select group by的字段,如果要select更多字段,得在group by后面加;b、灰度发布:线上测试,加隐藏,仅针对测试,如果发现索引没问题也是有必要的,可以变成正式索引;(1)drop、create、alter等DDL语句同时操作多张表,如果有一个表报错了,5.7之前会执行成功的表,而8后则所有都不执行成功,保证原子性;(1)不会被优化器使用,不可见,

2024-07-16 21:33:29 525

原创 mysql锁-共享锁、排他锁和意向锁,记录锁、间隙锁和临键锁

MVCC:通过生成版本链,读取快照信息,解决事务并发的脏读、不可重复读、幻读问题,针对普通查询(未加锁的查询);step3:开启另外一个事务,对同一行数据加排他锁,一直在执行中,阻塞,说明加锁不成功;step2:开启另外一个事务,也对同一行数据加共享锁,执行成功,说明加锁成功;step1:开启一个事务,并对某行数据加共享锁,执行成功,说明加锁成功。按锁的模式分:共享锁、排他锁、意向锁、共享意向锁、共享排他锁。1、共享锁、排他锁、意向锁、共享意向锁、共享排他锁;按锁的算法分:记录锁、间隙锁、临键锁;

2024-07-15 11:57:43 852

原创 mysql索引优化

字段不一样,其中一个没索引,则索引失效;8、字符串加引号(不加的话,mysql会自动加上,相当于对索引列做了操作,索引列会失效)like "%abc" 索引失效,因为字符串排序,然后前面不确定,就会失效。2、尽量全值匹配(在联合索引中,where 后面的条件尽量和索引的所有列匹配);count(字段)遍历数据,判断null,为null的数据不返回,返回数据,累加。中间也有范围查询,后面也有范围查询,则后面的范围查询索引会失效。count(0)遍历数据,判断null,不返回数据,只累加。

2024-07-09 17:22:02 610

原创 mysql执行计划详解

const:针对当前select,精确查找,索引一次就命中数据,命中一条数据,select * from user where id=1;1、id:sql语句在经过查询优化器优化之后,有几个select,就会显示几个id。(7)key:真正使用到的索引,为null时,没使用索引,type一般是ALL;eq_ref: 针对当前select,走主键索引或唯一索引,只返回一条数据;ref:针对当前select,走主键索引或唯一索引,可能会返回多条数据;(6)possible_key:可能会使用到的索引。

2024-07-09 10:53:20 192

原创 mysql慢查询

取出全部的列(select * 当select *时,如果有某些字段没有加覆盖索引,则会在二级索引查不到字段的时候进行回表操作(回表增加磁盘IO,不满足第三颗星))slow_query_log_file DESKTOP-PLDRIF5-slow.log 慢查询日志文件(linux下的路径是完整路径)mysql记录了所有执行超过long_query_time这个参数设定的时间戳阈值的SQL语句。响应时间: 服务时间(sql处理时间) + 排队时间(等锁,等IO)一、造成慢查询的核心原因:数据量大。

2024-07-08 14:39:52 310

原创 mysql事务的ACID和事务隔离级别

事务A进行范围查询id>5,得到结果=4,此时事务B新增或删除一行数据,并提交事务;因为不可重复读主要发生在同一个事务对同一条数据(主要是被修改的数据)的多次查询结果不一致的问题,那么可以针对该条数据进行加锁,且加行锁即可。1、事务的概念:指的是一个操作序列,在操作序列中,多个操作要么全部执行成功,要么全部执行失败,是一个不可分割的逻辑工作单位。当事务A在同一个事务中,进行三次查询,就会出现第三次查询的结果和第一次查询的结果不一致的情况,称为不可重复读。将事务隔离级别设置为READ COMMITED;

2024-07-08 14:10:17 543

原创 mysql事务隔离实现原理MVCC

m_ids:表示在生成ReadView视图的时候,活跃的事务ID集合,所谓活跃,就是开启了事务,没提交的那些事务的id集合,一条数据,可以被多个会话开启多个事务,就会有多个ReadView;比如某条数据有3个事务同时对它进行修改,事务A的id是1,事务B的id是2,事务3的id是4,则m_ids=[1,2,3],而m_max_trx_id则等于4;m_max_trx_id: m_max_trx_id并不是m_ids中的最大值,而是在m_ids的最大值再递增一位,

2024-07-08 10:00:32 297

原创 mysql索引概念、分类及创建高性能索引

(2)B+Tree的数据结构中,叶子节点的页里面,存放的是索引的字段以及字段对应的主键id;(3)当遇到组合索引的时候,比如字段a,b,c三个字段索引,hash索引是将这三个字段进行hash,然后存储到hash表中,不能仅对a,b或者a,c或者b,c进行部分组合索引,除非再建a,b或者a,c或者b,c索引,加深复杂度。(2)索引列的选择,尽量选择重复率低的列来创建索引,比如id,userName这种,而不要选择gender,枚举类的字段做索引,意义相对不大,因为数据重复,过滤出来的数据依然是那么多。

2024-07-05 23:02:30 971

原创 Springboot、SpringCloud、SpringCloudAlibaba微服务架构环境搭建入门

一、构建Maven工程和pom文件。往下翻就能找到对应的版本啦~

2024-07-02 13:47:17 281

原创 Rabbitmq的延迟交换机exchange

那么在consumer进行消费的时候,消费的顺讯为m4,m3,m2,m1,当消费到m1时,发现m1已经过期很久了,由于前面还堵着m2,m3和m4,因此在m1过期时,并没有第一时间被发送到死信队列,由此可能产生的问题就是,假如当下订单未支付等待的时间到了,却并没有去查看支付结果或者取消订单;使用延迟交换机,即在交换机进行消息投递的时候,检查过期时间,如果还没到过期时间,就等待,不投递到queue里面去,而是等到过期时间到了,再投递,相当于在进入到队列之前进行时间上的排序;

2024-06-27 14:54:35 231

原创 Rabbitmq中的死信和死信队列

(2)消息过期,即消息的过期时间超过消息的TTL,这里分为两种情况,一种是在生产者发送消息时给当前者条消息设置生存时间,一种是在创建队列时,给队列设置所有存在该队列的消息设置生存时间;1、如果一个队列的消息达到了阈值,再发过来的消息会被删除,会造成消息的丢失,在保证消息可靠性上不友好,如果将消息发送到死信队列上,可以保证消息不丢失;2、死信会被重新交给死信交换机进行消息投递,绑定到死信交换机上的、被定义为死信的队列。3、死信交换机和死信队列与普通交换机和队列的区别仅仅 多了一个argument参数;

2024-06-27 12:21:10 152

原创 Rabbitmq消息可靠性

一、Rabbitmq生产者-----》交换机----》队列《-------消费者,这中间有几个地方存在因网络会服务器宕机原因导致消息丢失,如何保证消息可靠,至关重要!通过查看源码:setConfirmCallback需要传递一个ConfirmCallback对象实例,使用lamda表达式实现即可。CORRELATED: 与回调函数一起使用,实现异步消息确认。如何保证消息一定能从生产者发送到exchange,请参考。3、服务器重启,queue里面的消息不会丢失。4、消费者获取队列消息不会丢失(手动ack)

2024-06-26 12:21:35 238

原创 Springboot集成Rabbitmq,并实现三种通讯模式

3、topic模式下,两个队列绑定一个交换机,只有满足占位符和通配符规则的才会被路由。一、引入依赖包和配置文件。二、三种类型交换机实现。

2024-06-24 19:03:23 457

原创 RabbitMQ七种通讯模式

c、当Consumer从队列中获取消息后,需要给Rabbitmq一个ack确认标识,当Rabbitmq收到ack后,会认为消息已经成功被Consumer消费,否则会认为消费失败,会将消息交给下一个Consumer;a、从下图中可以看出,hello world模式和work queue模式的区别是一个生产者发送消息到queue后,hello world的consumer只有一个,而work queue的consumer有2个;b、默认情况下,队列会以轮询的方式将消息发送给不同的Consumer;

2024-06-23 23:50:41 100

原创 RabbitMQ系统结构

a、一个broker可以包含多个virtual host,可以理解为内部的虚拟机,每个virtual host之间是相互隔离的;a、建立连接,通过指定ip、端口、用户名、密码和virtual host,与broker建立连接;2、RabbitMQ整体逻辑架构说明,主要分为2大部分,server端和client端;整体的逻辑架构是什么?c、通过channel,可以实现新建queue、发送消息,接收消息等操作;b、通过创建的连接实例,获取channel通道;RabbitMQ处理和转发的是二进制数据块消息!

2024-06-23 23:49:46 88

原创 RabbitMQ安装及配置

此电脑右键-->属性-->高级系统设置-->环境变量-->选择系统变量-->选择Path-->编辑,直接在最后增加一行:erlang的安装地址 \bin,如:C:\Program Files\Erlang OTP\bin;1、由于RabbitMQ是基于erlang语言编写的,因此在安装时需要先安装erlang语言的环境,并且RabbitMQ的版本必须与支持的erlang语言版本匹配,否则安装不了;注意:安装RabbitMQ时,如果提示erlang版本不匹配,需要重新安装合适的erlang版本;

2024-06-23 23:48:00 422

原创 mysql高级-事务的隐式提交

当开启一个事务后,在没提交或回滚的情况下,执行了某些操作,会触发mysql的隐式提交(自动提交);另外再开启一个会话,设置自动提交,开启事务,执行DDL语句,也会触发前面一个会话的隐式提交;当一个会话设置自动提交=false,开启事务,执行update语句,不提交事务;-- 触发隐式提交的语句有很多,DBA级别才会关注更对。1、DDL语句(创建表、修改表、删除表等);二、哪些操作会触发隐式提交?2、在事务里面嵌套事务,如。load data这种。

2024-06-20 16:05:59 160

原创 mysql高级语法savepoint

当一个事务发生异常时,有时也不是需要把所有数据都回滚,假如只需要回滚部分数据,可以使用添加保持点,回滚的时候,根据保存点去回滚;insert into admin(id,name,age)value(2,'李四',30);insert into admin(id,name,age)value(3,'王五',40);insert into admin(id,name,age)value(1,'张三',20);2、语法:savepoint 指定保持点名称。

2024-06-20 16:01:27 201

原创 mysql事务及事务隔离级别

原因:因为不可重复读主要发生在同一个事务对同一条数据(主要是被修改的数据)的多次查询结果不一致的问题,那么可以针对该条数据进行加锁,且加行锁即可;解决了脏读和不可重复读,同时兼顾并发性能;1、事务的概念:指的是一个操作序列,在操作序列中,多个操作要么全部执行成功,要么全部执行失败,是一个不可分割的逻辑工作单位;当事务A在同一个事务中,进行三次查询,就会出现第三次查询的结果和第一次查询的结果不一致的情况,称为不可重复读。事务A进行范围查询id>5,得到结果=4,此时事务B新增或删除一行数据,并提交事务;

2024-06-20 12:47:17 342

原创 Redis高级数据类型

BitMaps类型:使用一位bit来存储某些特殊场景,比如某个用户的id是否存在于某个集合中,key=用户id,当用户存在时,value=1,当用户不存在时,value=0;(1)在Hash算法中,计算出HashCode后,对数组进行取余的时候,会存在多个元素对固定数组长度取余得到相同的偏移量(位置)从而导致原本不在数组中的元素被判定为存在数组中。String类型:计算机存储字符串类型,一般是一个字符2个字节(英文),一个字节8位bit,那么,一个英文字符是16位bit;优势:大大节约内存空间;

2024-06-20 10:58:54 340

原创 Redis持久化机制RDB和AOF

优点:哪怕redis发生故障导致没完成写也可以修复(最多也就丢失1秒钟的数据),write函数因为是创建新文件,执行完命令后再追加到旧文件,即使写新文件出错,也不会影响旧文件。缺点:快照需要时间,当子进行正在进行持久化时,如果有新的写入命令,可能会导致数据丢失,redis在进行子线程创建的时候也会阻塞主线程;二、AOF(append only file):先执行命令,把命令append到一个AOF的缓冲区,再调研write函数去将写命令 追加到文件。3、不是直接写文件,再追加文件,是先写到缓冲区。

2024-06-20 00:07:09 196

原创 Redis的内存淘汰策略和过期删除策略

2、如果不触发内存淘汰,则新接受的set命令会报错,抛异常导致服务不可用,但get和delete命令不影响;volatile-lru:针对设置了过期时间的key,最近没被访问的key进行淘汰(删除)volatile-lfu:针对设置了过期时间的,选择离过期时间最近的,淘汰;2、惰性删除,当key过期时,不删除,当再次get该key时,检查是否过期,如果过期,则删除。3、定期删除,定时对redis的key进行扫描,发现过期的key,进行删除。1、立即删除,当key到期,立即启动子线程进行删除,

2024-06-19 23:53:19 117

原创 Redis分布式缓存

因为:不延迟有可能线程B已经到查数据库那步,但已经查到旧数据,此时线程A第二次删除了,线程B又查询到了旧数据再更新缓存,则会导致不一致;(高并发情况下,此时线程A还未完成数据库更新操作,线程B查询到的数据是旧数据,将旧数据更新到了缓存)线程C查询缓存-----》取到线程B更新的旧的缓存数据,从而导致缓存数据和数据库数据不一致问题。线程B查询缓存 --- 》发现缓存为空 ---》线程B执行查询数据库,将查询结果更新到缓存。线程A执行删除缓存---》删除成功 -------》线程A执行更新数据库操作。

2024-04-29 14:35:59 272

原创 Redis布隆过滤器原理和实现

b、实现Hash算法:对setbit的value进行HashCode运算,得到一个哈希码,用hashCode对二进制数组的长度length进行取余,得到的余数就是value在数组中的偏移量(也是存储的位置)a、黑名单:通过key(用户id),通过Hash算法,能获取对用的偏移量的值是0还是1,能判断用户是否在集合中,从而达到过滤用户黑名单的效果;c、得到位置后,将该key对应的偏移量(位置)设置为1,其他位置的值默认为0,表示该key在集合中存在(1表示true,0表示false)

2024-04-29 14:17:00 788 2

原创 java NIO

java NIO入门

2022-06-10 11:25:39 282

原创 设计模式之工厂模式(简单工厂、工厂方法、抽象工厂)

使用工厂模式也属于创建型设计模式,即用来创建对象实例的,适用场景是,当需要创建对象时,一般是用new的方式去创建,也可以交给工厂去创建,使用时去找工厂要,因此:首先,工厂生产什么样的产品,即创建哪种类型的对象其次,创建一个工厂来生产这个对象的实例(也就是 产品)第三,需要对象实例的时候去找工厂生产,而不是自己new1、简单工厂:step1:定义产品:/** * * 产品类接口,即工厂要生产什么类的实例 */public interface Cup { void u

2021-12-19 14:21:22 438

原创 设计模式之单例模式

单例模式特点:属于创建型设计模式,即用来创建对象实例的,并且对象的实例是全局唯一的如何保证全局唯一?首先,确定需要保证全局唯一的是哪个类的对象实例其次,保证外部不能new该对象(私有化构造器)第三,提供外部访问该实例的方法,第四,保证在多线程并发的情况下,对象实例的唯一性第五,考虑系统效率问题,即实例的使用的时候才去加载(懒加载模式),当实例一直没被使用的情况下,不去实例化/** * 单例模式构建简单工厂,工厂只有一个 * */public class DesignDe

2021-12-19 13:54:36 191

原创 线程池创建及参数设置

一、创建线程池以及线程池的各种参数分析: //不指定最大线程数,默认是Int的最大值 ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(() -> { System.out.println("新建线程池对象,执行第一个默认线程"); }); executorService.shutdown(); //指定最大

2021-12-03 16:36:09 1529

原创 synchronized关键字

多线程问题应该是多个线程对方法里面用到的变量(全局变量和局部变量)的访问出现的问题使用synchronized关键字,可以修饰方法和代码块

2021-06-17 15:44:47 187

原创 java 多线程

多线程的实现方式:继承Thread类,实现Runable接口,实现Callable接口Thread才是代表一个线程,Runnable只是定义了run方法

2021-06-17 11:53:39 115

原创 Collection和Map源码心得

常见的java集合框架Collection接口,实现了Iterable接口,该接口定义了三个方法,分别是iterator,foreach和spliterator:

2021-06-09 18:30:55 55

空空如也

空空如也

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

TA关注的人

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