自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JVM(一)--JVM的内存区域划分以及相关知识点

JVM(一)–JVM的内存区域划分以及相关知识点一、JVM的内存区域是怎么划分的?JVM结构图JVM = 类加载器 + 执行引擎 + 运行时数据区类加载器(Class Loader):把硬盘上的class文件加载到JVM中的运行时数据区域,它不负责这个类文件是否能够执行执行引擎(Execution Engine):负责这个类文件是否能够执行。执行字节码,或者执行执行本地方法运行时数据区:JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;有些区域会抛出OOM异常,有些

2020-06-30 21:46:25 984

原创 剑指--二叉搜索树的后序遍历序列

剑指–二叉搜索树的后序遍历序列1,题目:2,思路:方法一:递归分治:解题思路:后序遍历定义: [ 左子树 | 右子树 | 根节点 ] ,即遍历顺序为 “左、右、根” 。二叉搜索树定义: 左子树中所有节点的值 < 根节点的值;右子树中所有节点的值 > 根节点的值;其左、右子树也分别为二叉搜索树。递归解析:1.终止条件: 当 i≥j ,说明此子树节点数量 ≤1 ,无需判别正确性,因此直接返回 true ;2.递推工作:3.划分左右子树: 遍历后序遍历的 [i,j] 区间

2020-06-30 12:13:34 135

原创 剑指--从上到下打印二叉树 III

剑指–从上到下打印二叉树 III1,题目:2,思路:层次遍历+双端队列:层数,根据层数不同,插入方式不同利用双端队列的两端皆可添加元素的特性,设打印列表(双端队列) tmp ,并规定:1.奇数层 则添加至 tmp 尾部 ,2.偶数层 则添加至 tmp 头部 。算法流程:1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果空列表 res ,包含根节点的双端队列 deque ;3.BFS 循环: 当 deque 为空时跳出;4.新建列表 tmp ,用

2020-06-30 10:26:46 92

原创 剑指--用两个栈实现队列

剑指–用两个栈实现队列1,题目:2,思路:方法一:双栈写法一:解题思路:1.栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。2.双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3] 和空栈 B = []。若循环执行 A 元素出栈并添加入栈 B ,直到栈 A 为空,则 A = [] , B = [3,2,1] ,即 栈 B 元素实现栈 A 元素倒序 。3.利用栈 B删除队首元素: 倒序后,B 执行出栈则相当于删除了 A 的栈底元素,即对应队首元

2020-06-29 21:33:53 191

原创 有关Set集合的一些

Set集合的底层实现①Set是一个接口,集成2于Collection,在Set集合内无法存储重复的元素, 不可重复(用equals()判断),并且是无序的。Set常用实现类有HashSet、LinkedHashSet、TreeSet②HashSet是哈希表实现的(不稳定),LinkedHashSet是链表实现的(按存储顺序存取),TreeSet是红黑树实现的(按排序顺序存取),通常我们称Set为单列集合。刚才HashSet为什么是不稳定的?因为HashSet的内部是采用hashmap的结构实现的,因为

2020-06-29 16:53:46 720

原创 comparable和comparator之间的区别

comparable和comparator之间的区别Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较、排序。下面分别对Comparable 和 Comparator做具体介绍并总结。Comparable:Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较,则依赖compareTo方法的实现。如果add进入一个

2020-06-29 16:24:21 327

原创 关于linkedhashmap的一些

关于linkedhashmap的一些这篇博客包括的内容如下:1,LinkedHashMap,了解其 数据结构,以及LRU算法:2,LinkedHashMap与PriorityQueue的区别?1,LinkedHashMap,了解其 数据结构,以及LRU算法:LinkedHashMap=HashMap+双向链表。LinkedHashMap在不对HashMap被任何修改的情况下,给HashMap的任意两个节点间加上连线(before指针和after指针),使这些节点形成一个双向链表。Linked

2020-06-28 21:43:57 85

原创 leetcode(Tree)--路径总和 III

leetcode(Tree)–路径总和 III1,题目:2,思路:方法一:迭代法:以当前节点作为头结点的路径数量以当前节点的左孩子作为头结点的路径数量以当前节点的右孩子作为头结点啊路径数量方法二:用hashmap:前缀和的递归回溯思路:从当前节点反推到根节点(反推比较好理解,正向其实也只有一条),有且仅有一条路径,因为这是一棵树如果此前有和为currSum-target,而当前的和又为currSum,两者的差就肯定为target了所以前缀和对于当前路径来说是唯一的,

2020-06-28 20:35:17 147

原创 leetcode(Tree)--检查平衡性

leetcode(Tree)–检查平衡性1,题目:2,思路:方法一:后续遍历(递归):方法二:递归的另一种写法:3,代码:方法一:后续遍历(递归):class Solution { //后序遍历 boolean flag = true; public boolean isBalanced(TreeNode root) { dfs(root); return flag; } public int dfs(TreeNode r

2020-06-27 18:33:16 139

原创 剑指--包含min函数的栈

剑指–包含min函数的栈1,题目:2,思路:1.push(x) 函数: 重点为保持栈 B 的元素是 非严格降序 的。2.将 x 压入栈 A (即 A.add(x) );3.若 ① 栈 B 为空 或 ② x 小于等于 栈 B 的栈顶元素,则将 x压入栈 B(即 B.add(x) )。4.pop() 函数: 重点为保持栈 A,B 的 元素一致性 。5.执行栈 A 出栈(即 A.pop() ),将出栈元素记为 y ;6.若 y 等于栈 B 的栈顶元素,则执行栈 B 出栈(即 B.pop() )

2020-06-26 18:41:54 132

原创 剑指--从上到下打印二叉树

剑指–从上到下打印二叉树这个题目和这个题目是很相似的,现在附上那个链接:剑指–从上到下打印二叉树 II以上这个链接的题目呢,也是打印树,就是这个一层单独放到一个数组中,最后在统一放到一个结果数组中。。1,题目:2,思路:层序遍历(用队列):(自己写的)算法流程:1.特例处理: 当树的根节点为空,则直接返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 queue 为空时跳出;4.出队: 队

2020-06-26 18:17:36 112

原创 剑指--从上到下打印二叉树 II

剑指–从上到下打印二叉树 II1,题目:2,思路:I. 按层打印: 题目要求的二叉树的 从上至下 打印(即按层打印),又称为二叉树的 广度优先搜索(BFS)。BFS 通常借助 队列 的先入先出特性来实现。II. 每层打印到一行: 将本层全部节点打印到一行,并将下一层全部节点加入队列,以此类推,即可分为多行打印。1.特例处理: 当根节点为空,则返回空列表 [] ;2.初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;3.BFS 循环: 当队列 qu

2020-06-26 17:33:09 149

原创 剑指--二叉树的最近公共祖先

剑指–二叉树的最近公共祖先都是寻找最近公共祖先,为什么这两道题是不一样的啊。这里附上另外一道题:剑指–二叉搜索树的最近公共祖先因为这道题是:二叉搜索树的最近公共祖先(也就是这棵树的左节点的值<root的值<右节点的值,所以这棵树寻找最近公祖先是比较简单的)。但是现在这道题的这棵树的值是没有规律的,所以寻找最近祖先是稍微麻烦点。1,题目:2,思路:方法一:递归写法1.根据以上定义,若 root 是 p,q 的 最近公共祖先 ,则只可能为以下情况之一:2.p 和 q 在 root

2020-06-26 16:45:39 199

原创 关于concurrenthashmap的一些

关于concurrenthashmap的一些1,concurrenthashmap的实现原理:ConcurrentHashMap从JDK1.5开始随java.util.concurrent包一起引入JDK中,主要为了解决HashMap线程不安全和Hashtable效率不高的问题。众所周知,HashMap在多线程编程中是线程不安全的,而Hashtable由于使用了synchronized修饰方法而导致执行效率不高;因此,在concurrent包中,实现了ConcurrentHashMap以使在多线程编程中

2020-06-26 12:16:22 92

原创 剑指--二叉搜索树的最近公共祖先

剑指–二叉搜索树的最近公共祖先1,题目:2,思路:方法一:迭代:根据以上定义,若 rootroot 是 p,qp,q 的 最近公共祖先 ,则只可能为以下情况之一:1.p 和 q 在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中);2.p=root,且 q 在 root的左或右子树中;3.q=root,且 p 在 root 的左或右子树中;方法一:迭代1.循环搜索: 当节点 root为空时跳出;2.当 p,q 都在 root 的 右子树 中,则遍历至 ro

2020-06-25 13:29:19 163

原创 剑指--二叉搜索树的第k大节点

剑指–二叉搜索树的第k大节点1,题目:2,思路:方法一:中序遍历后续+提前返回:中序遍历倒序 + 提前返回1.为求第 kk 个节点,需要实现以下 三项工作 :2.递归遍历时计数,统计当前节点的序号;3.递归到第 k 个节点时,应记录结果 res ;4.记录结果后,后续的遍历即失去意义,应提前终止(即返回)。递归解析:1.终止条件: 当节点 root 为空(越过叶节点),则直接返回;2.递归右子树: 即dfs(root.right) ;3.三项工作:4.提前返回: 若 k

2020-06-25 11:24:53 152

原创 剑指--平衡二叉树

剑指–平衡二叉树1,题目:2,思路:方法一:后序遍历+剪枝操作:后序遍历+剪枝操作:此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1。dfs:1.返回值:2.当节点root 左 / 右子树的深度差 ≤1 :则返回当前子树的深度,即节点 root 的左 / 右子树的深度最大值 +1 ( max(left, right) + 1 );3.当节点root 左 / 右子树的深度差 >2 :则返回 -1,代表 此子树不是平衡树 。4.终止条件:5.当 root 为空

2020-06-24 13:26:57 133

原创 剑指--两个链表的第一个公共节点

剑指–两个链表的第一个公共节点1,题目:2,思路:方法一:两次遍历:1.考虑有公共节点的两个链表的特点:其结构看起来像一个倒下的Y,从第一个公共节点开始,之后它们所有的节点都是重合的,不可能再出现分叉。只是Y两端不重合的部分可能长度不同,我们可以采取以下方法来获得公共节点:2.首先遍历两个链表得到它们的长度,就能知道哪个链表比较长,以及长的链表比短的链表多几个节点。3.在第二次遍历的时候,在较长的链表上先走若干步,接着同时在两个链表上遍历,找到的第一个相同的节点就是它们的第一个公共节点

2020-06-24 11:23:02 126

原创 剑指--反转链表

剑指–反转链表1,题目:2,思路:方法一:双指针:1.我们可以申请两个指针,第一个指针叫 pre,最初是指向 null 的。2.第二个指针 cur 指向 head,然后不断遍历 cur。3.每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。4.都迭代完了(cur 变成 null 了),pre 就是最后一个节点了。下面是对应的图解:3,代码:方法一:双指针:class Solution { public ListNode reve

2020-06-24 10:51:07 95

原创 剑指--从尾到头打印链表

剑指–从尾到头打印链表1,题目:2,思路:方法一:普通方法(自己写的):先计算出链表的长度tmp重新指向开头节点从头到尾的链表的节点值从数组的最后开始往前放置方法二:栈:1.创建一个栈,用于存储链表的节点2.创建一个指针,初始时指向链表的头节点3.当指针指向的元素非空时,重复下列操作:4.将指针指向的节点压入栈内5.将指针移到当前节点的下一个节点6.获得栈的大小 size,创建一个数组 print,其大小为 size7.创建下标并初始化 index = 08.重复 si

2020-06-23 22:10:18 102

原创 剑指--链表中倒数第k个节点

剑指–链表中倒数第k个节点1,题目:2,思路:方法一:双指针:算法流程:1.初始化: 前指针 former 、后指针 latter ,双指针都指向头节点 head​ 。2.构建双指针距离: 前指针 former 先向前走 k 步(结束后,双指针 former 和 latter 间相距 k 步)。3.双指针共同移动: 循环中,双指针 former 和 latter 每轮都向前走一步,直至 former 走过链表 尾节点 时跳出(跳出后, latter 与尾节点距离为 k-1,即 latter

2020-06-23 21:51:05 92

原创 剑指--二叉树的镜像

剑指–二叉树的镜像1,题目:2,思路:方法一:递归:递归解析:1.终止条件: 当节点 root 为空时(即越过叶节点),则返回 null ;2.开启递归 右子节点 mirrorTree(root.right) ,并将返回值作为 root 的 左子节点 。3.开启递归 左子节点 mirrorTree(root.left) ,并将返回值作为 root 的 右子节点 。4.返回值: 返回当前节点 root;方法二:辅助栈(或队列)算法流程:1.特例处理: 当 root 为空时,直接返

2020-06-23 21:25:02 91

原创 Redis(十一)--关于redis的一些常见问题(2)

Redis(十一)–关于redis的一些常见问题(2)这篇博士的内容主要包括:1,watch命令和基于cas乐观锁2,什么是缓存和数据库双写不一致,怎么解决?3,关于持久化:几个链接:1,watch命令和基于cas乐观锁Redis 通过MULTI 、EXEC、WATCH等命令来实现事物功能。事物提供了一种将多个命令请求打包,然后一次性、按顺序的执行多个命令的机制,并且在事物执行期间,服务器不会中断事物而去执行其他客户端的命令请求,它会将事物中所有的命令都执行完毕。Redis事物不支持回滚操

2020-06-23 18:53:11 239

原创 Redis(十)--关于redis的一些常见问题

Redis(十)–关于redis的一些常见问题1,redis的线程模型是什么?Redis确实是单进程单线程的模型,因为Redis完全是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章的采用单线程的方案了(毕竟采用多线程会有很多麻烦)==>Redis是单线程的,为什么还能这么快吗?第一:Redis完全基于内存,绝大部分请求是纯粹的内存操作,非常迅速,数据存在内存中,类似于HashMap,Ha

2020-06-23 13:00:58 785

原创 剑指--合并两个排序的链表

剑指–合并两个排序的链表1,题目:2,思路:方法一:引入伪头结点(思路还是正常思路)引入伪头节点: 由于初始状态合并链表中无节点,因此循环第一轮时无法将节点添加到合并链表中。解决方案:初始化一个辅助节点 dum 作为合并链表的伪头节点,将各节点添加至 dum 之后。算法流程:1.初始化: 伪头节点 dum ,节点 cur 指向 dum。2.循环合并: 当l1或l2为空时跳出;当l1.val<l2.val 时: cur 的后继节点指定为 l1,并l1向前走一步;当 l

2020-06-22 21:05:01 131

原创 Redis(九)--Redis集群

Redis(九)–Redis集群一、什么是Redis集群Redis 集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis 实现, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset)。Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)。Redis 集群提供了一种运行 Redis 的方式,其中数据在多个 Redis 节

2020-06-22 19:09:20 395

原创 Redis(八)--Redis哨兵模式

Redis(八)–Redis哨兵模式这篇博客主要内容包括:一、哨兵模式二、 Redis Sentinel 架构三、安装与配置:3.1 配置开启主从节点3.2 配置开启sentinel监控主节点(sentinel是特殊的redis)四、java客户端五、三个定时任务六、主观下线和客观下线七、领导者选举八、故障转移九、哨兵(Sentinel)总结一道题: 哨兵们是怎么感知整个系统中的所有节点(主节点/从节点/哨兵节点)的?一、哨兵模式:

2020-06-21 22:24:34 316

原创 剑指--删除链表的节点

剑指–删除链表的节点这个和leetcode的237题思路是一样的,都是删除节点。但是写法不一样,因为给的参数不一样,所以写法是不一样的,但是实质是一样的。这里把leetcoe的237题放上,以作对比:leetcode237题:leetcode的237题的删除节点1,题目:2,思路:方法一:双指针:思路:1.定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。2,修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pr

2020-06-21 18:52:52 139

原创 Redis(七)--Redis的复制原理

Redis(七)–Redis的复制原理这篇博客主要包括的内容:1.关于复制:复制是什么?能干嘛?怎么用?复制的缺点2.主从复制:概述面临的问题解决方法什么是主从复制主从复制的作用主从复制的启用主从复制的原理3.全量复制与部分复制4.主从复制常见问题:配置不一致规避全量复制规避复制风暴5.redis的同步机制了解吗?6.读写分离模型了解吗?一、关于复制?1.复制是什么?行话:也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到

2020-06-21 18:02:40 285

原创 剑指--二叉树的深度

剑指–二叉树的深度1,题目:2,思路:方法一:后序遍历(DFS):关键点: 此树的深度和其左(右)子树的深度之间的关系。显然,此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 +1 。算法解析:1.终止条件: 当 root​ 为空,说明已越过叶节点,因此返回 深度 0 。2.递推工作: 本质上是对树做后序遍历。3.计算节点 root​ 的 左子树的深度 ,即调maxDepth(root.left);4.计算节点 root​ 的 右子树的深度 ,即调maxDepth(roo

2020-06-21 10:41:41 98

原创 剑指-- 对称的二叉树

剑指-- 对称的二叉树这个和leetoce的101题是一样的,所以笔记也是和101题是一样的。1,题目:2,思路:方法一:递归:如果同时满足下面的条件,两个树互为镜像:1.它们的两个根结点具有相同的值2.每个树的右子树都与另一个树的左子树镜像对称我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。方

2020-06-21 10:04:31 144

原创 leetcode(String)--383. 赎金信

leetcode(String)–383. 赎金信1,题目:2,思路:方法一:排序与双指针:1.题目要求magazine中的字母是否可以构成ransomNote,且magazine中的字母不能重复使用。那么对于ransomNote中的每一个字符,都去magazine中查找是否存在(找到一个后,要从magazine中剔除)。2.用暴力查找太慢。借鉴判断字符串相等的思路,双指针分别指向两个字符串的第一个字符,依次对比,双指针一起移动。我们可以将magazine与ransomNote对应的字符数组m

2020-06-21 09:42:33 167

原创 Redis(六)--Redis持久化方式+原理+区别

Redis(六)–Redis持久化方式+原理+区别一、持久化:什么是持久化?Redis所有数据保存在内存中,对数据的更新将异步地保存到磁盘上,使得数据在Redis重启之后仍然存在。这么做这有什么实际意义呢?将数据存储到硬盘是为了以后可以重用数据,将数据进行备份,可以在系统故障的时候从备份进行恢复。还有一点,存储在Redis里面的数据可能是经过复杂运算而得出的结果,把这些数据进行存储,方便后续的使用,以达到“空间换时间”的效果。为什么需要持久化?redis里有10gb数据,突然停电或者意外宕机了,再

2020-06-19 21:54:47 1109

原创 leetcode(list)--237. 删除链表中的节点

leetcode(list)–237. 删除链表中的节点1,题目:2,思路:方法一:简单方法:node.val = node.next.val;node.next = node.next.next;也就是:将下一个节点值赋给当前节点再将当前节点指向 下下一个节点其他的方法也是这个意思,可能就是写法有点不一样。但是实质都是一样的。3,代码:方法一:简单方法:class Solution { public void deleteNode(ListNode node) {

2020-06-19 17:48:59 157

原创 leetcode(DP)--392. 判断子序列

leetcode(DP)–392. 判断子序列1,题目:2,思路:方法一:动态规划:思路:状态:dp[i][j]为s的从头开始到i的子字符串是否为t从头开始到j的子字符串的子序列状态转移公式:1、当char[i]==char[j]时,则字符i一定是j的子序列,如果0i-1子字符串是0j-1子字符串的子序列,则dp[i][j]=true,所以dp[i][j]= dp[i-1][j-1];2、当char[i]!=char[j]时,即判断当前0i子字符串是否是0j-1的子字符串的子序列,即dp

2020-06-19 17:23:01 187

原创 Redis(五)--内存淘汰机制(涉及到过期策略)

Redis(五)–内存淘汰机制(涉及到过期策略)这个博客的内容包括以下几个点:1.redis内存淘汰机制2.若有大量的key需要设置同一时间过期,一般需要注意什么?3.过期键删除策略4.redis如何保证数据都是热点数据一、redis内存淘汰机制1,概念:内存淘汰机制:redis配置文件可以设置maxmemory,内存的最大使用量,达到限度会执行内存淘汰机制(也就是,redis用作缓存时,若内存空间用满,就会自动驱逐老的数据)2,redis中的内存淘汰机制:没有配置时,默认为no-e

2020-06-19 13:28:25 424

原创 leetcode(Tree)--101. 对称二叉树

leetcode(Tree)–101. 对称二叉树1,题目:2,思路:方法一:递归:如果同时满足下面的条件,两个树互为镜像:1.它们的两个根结点具有相同的值2.每个树的右子树都与另一个树的左子树镜像对称我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。方法二:队列实现:现在我们改用队列来实现,思路

2020-06-19 10:07:42 143

原创 leetcode(String)--344. 反转字符串

leetcode(String)–344. 反转字符串1,题目:2,思路:方法一:双指针(简单方法)(自己写的):就是i和j分别指向数组的开始和末尾,当i<j的时候,就交换即可。方法二:主要是运用了char temp = s[i];s[i] = s[length - i];s[length - i] = temp;也就是s[i] = s[length - i];交换。其实实质还是双指针。3,代码:方法一:双指针(简单方法)(自己写的):class Solution {

2020-06-19 09:28:34 138

原创 leetcode(String)--893. 特殊等价字符串组

leetcode(String)–893. 特殊等价字符串组1,题目:2,思路:因为所有 A[i] 都具有相同的长度,所以没有必要考虑长度问题了。奇数位和偶数位上的所有字符分别一致,就是一组,如abcde、cdabe,两者奇数位上均是a/c/e,偶数位上都是b/d,最后都能通过有限次的交换得到对方所以,搜集每个字符串中奇数位和偶数位的字符,按字典序排好序后使用Set来筛选,如abcde的奇数位为ace,偶数位为bd,拼接出来加入Set,即acebd;acbde的奇数位为abe,偶数位为cd,

2020-06-18 21:08:21 163

原创 Redis(四)--缓存雪崩、缓存穿透、缓存并发、缓存预热

Redis(四)–缓存雪崩、缓存穿透、缓存并发、缓存预热一、缓存雪崩:1.概念:缓存雪崩:数据未加载到缓存中或者缓存同一时间大面积失效,从而导致所有的请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。2.如何预防缓存雪崩:(1)、缓存的高可用性。(如:redis Sentinel 和redis Cluster都实现了高可用)(2)、缓存的降级:可以利用encache等本地缓存(暂时支撑),但主要还是对源服务访问进行限流、资源隔离(熔断)、降级等。在进行降级之前要对系统记性梳理,比如:

2020-06-18 19:07:49 155

空空如也

空空如也

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

TA关注的人

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