摘要: 如果主库挂了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。 这就涉及到三个问题: 主库真的挂了吗? 该选择哪个从库作为主库? 怎么把新主库的相关信息通知给从库和客户端呢? 这就要提到哨兵机制了。在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了 阅读全文
posted @ 2023-04-01 03:29 国见比吕 阅读(400) 评论(0) 推荐(0) 编辑
摘要: 我们学习了 AOF 和 RDB,如果 Redis 发生了宕机,它们可以分别通过回放日志和重新读入 RDB 文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。不过,即使用了这两种方法,也依然存在服务不可用的问题。比如说,我们在实际使用时只运行了一个 Redis 实例,那么,如果这个实例宕机了,它 阅读全文
posted @ 2021-07-06 10:43 国见比吕 阅读(2870) 评论(4) 推荐(1) 编辑
摘要: redis是一个内存数据库,一旦服务器宕机,内存中的数据将全部丢失。所以,对 Redis 来说,实现数据的持久化,避免从后端数据库中进行恢复,是至关重要的。 目前,Redis 的持久化主要有两大机制,即 AOF(Append Only File)日志和 RDB 快照。 一、AOF日志的实现 我们知道 阅读全文
posted @ 2021-06-15 16:08 国见比吕 阅读(934) 评论(0) 推荐(1) 编辑
摘要: 一、正确使用redis 数据类型 我们先了解下 String 类型的内存空间消耗问题,以及选择节省内存开销的数据类型的解决方案。例如一个图片存储系统,要求这个系统能快速地记录图片 ID 和图片在存储系统中保存时的 ID(可以直接叫作图片存储对象 ID)。同时,还要能够根据图片 ID 快速查找到图片存 阅读全文
posted @ 2021-06-08 16:51 国见比吕 阅读(882) 评论(2) 推荐(1) 编辑
摘要: 一、背景 我们工作中经常打交道的就是索引,那么到底什么是索引呢?例如,当一个SQL查询比较慢的时候,你可能会说给“某个字段加个索引吧”之类的解决方案。 总的来说索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本上千页页的英语字典,如果你想快速找到其中的某一个单词,在不借助目录的情况下, 阅读全文
posted @ 2020-05-17 12:09 国见比吕 阅读(1603) 评论(1) 推荐(1) 编辑
摘要: 一、背景 MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。数据库锁的设计的初衷是处理并发问题。我们知道多用户共享资源的时候,就有可能会出现并发访问的时候,数据库就需要合理的控制资源的访问规则,因此,锁就应运而生了,它主要用来实现这些访问规则的重要数据结构。 二、全局锁 顾名思义,全局锁就是对 阅读全文
posted @ 2020-03-07 22:38 国见比吕 阅读(1377) 评论(3) 推荐(2) 编辑
摘要: 背景 当你手中抓住一件东西不放时,你只能拥有一件东西,如果你肯放手,你就有机会选择更多。与其在别人的生活里跑龙套,不如精彩做自己。人无所舍,必无所成。跌倒了,失去了,不要紧,爬起来继续风雨兼程,且歌且行。 一、概念 事务到底是什么东西呢?想必大家学习的时候也是对事务的概念很模糊的。接下来通过一个经典 阅读全文
posted @ 2019-08-12 01:16 国见比吕 阅读(2459) 评论(3) 推荐(2) 编辑
摘要: 一、背景 当你手中抓住一件东西不放时,你只能拥有一件东西,如果你肯放手,你就有机会选择更多。与其在别人的生活里跑龙套,不如精彩做自己。人无所舍,必无所成。跌倒了,失去了,不要紧,爬起来继续风雨兼程,且歌且行。 为什么我们需要先学习MYSQL的基础架构先呢? 原因很简单,当我们需要了解一件事物的时候, 阅读全文
posted @ 2019-08-08 23:37 国见比吕 阅读(2876) 评论(1) 推荐(4) 编辑
摘要: 1.ScheduledThreadPoolExecutor 整体结构剖析。 1.1类图介绍 根据上面类图图可以看到Executor其实是一个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池实例。可以看到ScheduledThreadPoolExecutor 继承了 ThreadPoolE 阅读全文
posted @ 2019-06-16 12:18 国见比吕 阅读(1917) 评论(3) 推荐(2) 编辑
摘要: 1.线程池的作用 一方面当执行大量异步任务时候线程池能够提供较好的性能,在不使用线程池的时候,每当需要执行异步任务时候是直接 new 一线程进行运行,而线程的创建和销毁是需要开销的。使用线程池时候,线程池里面的线程是可复用的,不会每次执行异步任务时候都重新创建和销毁线程。 另一方面线程池提供了一种资 阅读全文
posted @ 2019-05-26 21:10 国见比吕 阅读(11241) 评论(7) 推荐(6) 编辑
摘要: 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap。 HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次锁住整张表让线程独占,相当 阅读全文
posted @ 2018-08-15 15:43 国见比吕 阅读(31212) 评论(2) 推荐(8) 编辑
摘要: 一、HashMap概述 HashMap是基于哈希表的Map接口实现,此实现提供所有可选的映射操作,并允许使用null值和null键。HashMap与HashTable的作用大致相同,但是它不是线程安全的。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 遍历HashMap的时间复杂度与其的容量( 阅读全文
posted @ 2018-08-13 21:44 国见比吕 阅读(2259) 评论(0) 推荐(3) 编辑
摘要: 一.JVM 类加载器: 一个类在使用前,如何通过类调用静态字段,静态方法,或者new一个实例对象,第一步就是需要类加载,然后是连接和初始化,最后才能使用。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Prepa 阅读全文
posted @ 2018-08-06 18:36 国见比吕 阅读(1996) 评论(0) 推荐(0) 编辑
摘要: 一.垃圾回收器配置和 GC 日志分析 1.堆典型配置: 32位的操作系统限制堆大小介于1.5G到2G,64位操作系统无限制,同时系统可用虚拟内存和可用物理内存都会限制最大堆的配置。 堆空间分配典型配置: 1.-Xms:初始堆大小 2.-Xmx:最大堆大小 3.-XX:NewSize=n:设置年轻代大 阅读全文
posted @ 2018-08-05 15:26 国见比吕 阅读(2987) 评论(0) 推荐(0) 编辑
摘要: 使用 ThreadLocal 不当可能会导致内存泄露,是什么原因导致的内存泄漏呢? 我们首先看一个例子,代码如下: 代码(1)创建了一个核心线程数和最大线程数为 6 的线程池,这个保证了线程池里面随时都有 6 个线程在运行。 代码(2)创建了一个 ThreadLocal 的变量,泛型参数为 Loca 阅读全文
posted @ 2018-07-14 23:21 国见比吕 阅读(3054) 评论(3) 推荐(0) 编辑
摘要: FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线 阅读全文
posted @ 2018-07-13 17:32 国见比吕 阅读(1160) 评论(0) 推荐(0) 编辑
摘要: SimpleDateFormat 是 Java 提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个 SimpleDateFormat 实例对日期进行解析或者格式化会导致程序出错,本节就讨论下它为何是线程不安全的,以及如何避免。 为了复现上面所说的不 阅读全文
posted @ 2018-07-12 16:14 国见比吕 阅读(1822) 评论(5) 推荐(3) 编辑
摘要: timer在JDK里面,是很早的一个API了。具有延时的,并具有周期性的任务,在newScheduledThreadPool出来之前我们一般会用Timer和TimerTask来做,但是Timer存在一些缺陷,为什么这么说呢? Timer只创建唯一的线程来执行所有Timer任务。如果一个timer任务 阅读全文
posted @ 2018-07-12 01:47 国见比吕 阅读(1290) 评论(0) 推荐(1) 编辑
摘要: JUC 中 Semaphore 的使用与原理分析,Semaphore 也是 Java 中的一个同步器,与 CountDownLatch 和 CycleBarrier 不同在于它内部的计数器是递增的,那么,Semaphore 的内部实现是怎样的呢? Semaphore 信号量也是Java 中一个同步容 阅读全文
posted @ 2018-07-08 17:23 国见比吕 阅读(991) 评论(0) 推荐(1) 编辑
摘要: JUC 中 回环屏障 CyclicBarrier 的使用与分析,它也可以实现像 CountDownLatch 一样让一组线程全部到达一个状态后再全部同时执行,但是 CyclicBarrier 可以被复用。那么 CyclicBarrier 内部的实现与 CountDownLatch 有何不同那? Co 阅读全文
posted @ 2018-07-07 22:10 国见比吕 阅读(606) 评论(0) 推荐(0) 编辑