- 博客(23)
- 收藏
- 关注
原创 Spring Cloud 面试题
微服务是一种软件开发技术,它将应用程序构建为一组小的、独立的、松散耦合的服务,每个服务运行在自己的进程中,并且通过轻量级的通信机制(通常是 HTTP RESTful API)进行协作。这些服务围绕业务功能组织,每个服务都有自己的数据存储和业务逻辑,可以独立部署、扩展和更新。模块化:微服务架构将应用程序分解为小的、自治的模块,每个模块负责应用程序的一部分功能。独立性:每个微服务可以独立部署和扩展,不会影响到其他服务的运行。灵活性。
2024-05-19 19:10:29
746
原创 如何保证秒杀过程的公平性
5. 实时监控:实时监控系统的负载情况,如发现某个服务器负载过高,可以及时进行负载均衡,确保每个用户都有平等的机会参与秒杀。6. 结果公示:在秒杀结束后,及时公示抢购结果,包括成功购买的用户名单和未成功购买的用户名单,接受用户的监督和反馈。4. 抢购逻辑:在抢购过程中,采用公平的随机算法或排队机制来决定用户的购买顺序,而不是按照请求到达的顺序。1. 时间同步:确保所有参与秒杀的用户的时间是同步的,避免因为时间不同步导致的抢购先后顺序问题。
2024-01-05 11:05:09
370
原创 Spring Cloud渐进式
直接看什么是微服务?文章。《[Spring Cloud] Eureka 的自我保护模式及相关问题》Hystrix 断路器通过 HystrixCircuitBreaker 实现。CLOSED:关闭OPEN:打开HALF_OPEN:半开其中,断路器处于OPEN状态时,链路处于非健康状态,命令执行时,直接调用回退逻辑,跳过正常逻辑。HystrixCircuitBreaker 状态变迁如下图 :HystrixCircuitBreaker 状态红线:初始时,断路器处于CLOSED状态,链路处于健康状态。
2023-03-16 10:31:21
110
原创 精尽 JDK 源码解析 —— 集合(七)TreeSet
TreeSet ,基于 TreeSet 的 Set 实现类。在业务中,如果我们有排重+排序的需求,一般会考虑使用 TreeSet。不过,貌似很少会出现排重+排序的双重需求。
2023-03-15 09:59:12
114
原创 精尽 JDK 源码解析 —— 集合(六)TreeMap
在《精尽 JDK 源码解析 —— 集合(四)哈希表 LinkedHashMap》中,我们提到了两种有序Map 的选择。一种是 LinkedHashMap ,以前在该文进行了详细解析,而本文,我们开始 TreeMap 之旅,按照 key 的顺序的 Map 实现类。
2023-03-15 09:57:34
150
原创 精尽 JDK 源码解析 —— 集合(五)哈希集合 HashSet
HashSet ,基于 HashMap 的 Set 实现类。在业务中,如果我们有排重的需求,一般会考虑使用 HashSet。在 Redis 提供的 Set 数据结构,不考虑编码的情况下,它是基于 Redis 自身的 Hash 数据结构实现的。这点,JDK 和 Redis 是相同的。
2023-03-15 09:53:54
129
原创 精尽 JDK 源码解析 —— 集合(四)哈希表 LinkedHashMap
众所周知,HashMap 提供的访问,是无序的。而在一些业务场景下,我们希望能够提供有序访问的 HashMap。TreeMap :按照 key 的顺序。LinkedHashMap :按照 key 的插入和访问的顺序。LinkedHashMap ,在 HashMap 的基础之上,提供了顺序访问的特性。而这里的顺序,包括两种:按照 key-value 的插入顺序进行访问。关于这一点,相信大多数人都知道。按照 key-value 的访问顺序进行访问。通过这个特性,我们实现基于 LRU 算法的缓存。
2023-03-14 19:55:07
292
1
原创 精尽 JDK 源码解析 —— 集合(三)哈希表 HashMap
HashMap ,是一种散列表,用于存储 key-value 键值对的数据结构,一般翻译为“哈希表”,提供平均时间复杂度为 O(1) 的、基于 key 级别的 get/put 等操作。之前我们在分享《精尽 JDK 源码解析 —— 集合(一)数组 ArrayList》中提到过,“在前些年,实习或初级工程师的面试,可能最爱问的就是 ArrayList 和 LinkedList 的区别与使用场景”。现在已经改变成,HashMap 的实现原理是什么。
2023-03-14 19:46:55
131
原创 精尽 JDK 源码解析 —— 集合(二)链表 LinkedList
LinkedList ,基于节点实现的双向链表的 List ,每个节点都指向前一个和后一个节点从而形成链表。相比 ArrayList 来说,我们日常开发使用 LinkedList 相对比较少。打开 IDEA ,搜下项目中 LinkedList 后,会发现使用的少之又少。
2023-03-14 13:19:38
123
原创 精尽 JDK 源码解析 —— 集合(一)数组 ArrayList
ArrayList ,基于[]数组实现的,支持自动扩容的动态数组。相比数组来说,因为其支持自动扩容的特性,成为我们日常开发中,最常用的集合类,没有之一。在前些年,实习或初级工程师的面试,可能最爱问的就是 ArrayList 和 LinkedList 的区别与使用场景。不过貌似,现在问的已经不多了,因为现在信息非常发达,这种常规面试题已经无法区分能力了。当然即使如此,也不妨碍我们拿它开刀,毕竟是咱的“老朋友”。
2023-03-14 13:08:37
123
原创 精尽 Redisson 源码分析 —— 可靠分布式锁 RedLock
1、客户端 A 从 Redis Master 获得到锁anylock。2、在 Redis Master 同步anylock到 Redis Slave 之前,Master 挂了。3、Redis Slave 晋升为新的4、客户端 B 从新的Redis Master 获得到锁anylock。此时,客户端 A 和 B 同时持有anylock锁,已经失效。当然,这个情况是极小概率事件。主要看业务对分布式锁可靠性的诉求。
2023-03-14 13:01:39
401
原创 精尽 Redisson 源码分析 —— 可重入分布式锁 ReentrantLock
在 Redisson 中,提供了 8 种分布锁的实现,具体我们可以在《Redisson 文档 —— 分布式锁和同步器》中看到。绝大数情况下,我们使用可重入锁(Reentrant Lock)就够了,对应到就是类,具体的使用示例可以看看《芋道 Spring Boot Redis 入门》的「6.2 Redis 分布式锁」小节。在《精尽 Redis 面试题》的问题中,我们在聊到“如何使用 Redis 实现分布式锁?这个题目中,提到了需要考虑的 7 个方面,这里我们再来重复看下:1、正确的获得锁。
2023-03-14 11:11:59
494
1
原创 精尽 Redisson 源码分析 —— 限流器 RateLimiter
限流,无论在系统层面,还是在业务层面,使用都非常广泛。【业务】为了避免恶意的灌水机或者用户,限制每分钟至允许回复 10 个帖子。【系统】为了避免服务系统被大规模调用,超过极限,限制每个调用方只允许每秒调用 100 次。限流算法,常用的分成四种:每一种的概念,推荐看看《计数器、滑动窗口、漏桶、令牌算法比较和伪代码实现》文章。计数器比较简单,每固定单位一个计数器即可实现。滑动窗口Redisson 提供的是基于滑动窗口RateLimiter 的实现。相比计数器。
2023-03-14 11:03:57
2127
1
原创 精尽 Spring Boot 源码分析 —— SpringApplication
/ 处,使用注解,标明是 Spring Boot 应用。通过它,可以开启自动配置的功能。处,调用方法,启动 Spring Boot 应用。上述的代码,是我们使用 Spring Boot 时,最最最常用的代码。而本文,我们先来分析 Spring Boot 应用的启动过程。关于注解,我们会后面单独开文章,详细解析。
2023-03-14 10:32:59
85
原创 精尽 Spring Boot 源码分析 —— AutoConfigurationMetadataLoader
在 SpringApplication 中,我们可以看到方法中,加载自动配置类(AutoConfiguration)的元数据,是如下一段代码:/*** @return 获得 AutoConfigurationMetadata 对象*/// 不存在,则进行加载// 存在,则直接返回在内部,会调用方法,加载 AutoConfigurationMetadata 对象。
2023-03-14 10:28:15
119
原创 精尽 Spring Boot 面试题
所以,上面的缺点,严格来说可能不太适合在面试中回答。通过 Spring Boot ,我们开发者可以快速配置 Spring 项目,引入各种 Spring MVC、Spring Transaction、Spring AOP、MyBatis 等等框架,而无需不断重复编写繁重的 Spring 配置,降低了 Spring 的使用成本。当然,Spring Boot 只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean ,而 Spring Boot 没有提供支持,则可以自定义自动配置进行解决。
2019-11-07 20:09:24
1224
1
原创 [ERROR] Sorry! ionic serve can only be run in an Ionic project directory.
输入ionic serve[ERROR] Sorry! ionic serve can only be run in an Ionic project directory.解决方法:执行 npm install -g ionic@legacy
2019-06-19 11:53:54
4372
转载 String类为什么是final的
主要是为了”安全性“和”效率“的缘故,因为:1、由于String类不能被继承,所以就不会没修改,这就避免了因为继承引起的安全隐患;2、String类在程序中出现的频率比较高,如果为了避免安全隐患,在它每次出现时都用final来修饰,这无疑会降低程序的执行效率,所以干脆直接将其设为final一提高效率;转载:https://www.cnblogs.com/hellowhy/p/6536590....
2019-06-04 15:05:06
94
原创 'Periodic workspace save .' has encountered a problem
最近eclipse总是弹出一个窗口,内容是: ‘Periodic workspace save .’ has encountered a problem1、打开Windows–>Preferences–>General–>Startup and Shutdown将“RSE UI”的选中状态去掉,关闭Eclipse;2、打开Eclipse工作空间将“RemoteSystemsT...
2019-06-04 12:02:30
6069
1
原创 window node 安装
windows环境安装步骤:1.下载node(http://nodejs.cn/download)2.cnpm的安装 注释:大家都知道的啦,npm大多数都是外国的,安装时候会很慢,所以我呢就是用淘宝的镜像服务器。 安装命令:npm install -g cnpm --registry=https://registry.npm.taobao.org3.用cnpm安装vuecnpm i...
2019-06-04 11:50:33
145
转载 exist in什么情况下使用
1、当A表数据少,B表数据较大时应使用exist,因为它会B表数据全部遍历一次。如:A表有10000条记录,B表有1000000条记录,那么最多有可能遍历100001000000次,效率很差。再如:A表有10000条记录,B表有100条记录,那么最多有可能遍历10000100次,遍历次数大大减少,效率大大提升。2、当A表数据大,B表数据较少时适合使用in,因为in是在内存里遍历比较,而exist...
2019-06-04 11:43:46
1309
原创 window下启动redis报错:creating server tcp listening socket 127.0.0.1:6379: bind No error
window下启动redis报错:creating server tcp listening socket 127.0.0.1:6379: bind No error解决方案如下按顺序输入如下命令就可以连接成功redis-cli.exeshutdownexitredis-server.exe redis.windows.conf...
2019-05-16 14:35:28
551
Docker版本 18.1.1 (53328) for Mac不支持m1芯片
2023-03-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人