缓存的经典问题
缓存失效
缓存穿透
缓存雪崩
数据不一致
数据并发竞争
Hot Key
Big Key
每一个问题都参照四个步骤进行阐述:问题描述、原因分析、业务场景、解决方案
缓存失效
问题描述
当一个系统中存在大量的热点数据,通常情况下就需要上缓存,大致的流程就是
查缓存(有则直接返回)
查DB(缓存中不存在)
将查到的数据回写到缓存中
我们希望数据查询尽可能命中,这样系统负载最小,性能最佳,但是如果这时候有大量的Key同时失效,很多缓存数据访问都会miss,就会穿透到DB中,这样就会导致整体的系统压力急剧上升,这就是缓存失效的问题。
原因分析
导致缓存失效的主要原因,就是批量Key一起失效,简言之就是在加入缓存时过期时间都是一致的。一般情况下,缓存时逐步写入的,所以自然就会是逐步淘汰的。
但是,在一些场景下,如果需要将一个批次的热点数据添加到缓存中,这时候如果过期时间没
后端开发常见层式结构:时间轮、跳表、LSM-Tree
海量并发的定时任务:时间轮
高并发读写的有序结构组织:跳表
空间利用率以及写性能高的磁盘数据组织:LSM-Tree
什么是层式结构(GPT):层式结构(Layered Structure)在计算机科学和软件工程中通常指的是将系统分成若干层次,每个层次负责不同的功能和任务。这样设计的好处是可以将复杂系统的不同部分进行解耦和模块化,从而提高系统的可维护性、可扩展性和可理解性。
时间轮
单层级时间轮
定时任务是用时间轮进行实现的,那么它是如何去组织数据的呢?
一个格子代表一个时刻
一个格子可存储多个任务
按执行顺序组织数据
多层级时间轮
按照任务的轻重缓急来进行层次划分的,当我们的任务是在秒这个单位下需要执行的,那么只需要放在前60秒即可,那么如果任务是分、时单位下,那么只需要放在对应的层级即可。对比单层级时间轮,多层级时间轮
本篇文章主要介绍Redis数据类型,具体实现的数据结构
前言
🚀 内容来自参考自Redis设计与实现
⚠️ 本篇文章主要介绍Redis3.0的数据结构,在Redis7.0数据类型与数据结构的关系有所不一致。
介绍逻辑
数据结构的定义
字段的解释
特性
介绍内容
简单动态字符串
链表
字典
跳跃表
整数集合
压缩列表
简单动态字符串
数据结构的定义
字段的解释
free属性的值,记录SDS存在多少未使用的空间
len属性,记录SDS保存多少字节长度的字符串
特性
常数复杂度获取字符串长度
杜绝缓冲区溢出问题,SDS在执行修改增加操作的时候,API会检查是否满足要求,如果不满足会自动扩容
减少修改字符串时带来的内存重分配次数,空间预分配会额外分配空间、惰性空间释放在缩短操作时,利用free属性记录数量,等待使用。
链表
数据结构的定义
由ListNode和L
BinarySearchTree定义
二叉搜索树是二叉树的一种。
任意一个节点的值都大于其左子树所有节点的值。
任意一个节点的值都小于其右子树所有节点的值。
它的左右子树也是一颗二叉搜索树。
设计一颗二叉树
树中节点的设计
节点的值
左孩子
右孩子
当前节点的父节点
判断当前节点是否为叶子节点
判断当前节点度是否为2
public class Node {
public int element; // 值
public Node left; // 左孩子
public Node right; // 右孩子
public Node parent; // 父节点
/**
* 必须传入当前节点的值以及父节点
* @param element
* @param pare
主旋律:回想2023一整年应该都是备考 ➕ 实习以及匆忙的校园生活
一些
2023过年期间和朋友自驾游去了一趟广西桂林🙅(其实是陪朋友去找他女朋友)参观一些风景区没太多印象了,有意思的其实是和朋友一起在车上又冷又塞车通宵赶回家。
过完年就回学校备考了,和一位玩的很好的朋友约定每天三点一线的备考,每天约定俗成的在宿舍门口汇合,吃早餐...计划着要赶在学生下课之前去吃饭。
期间还在去图书馆的路上选一个棵树记录它能不能在考试前长出来🌲,很快就迎来了考试。
在第一门💥的情况下,也迎来了两天考试睡眠一共不足4个小时,而周一立马就去实习了毫无喘息...
实习😈
在备考期间学校恰好举行了招聘会,于是抽出半天时间想着能不能碰一碰运气,现在回想23届的校招可以说是地狱级难度(希望25届不要!)当时刷牛客的时候不少23届的同学都在抱怨。
然后在招聘会现场随便走了一圈,开发岗位少的可怜。抱着来