04 2021 档案
系统归类:第一章:技术专栏
摘要:技术类型专栏链接Redishttps://www.cnblogs.com/ysocean/tag/Redis%E8%AF%A6%E8%A7%A3/SpringCouldhttps://blog.csdn.net/forezp/article/details/70148833SpringBoothtt
阅读全文
模板引擎:第三章:使用Freemark做企业级SEO推广
摘要:为什么做SEO? 当公司项目已接近尾声时,这个时候就需要推广了,这个时候就需要SEO了,那SEO是什么呢?seo中文翻译是搜索引擎优化。它利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前
阅读全文
【Java面试】:第二章:P6级面试
摘要:Java集合比如说HashMap和ConcurrentHashMap我觉得,你最好在平时能去耐心读一下源码,搜一搜相关的博客, 最好能知道每个参数为什么设置成这么大?有什么好处?为什么?你会发现不少东西,网上也有很多视频可以去学。 JUC包,毫无疑问的,你得去学,哪怕你平时编程根本不去用,但是你得会
阅读全文
【JavaP6大纲】SpringCould篇:网关Zuul、Gateway、nginx的区别
摘要:zuul: 是Netflix的,早期在微服务中使用较广泛,是基于servlet实现的,阻塞式的api,不支持长连接。 只能同步,不支持异步。 不依赖spring-webflux,可以扩展至其他微服务框架。 内部没有实现限流、负载均衡,其负载均衡的实现是采用 Ribbon + Eureka 来实现本地
阅读全文
【JavaP6大纲】MySQL篇:分库分表之后,id 主键如何处理?
摘要:分库分表之后,id 主键如何处理? 基于数据库的实现方案 数据库自增 id:这个就是说你的系统里每次得到一个 id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个 id。拿到这个 id 之后再往对应的分库分表里去写入。 适合的场景:你分库分表就俩原因,要不就是单库并
阅读全文
【JavaP6大纲】MySQL篇:现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上?
摘要:现在有一个未分库分表的系统,未来要分库分表,如何设计才可以让系统从未分库分表动态切换到分库分表上? 停机迁移方案 我先给你说一个最 low 的方案,就是很简单,大家伙儿凌晨 12 点开始运维,网站或者 app 挂个公告,说 0 点到早上 6 点进行运维,无法访问。 接着到 0 点停机,系统停掉,没有
阅读全文
【JavaP6大纲】MySQL篇:为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分
摘要:为什么要分库分表(设计高并发系统的时候,数据库层面该如何设计)?用过哪些分库分表中间件?不同的分库分表中间件都有什么优点和缺点?你们具体是如何对数据库如何进行垂直拆分或水平拆分的? 为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?) 假如我们现在是一个小创业公司(或者是一个 BAT
阅读全文
【JavaP6大纲】MySQL篇:如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥?如何解决 MySQL 主从同步的延时问题?
摘要:如何实现 MySQL 的读写分离?MySQL 主从复制原理是啥?如何解决 MySQL 主从同步的延时问题? 如何实现 MySQL 的读写分离? 基于主从复制,一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去,数据读取走从库。 MySQL 主从复制原理是啥?如何解决
阅读全文
【JavaP6大纲】MySQL篇:主从问题
摘要:主从问题? 主从常见问题 主从备份不可靠,需要人经常去查看同步状态,一旦出现报错,需要及时人为的处理。 出现1236:[ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: ‘Cli
阅读全文
【JavaP6大纲】MySQL篇:如何优化SQL?
摘要:如何优化SQL? 应尽量避免全表扫描,首先要考虑在 where 及 order by 涉及的列上建立索引 避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 应尽量避免在where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描 应尽量
阅读全文
【JavaP6大纲】MySQL篇:SQL的整个解析、执行过程原理、SQL行转列?
摘要:SQL的整个解析、执行过程原理、SQL行转列? sql语句执行顺序 (8) SELECT (9)DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition>
阅读全文
【JavaP6大纲】分布式会话篇:集群部署时的分布式 Session 如何实现?
摘要:集群部署时的分布式 Session 如何实现? 1。tomcat + redis 2。spring session + redis (1)tomcat + redis 使用session的代码跟以前一样,还是基于tomcat原生的session支持即可,然后就是用一个叫做Tomcat RedisSe
阅读全文
【JavaP6大纲】SpringCould篇:Spring Cloud 和 Dubbo 有哪些区别?
摘要:Spring Cloud 和 Dubbo 有哪些区别? dubbo 是二进制传输,占用带宽会少一点。SpringCloud是http 传输,带宽会多一点,同时使用http协议一般会使用JSON报文,消耗会更大。 dubbo 开发难度较大,所依赖的 jar 包有很多问题大型工程无法解决。SpringC
阅读全文
【JavaP6大纲】SpringCould篇: Spring Boot 和 Spring Cloud,谈谈你对它们的理解?
摘要:Spring Boot 和 Spring Cloud,谈谈你对它们的理解? Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;spring boot使用了默认大于配置的
阅读全文
【JavaP6大纲】SpringCould篇:如何限流?在工作中是怎么做的?说一下具体的实现?
摘要:如何限流?在工作中是怎么做的?说一下具体的实现? 计数器:控制单位时间内的请求数量。缺陷:设每分钟请求数量为60个,每秒可以处理1个请求,用户在 00:59 发送 60 个请求,在 01:00 发送 60 个请求 此时2秒钟有120个请求(每秒60个请求),远远大于了每秒钟处理数量的阈值。 滑动窗口
阅读全文
【JavaP6大纲】SpringCould篇:熔断框架如何做技术选型?选用 Sentinel 还是 Hystrix?
摘要:熔断框架如何做技术选型?选用 Sentinel 还是 Hystrix? 功能SentinelHystrix隔离策略信号量隔离线程池隔离/信号量隔离熔断降级策略基于响应时间或失败比率基于失败比率实时指标实现滑动窗口滑动窗口(基于 RxJava)规则配置支持多种数据源支持多种数据源扩展性多个扩展点插件的
阅读全文
【JavaP6大纲】SpringCould篇:服务发现组件 Eureka 的主要调用过程?Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别?
摘要:服务发现组件 Eureka 的主要调用过程?Eureka 和 Zookeeper 都可以提供服务注册与发现的功能,它们有什么区别? 1、Eureka Server 启动成功,等待服务端注册。在启动过程中如果配置了集群,集群之间定时通过 Replicate 同步注册表,每个 Eureka Server
阅读全文
【JavaP6大纲】SpringCould篇:常用组件底层实现
摘要:常用组件底层实现? Eureka是微服务架构中的注册中心,专门负责服务的注册与发现。 服务中都有一个Eureka Client组件,这个组件专门负责将这个服务的信息注册到Eureka Server中。 Eureka Client告诉Eureka Server,自己在哪台机器上,监听着哪个端口。 而E
阅读全文
【JavaP6大纲】SpringCould篇:什么是微服务
摘要:什么是微服务? 单体架构的痛点 缺点一:项目过于臃肿当大大小小的功能模块都集中在同一项目的时候,整个项目必然会变得臃肿,让开发者难以维护。 缺点二:资源无法隔离,整个单体系统的各个功能模块都依赖于同样的数据库、内存等资源,一旦某个功能模块对资源使用不当,整个系统都会被拖垮。 缺点三:无法灵活扩展当系
阅读全文
【JavaP6大纲】Dubbo篇:为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗?
摘要:为什么要进行系统拆分?如何进行系统拆分?拆分后不用 Dubbo 可以吗? 为什么要将系统进行拆分? 要是不拆分,一个大系统几十万行代码,20 个人维护一份代码,简直是悲剧啊。代码经常改着改着就冲突了,各种代码冲突和合并要处理,非常耗费时间;经常我改动了我的代码,你调用了我的,导致你的代码也得重新测试
阅读全文
【JavaP6大纲】Dubbo篇:Dubbo 用到哪些设计模式?
摘要:Dubbo 用到哪些设计模式? Dubbo 框架在初始化和通信过程中使用了多种设计模式,可灵活控制类加载、权限控制等功能。 工厂模式 Provider 在 export 服务时,会调用 ServiceConfig 的 export 方法。ServiceConfig中有个字段: private sta
阅读全文
【JavaP6大纲】Dubbo篇:Dubbo SPI 和 Java SPI 区别?
摘要:Dubbo SPI 和 Java SPI 区别? spi 是啥?spi,简单来说,就是 service provider interface ,说白了是什么意思呢,比如你有个接口,现在这个接口有 3 个实现类,那么在系统运行的时候对这个接口到底选择哪个实现类呢?这就需要 spi 了,需要根据指定的配
阅读全文
【JavaP6大纲】Dubbo篇:Dubbo特性?
摘要:Dubbo特性? 透明远程调用:就像调用本地方法一样调用远程方法;只需简单配置,没有任何 API 侵入 负载均衡机制:Client 端 LB,可在内网替代 F5 等硬件负载均衡器 容错重试机制:服务 Mock 数据,重试次数、超时机制等 自动注册发现:注册中心基于接口名查询服务提 供者的 IP 地址
阅读全文
【JavaP6大纲】Dubbo篇:如何自己设计一个类似 Dubbo 的 RPC 框架?
摘要:如何自己设计一个类似 Dubbo 的 RPC 框架? 上来你的服务就得去注册中心注册吧,你是不是得有个注册中心,保留各个服务的信息,可以用 zookeeper 来做,对吧。 然后你的消费者需要去注册中心拿对应的服务信息吧,对吧,而且每个服务可能会存在于多台机器上。 接着你就该发起一次请求了,咋发起?
阅读全文
【JavaP6大纲】Dubbo篇:分布式服务接口请求的顺序性如何保证?
摘要:分布式服务接口请求的顺序性如何保证? 服务 A 调用服务 B,先插入再删除。好,结果俩请求过去了,落在不同机器上,可能插入请求因为某些原因执行慢了一些,导致删除请求先执行了,此时因为没数据所以啥效果也没有;结果这个时候插入请求过来了,好,数据插入进去了,那就尴尬了。本来应该是 “先插入 -> 再删除
阅读全文
【JavaP6大纲】Dubbo篇:如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试?
摘要:如何基于 Dubbo 进行服务治理、服务降级、失败重试以及超时重试? 服务治理 调用链路自动生成 一个大型的分布式系统,或者说是用现在流行的微服务架构来说吧,分布式系统由大量的服务组成。那么这些服务之间互相是如何调用的?调用链路是啥?说实话,几乎到后面没人搞的清楚了,因为服务实在太多了,可能几百个甚
阅读全文
【JavaP6大纲】Dubbo篇:Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢?
摘要:Dubbo 负载均衡策略和集群容错策略都有哪些?动态代理策略呢? 负载均衡: 1、Random LoadBalance,随机(默认的负载均衡策略)是加权随机算法的具体实现,可以完全随机,也可以按权重设置随机概率。 2、RoundRobin LoadBalance,轮循。可以轮询和加权轮询。存在响应慢
阅读全文
【JavaP6大纲】Dubbo篇:Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的?
摘要:Dubbo 支持哪些序列化协议?说一下 Hessian 的数据结构?PB 知道吗?为什么 PB 的效率是最高的? Dubbo协议:dubbo 缺省协议 采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况,不适合传送大数据量的服务,比如传文
阅读全文
【JavaP6大纲】MySQL篇:传播行为
摘要:传播行为? Spring支持7中事务传播行为 一个场景:假设外层方法里面包含二个新增用户和新增角色的方法,二个方法后面还会抛一个异常。 propagation_required(需要传播):当前没有事务则新建事务,有则加入当前事务。 外围方法未开启事务,插入用户表和用户角色表的方法在自己的事务中独立
阅读全文
【JavaP6大纲】Dubbo篇:Dubbo 的工作原理?注册中心挂了可以继续通信吗?
摘要:Dubbo 的工作原理?注册中心挂了可以继续通信吗? 第一步:provider 向注册中心去注册 第二步:consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务 第三步:consumer 调用 provider 第四步:consumer 和 provider 都异步通知
阅读全文
【JavaP6大纲】Java基础篇:CAS,ABA,volatile特性
摘要:CAS,ABA,volatile特性? CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。如果内存地址里面的值和A的值是一样的,那么就将内存里面的值更新成B。CAS是通过无限循环来获取数据的,若果在第一轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要自旋,到
阅读全文
【JavaP6大纲】Java基础篇:为什么jdk8以后HashMap会使用红黑树优化?
摘要:为什么jdk8以后HashMap会使用红黑树优化? 在Jdk1.8版本后,Java对HashMap做了改进,在链表长度超过8且数组长度大于64时,将后面的数据存在红黑树中,以加快检索速度。 为什么是使用红黑树而不是AVL树,AVL树是完全平衡二叉树阿? 在CurrentHashMap中是加锁了的,实
阅读全文
【JavaP6大纲】Java基础篇:HashMap为什么会发生并发修改异常?并发修改异常解决方案?
摘要:HashMap为什么会发生并发修改异常?并发修改异常解决方案? HashMap实际使用过程中会出现一些线程安全问题,在JDK1.7中,当并发执行扩容操作时会造成环形链和数据丢失的情况,开多个线程不断进行put操作,rehash的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会
阅读全文
【JavaP6大纲】Java基础篇:HashMap加载因子为什么是0.75?
摘要:HashMap加载因子为什么是0.75 如果加载因子比较大,扩容发生的频率比较低,浪费的空间比较小,发生hash冲突的几率比较大。比如,加载因子是1的时候,hashmap长度为128,实际存储元素的数量在64至128之间时间段比较多,这个时间段发生hash冲突比较多,造成数组中其中一条链表比较长,会
阅读全文
【JavaP6大纲】Java基础篇:HashMap扩容机制
摘要:HashMap扩容机制 将(k1,v1)直接放入Node类型的数组中,这个数组初始化容量是16,默认的加载因子是0.75,也就是当元素加到12的时候,底层会进行扩容,扩容为原来的2倍。 可能引发的问题: HashMap实际使用过程中会出现一些线程安全问题,在JDK1.7中,当并发执行扩容操作时会造成
阅读全文
【JavaP6大纲】Java基础篇:HashMap底层原理
摘要:HashMap底层原理? HashMap是Map的一个实现类,它是以键值对存储数据的,Key-Value都是Map.Entry中的属性。当我们向HashMap中存放一个元素(k1,v1),先根据k1的hashCode方法来决定在数组中存放的位置。如果这个位置没有其它元素,将(k1,v1)直接放入一个
阅读全文
【JavaP6大纲】Zookeeper篇:Zookeeper脑裂问题
摘要:Zookeeper脑裂问题? 当一个集群的不同部分在同一时间都认为自己是活动的时候,我们就可以将这个现象称为脑裂症状。通俗的说,就是比如当你的 cluster 里面有两个结点,它们都知道在这个 cluster 里需要选举出一个 master。那么当它们两之间的通信完全没有问题的时候,就会达成共识,选
阅读全文
【JavaP6大纲】Zookeeper篇:分布式锁
摘要:Zookeeper分布式锁? 客户端A要获取分布式锁的时候首先到locker下创建一个临时顺序节点(node_n),然后立即获取locker下的所有(一级)子节点。此时因为会有多个客户端同一时间争取锁,因此locker下的子节点数量就会大于1。对于顺序节点,特点是节点名称后面自动有一个数字编号,先创
阅读全文
【JavaP6大纲】Zookeeper篇:Zookeeper假死问题
摘要:Zookeeper假死问题? 假死:心跳出现超时可能是master挂了,但是也可能是master,zookeeper之间网络出现了问题,也同样可能导致。这种情况就是假死,master并未死掉,但是与ZooKeeper之间的网络出现问题导致Zookeeper认为其挂掉了然后通知其他节点进行切换,这样s
阅读全文
【JavaP6大纲】Zookeeper篇:选举机制
摘要:选举机制 领导者选举的过程实际上就是比较哪台服务器比较强,比较规则是:1. 谁的数据比较新谁当领导(zxid),2.数据都一样则看谁的服务器Id(myid)比较大,谁就是领导;这个过程是通过各个服务器之间相互投票来进行的,每台服务器会接收其他服务器的投票,在投票信息里就会包含上面说的两个信息zxid
阅读全文
【JavaP6大纲】Zookeeper篇:zookeeper工作原理
摘要:Zookeeper底层原理? zookeeper:Zookeeper会维护一个类似于标准的文件系统的具有层次关系的数据结构。这个文件系统中每个子目录项都被称为znode节点,这个znode节点也可以有子节点,每个节点都可以存储数据,客户端也可以对这些node节点进行getChildren,getDa
阅读全文
【JavaP6大纲】MySQL篇:索引数据结构
摘要:索引数据结构 B+树中间节点没有存储数据,叶节点存放数据,其余节点用来索引,所以同样大小的磁盘页可以容纳更多的节点元素,而B树是每个索引节点都会有Data域,所以B+树IO的次数更少。 B+树的数据保存,只有在叶子节点中才会有,而根节点只保存了索引,比如说根节点大小是16kb,一个索引大小是4b,如
阅读全文
【JavaP6大纲】MySQL篇:悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁,死锁
摘要:悲观锁、乐观锁、排它锁、共享锁、表级锁、行级锁,死锁? 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。适用于写为居多的场景下。比如行锁,表锁等,读锁,写锁,syncronized实现的锁等。sql中实现悲观锁,使用for
阅读全文
【JavaP6大纲】MySQL篇:四大属性底层实现原理?
摘要:四大属性底层实现原理? A(原子性): 要么全部完成,要么完全不起作用。底层实现原理:undo log(当这个事务对数据库进行修改的时候,innodb 生成对应 undo log,他会记录这个 SQL 执行的相关信息,如果 SQL 执行失败发生这个回滚,innodb 根据这个 undo log 内容
阅读全文
【JavaP6大纲】MySQL篇:数据库事务隔离级别
摘要:数据库事务隔离级别? 脏读: 一个事务a修改或添加了一条数据,在a事务提交之前,另一个事务b读到了这条数据,并进行了操作。a如果回滚的话,脏读可能会导致b操作不存在的数据。 不可重复读: 在一次事务中的两次相同条件的查询不一致,比如a事务执行select count(*) from user whe
阅读全文
【JavaP6大纲】分布式事务篇:可靠消息最终一致性方案
摘要:可靠消息最终一致性方案 基于 MQ 来实现事务。比如阿里的 RocketMQ 就支持消息事务。 大概的意思就是: A 系统先发送一个 prepared 消息到 mq,如果这个 prepared 消息发送失败那么就直接取消操作别执行了; 如果这个消息发送成功过了,那么接着执行本地事务,如果成功就告诉
阅读全文
【JavaP6大纲】分布式事务篇:最大努力通知
摘要:最大努力通知? 最大努力通知 其实我觉得本地消息表也可以算最大努力,事务消息也可以算最大努力。 就本地消息表来说会有后台任务定时去查看未完成的消息,然后去调用对应的服务,当一个消息多次调用都失败的时候可以记录下然后引入人工,或者直接舍弃。这其实算是最大努力了。 事务消息也是一样,当半消息被commi
阅读全文
【JavaP6大纲】分布式事务篇:MQ 事务消息
摘要:MQ 事务消息? MQ 事务消息 有一些第三方的MQ是支持事务消息的,比如RocketMQ,他们支持事务消息的方式也是类似于采用的二阶段提交,但是市面上一些主流的MQ都是不支持事务消息的,比如 RabbitMQ 和 Kafka 都不支持。 第一阶段Prepared消息,会拿到消息的地址。第二阶段执行
阅读全文
【JavaP6大纲】分布式事务篇:补偿事务(TCC)
摘要:补偿事务(TCC)? 补偿事务(TCC) 针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。它分为三个阶段: Try 阶段主要是对业务系统做检测及资源预留 Confirm 阶段主要是对业务系统做确认提交,Try阶段执行成功并开始执行 Confirm阶段时,默认 Confirm阶段是不会出错
阅读全文
【JavaP6大纲】分布式事务篇:三阶段提交(3PC)
摘要:三阶段提交(3PC)? 3PC 相比于 2PC 它在参与者中也引入了超时机制,并且新增了一个阶段使得参与者可以利用这一个阶段统一各自的状态,3PC 包含了三个阶段,分别是准备阶段、预提交阶段和提交阶段 准备阶段的变更成不会直接执行事务,而是会先去询问此时的参与者是否有条件接这个事务,因此不会一来就干
阅读全文
【JavaP6大纲】分布式事务篇:两阶段提交(2PC)
摘要:两阶段提交(2PC)? 两阶段提交(2PC) 第一阶段:协调者询问参与者事务是否执行成功,参与者发回事务执行结果。这一阶段的协调者有超时机制,假设因为网络原因没有收到某参与者的响应或某参与者挂了,那么超时后就会判断事务失败,向所有参与者发送回滚命令。 第二阶段:如果事务在每个参与者上都执行成功,事务
阅读全文
【JavaP6大纲】分布式事务篇:CAP理论
摘要:CAP理论? 分布式环境下(数据分布)要任何时刻保证数据一致性是不可能的,只能采取妥协的方案来保证数据最终一致性。这个也就是著名的CAP定理。 C一致性:对于指定的客户端来说,读操作保证能够返回最新的写操作结果。 A可用性:非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。 P分区容
阅读全文
【JavaP6大纲】分布式事务篇:BASE理论
摘要:BASE理论? BASE 理论是对 CAP 理论的延伸,核心思想是即使无法做到强一致性,但应用可以采用适合的方式达到最终一致性。 基本可用: 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性,即保证核心可用。电商大促时,为了应对访问量激增,部分用户可能会被引导到降级页面,服务层也可能只提供
阅读全文
【JavaP6大纲】功能设计篇:秒杀场景设计
摘要:秒杀场景设计 流量过滤: 本质上,参与秒杀的用户很多,但是商品的数量是有限的,真正能抢到的用户并不多,那么第一步就是要过滤掉大部分无效的流量。 活动开始前前端页面的Button置灰,防止活动未开始无效的点击产生流量。 前端添加验证码或者答题,防止瞬间产生超高的流量,可以很好的起到错峰的效果,现在的验
阅读全文
【JavaP6大纲】功能设计篇:库存超卖问题
摘要:库存超卖问题 针对秒杀建议选择下单扣库存的方式:首先查询redis缓存库存是否充足先扣库存再落订单数据,可以防止订单生成了没有库存的超卖问题扣库存的时候先扣数据库库存,再扣减redis库存,保证在同一个事务里,无论两者哪一个发生了异常都会回滚。有一个问题是可能redis扣成功了由于网络问题返回失败,
阅读全文
【JavaP6大纲】功能设计篇:金额篡改问题
摘要:金额篡改问题 案例:下订单时,拿到别人的URL,篡改数据(金额)发送给系统 方法一:对插入的操作进行校验:一个请求的URL传入进来,根据参数找到对应的用户关联表,查询到用户的userid和用户登录后保存到redis中的userid进行对比。例如:传入参数为(订单id)和(优惠券id),拿(订单id)
阅读全文
【JavaP6大纲】功能设计篇:单点登录
摘要:用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数 sso认证中心发现用户未登录,将用户引导至登录页面 用户输入用户名密码提交登录申请 sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌 sso认证中心带着令牌跳
阅读全文
【JavaP6大纲】功能设计篇:幂等性实现
摘要:幂等性实现 乐观锁:数据库:通过version或者时间戳防止其他操作并发更新,更新失败要有一定的重试机制。CAS比较与交换也是乐观锁。 去重表:在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。这种方法适用于在业务中有唯一标的插入场景中,比如在以上的支付场景中,如果一个订单只会
阅读全文
【JavaP6大纲】多线程篇:线程的生命周期,什么时候会出现孤儿进程,僵尸进程?它们之间的危害是什么?如何处理僵尸进程?
摘要:线程的生命周期,什么时候会出现孤儿进程,僵尸进程?它们之间的危害是什么?如何处理僵尸进程? 线程的生命周期 新建(new Thread):当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。例如:Thread t1=new Thread(); 就绪(runnable):调用Th
阅读全文
【JavaP6大纲】多线程篇:ThreadLocal 是什么?工作原理是什么?如何解决 Hash 冲突?内存泄露是怎么回事?为什么key 是弱引用?应用场景有哪些?
摘要:ThreadLocal 是什么?ThreadLocal 工作原理是什么?ThreadLocal 如何解决 Hash 冲突?ThreadLocal 的内存泄露是怎么回事?为什么 ThreadLocalMap 的 key 是弱引用?ThreadLocal 的应用场景有哪些? ThreadLocal 是什
阅读全文
【JavaP6大纲】多线程篇:CountDownLatch倒计时器,Semaphore信号灯,CyclicBarrier循环栅栏
摘要:JUC并发包 CountDownLatch倒计时器: 让一些线程阻塞直到另一些线程完成一系统操作后才被唤醒。一个 CountDownLatch 用给定的计数初始化。await() 方法阻塞,直到由于countDown() 方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的 awa
阅读全文
【JavaP6大纲】多线程篇:线程池如何合理的配置核心线程数?
摘要:对于CPU密集型任务,由于CPU密集型任务的性质,导致CPU的使用率很高,如果线程池中的核心线程数量过多,会增加上下文切换的次数,带来额外的开销。因此,考虑到CPU密集型任务因为某些原因而暂停,这个时候有额外的线程能确保CPU这个时刻不会浪费,还可以增加一个CPU上下文切换。一般情况下:线程池的核心
阅读全文
【JavaP6大纲】多线程篇:线程池拒绝策略?
摘要:第一种拒绝策略:AbortPolicy:超出最大线程数,直接抛出RejectedExecutionException异常阻止系统正常运行。可以感知到任务被拒绝了,于是你便可以根据业务逻辑选择重试或者放弃提交等策略。 第二种拒绝策略:该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,相
阅读全文
【JavaP6大纲】多线程篇:线程池七个核心参数
摘要:底层在创建线程池的时候有七个参数:核心线程数,同时执行的最大线程数,多余线程存活时间,单位时间秒,任务队列,默认线程工厂,拒绝策略 corePoolSize:核心线程数maximumPoolsize:同时执行的最大线程数keepAliveTime:多余线程存活时间,当前线程池数量超过核心线程数时,当
阅读全文
【JavaP6大纲】多线程篇:线程池实现原理
摘要:线程池实现原理 线程池就是控制运行的线程数量,处理过程中将任务放到队列,然后在线程创建后启动这些任务,如果线程数量超出了最大数量就排队等候,等其他线程执行完毕再从队列中取出任务执行。线程池相当于银行网点,常驻核心数相当于今日当值窗口,线程池能够同时执行的最大线程数相当于银行所有的窗口,任务队列相当于
阅读全文
【JavaP6大纲】Redis篇:如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?主从架构下的数据部分复制?
摘要:如何保证 Redis 高并发、高可用?Redis 的主从复制原理能介绍一下么?Redis 的哨兵原理能介绍一下么?主从架构下的数据部分复制? 考虑如何用 redis 来加多台机器,保证 redis 是高并发的,如何让 redis 保证自己不是挂掉以后就直接死掉了,即 redis 高可用? 高并发 单
阅读全文
【JavaP6大纲】Redis篇:布隆过滤器
摘要:布隆过滤器? 需求: ①、原本有10亿个号码,现在又来了10万个号码,要快速准确判断这10万个号码是否在10亿个号码库中? 解决办法一:将10亿个号码存入数据库中,进行数据库查询,准确性有了,但是速度会比较慢。 解决办法二:将10亿号码放入内存中,比如Redis缓存中,这里我们算一下占用内存大小:1
阅读全文
【JavaP6大纲】Redis篇:数据类型的底层数据结构sds?
摘要:数据类型的底层数据结构sds? 每次在Redis数据库中创建一个键值对时,至少会创建两个对象,一个是键对象,一个是值对象,而Redis中的每个对象都是由 redisObject对象,对象的属性有type类型,encoding编码,*ptr指向底层数据结构的指针,refcount引用计数,lru记录最
阅读全文
【JavaP6大纲】Redis篇:数据类型的应用场景?
摘要:数据类型的应用场景? 字符串string 可以通过set key value 实现单值缓存 可以通过setnx product:10001 true 实现分布式锁,返回1表示获取锁成功,返回0表示获取锁失败,这个值已经被设置过 可以通过incr acticle:readcount{文章id} 实现计
阅读全文
【JavaP6大纲】Redis篇:生产环境中的 Redis 是怎么部署的?
摘要:生产环境中的 Redis 是怎么部署的? Redis cluster,10 台机器,5 台机器部署了 Redis 主实例,另外 5 台机器部署了 Redis 的从实例,每个主实例挂了一个从实例,5 个节点对外提供读写服务,每个节点的读写高峰 QPS 可能可以达到每秒 5 万,5 台机器最多是 25
阅读全文
【JavaP6大纲】Redis篇:Redis 的并发竞争问题是什么?如何解决这个问题?
摘要:Redis 的并发竞争问题是什么?如何解决这个问题?了解 Redis 事务的 CAS 方案吗? 多客户端同时并发写一个 key,可能本来应该先到的数据后到了,导致数据版本错了;或者是多客户端同时获取一个 key,修改值之后再写回去,只要顺序错了,数据就错了。 CAS 类的乐观锁方案:某个时刻,多个系
阅读全文
【JavaP6大纲】Redis篇:redis集群工作原理,协议,分布式寻址算法
摘要:Redis 集群模式的工作原理能说一下么?集群元数据的维护:集中式、Gossip 协议?在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?如何动态增加和删除一个节点?Redis cluster 的高可用与主备切换原理? Redis 集群模式的工
阅读全文
【JavaP6大纲】Redis篇:redis持久化
摘要:Redis 的持久化有哪几种方式? 持久化主要是做灾难恢复、数据恢复,高可用。比如你 redis 整个挂了,然后 redis 就不可用了,我们要做的事情就是让 redis 变得可用,尽快变得可用。重启 redis,尽快让它堆外提供服务,如果没做数据备份,这时候 redis 启动了,也不可用啊,数据都
阅读全文
【JavaP6大纲】Redis篇:redis单线程模型
摘要:你是如何理解redis单线程模型的? Redis 里面的单线程主要是 Redis 的网络 IO 和键值对读写,它是由一个线程来完成的,但是 Redis 的其他功能,比如说持久化、异步删除、集群数据同步等等,这些其实是由额外的线程执行的,这里的单线程主要是Redis 对外提供键值存储服务来说的。 主要
阅读全文