工作几年了,你真的懂 Redis 嘛?

大家好,我是伍六七。一个专注于输出 AI+ 编程内容的在职大厂资深程序员,全国最大 AI 付费社群破局初创合伙人,关注我一起破除 35 诅咒。

Redis 基本上是大部分技术公司都会使用的缓存框架,但是我发现很多程序员其实并不懂 Redis。

今天,阿七带大家从理论和实践的角度来了解和使用 Redis。

1 缓存基本思想

1、不同的存储介质访问延迟不一样,相同成本存储容量不一样

SSD/Disk、Memory、L3 cache、L2 cache、L1 cache 五种存储介质,访问延迟逐渐降低,但是同等成本的容量却逐渐增大。

2、时间局限性原理

被获取过一次的数据在未来会被多次获取。

3、以空间换时间

开辟一块高速独立空间,提供高速访问。

4、性能成本权衡

访问延迟性低、性能越高,等容量成本越高。

2 缓存优势

  1. 提升访问性能
  2. 降低网络拥堵
  3. 减轻服务负载
  4. 增强可扩展性

3 缓存代价

  1. 系统复杂性提高
  2. 存储和部署成本变高
  3. 数据一致性问题

4 缓存的三种模式

4.1 Cache Aside 旁路缓存

核心思想

写操作:更新 DB 之后,直接将 key 从缓存中删除;

读操作:先读缓存,如果没有,则读 DB,同时将 DB 的数据同步到缓存中。

特点

业务端处理所有数据访问细节,同时利用 lazy 懒加载思想,更新 DB 之后,直接删除缓存并通过 DB 更新,确保数据以 DB 为准,可以大幅降低缓存和 DB 之间的不一致的概率。

缺点

1、如果删除缓存失败,可能会有问题;

解决方法

失败增加监控

2、如果同时有比较高的QPS访问刚插入或者更新的数据,可能会打垮DB;

解决方法

使用多线程异步执行查询,防止这种问题。

场景:读多写少。比如用户数据,用户修改用户信息很少,但是各种业务场景用到用户数据的读场景比较多。

4.2 Read/Write Through

核心思想

读写缓存和 DB 的操作,都有一个中间的数据服务代理。

写操作:先查缓存,如果缓存不存在,则只更新 DB;如果缓存中存在,则先更新缓存,再更新 DB,然后返回;

读操作:先查缓存,如果命中则直接返回。否则从 DB 中加载,然后回种到缓存中再返回。

特点:业务端不需要关心数据细节,系统隔离性好

4.3 write-Back 或者 Write-Behind

核心思想

承接 Write Through,写操作更新完缓存之后,异步回写数据到 DB 或者批量回写数据到 DB。

缺点

异步或者批量回写,可能会导致数据丢失。

特点

合并或者异步写 DB,DB 压力小。

使用场景:写频率很高,但是对于数据一致性要求不太高的业务

5 Redis 常见面试题

5.1 Redis 雪崩

概念

大量的应用请求无法在 Redis 缓存中进行处理,紧接着,
应用将大量请求发送到数据库层,导致数据库层的压力激增。

原因

1、缓存中有大量数据同时过期,导致大量请求无法得到处理

2、Redis 缓存实例发生故障宕机了

解决方案

针对原因 1

  • 方法1:避免给大量的数据设置相同的过期时间。
  • 方法2: 降级直接返回预定义信息、空值或是错误信息。

针对原因 2

  • 方法1: 在业务系统中实现服务熔断或请求限流机制。
  • 方法2: 服务端 限流。

事前预防:使用主从节点 构建 Redis 缓存高可靠集群

5.2 击穿

概念:1、是发生在某个热点数据失效的场景下,大量请求直接访问 DB,DB 压力骤增,业务响应延迟。

原因:热点 key 过期失效或者同时失效。

解决办法:热点 key 不设置过期时间;或者设置过期时间为基础时间+随机时间。

5.3 穿透

概念:要访问的数据既不在 Redis 缓存中,也不在数据库中,导致请求在访问缓存时,发生缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据。

原因:1、业务层误删除数据了;2、恶意攻击:专门访问数据库中没有的数据。

解决方法

  • 1、缺省值或者空值。
  • 2、使用布隆过滤器快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库压力。
  • 3、前端进行请求检测

5.4 bigKey

概念:一个缓存 key,存储数据过多。比如一个上万记录的 List;

危害

1、造成内存分配不均匀。比如在 Redis cluster 或者 Codis 中,会造成节点的内存使用不均匀;

2、超时阻塞。因为 Redis 单线程特性,如果操作某个 bigKey 耗时比较久,则后面的请求会被阻塞。

3、网络阻塞,消耗带宽。

4、过期删除,会很慢,会阻塞 Redis。如果 Bigkey 设置了过期时间,当过期后,这个 key 会被删除,假如没有使用 Redis 4.0 的过期异步删除,
就会存在阻塞 Redis 的可能性,并且慢查询中查不到(因为这个删除是内部循环事件)。

如何发现?

Redis 命令: redis-cli --bigkeys

解决方法

  • 删除 bigKey。
  1. Redis4.0 之后,异步删除;
  2. 集合类型:用 scan,读取部分数据删除;
  3. Hash类型,用 Hscan,读取部分数据删除
  • 拆分
  1. String类型,拆分成多个 key
  2. 集合或者 Hash 类型,拆分成多个 List 或者 Hash

5.5 热 key

概念

所谓热 key 问题就是,突然有几十万的请求去访问 Redis 上的某个特定key。

那么,这样会造成流量过于集中,达到物理网卡上限,从而导致这台 Redis 的服务器宕机。

解决

1、二级缓存——本地缓存。比如利用 ehCache,或者一个- HashMap 都可以。在你发现热 key 以后,把热 key 加载到系统的 JVM 中。
针对这种热 key 请求,会直接从 jvm 中取,而不会走到 Redis 层。

2、备份热key。不要让key走到同一台redis上不就行了。我们把这个key,在多个redis上都存一份不就好了。
接下来,有热key请求进来的时候,我们就在有备份的redis上随机选取一台,进行访问取值,返回数据。

< END >

链接我,免费领取Java面试全套pdf(带答案)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/212714.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

canvas 轮廓路径提取效果

前言 微信公众号&#xff1a;前端不只是切图 轮廓 对内容做border效果&#xff0c;可以先看下代码运行的效果 内容是黑线构成的五角星&#xff0c;其轮廓就是红线的部分&#xff0c;本文主要介绍如何在canvas中实现这种效果 Marching Square 这里运用到的是marching square算法…

Gradio库的安装和使用教程

目录 一、Gradio库的安装 二、Gradio的使用 1、导入Gradio库 2、创建Gradio接口 3、添加接口到Gradio应用 4、处理用户输入和模型输出 5、关闭Gradio应用界面 三、Gradio的高级用法 1、多语言支持 2、自定义输入和输出格式 3、模型版本控制 4、集成第三方库和API …

边缘与云或边缘加云:前进的方向是什么?

边缘计算使数据处理更接近数据源&#xff0c;以及由此产生的行动或决策的对象。通过设计&#xff0c;它可以改变数十亿物联网和其他设备存储、处理、分析和通信数据的方式。 边缘计算使数据处理更接近数据源&#xff0c;以及由此产生的行动或决策的对象。这与传统的体系结构形成…

L1-016:查验身份证

题目描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#xf…

站群优化工具,站群优化方案策略

站群优化&#xff0c;作为网络推广的一项重要策略&#xff0c;站群的构建和优化对于提升网站在搜索引擎中的排名、吸引目标流量、增加用户粘性等方面有着不可忽视的作用。 站群优化方案 站群优化并非简单的堆积大量网站&#xff0c;更要注重质量和策略。在构建站群时&#xff…

VMware下载安装教程

目录 一.下载二.安装 一.下载 官网地址&#xff1a;官网 下载的时候选择Workstation Player&#xff0c;这个是免费的&#xff0c;当然你也可以选择下载Workstation Pro。 二.安装 下载完成之后点击安装包按照需要安装即可。 安装之后启动&#xff0c;可以看到这个能够免费使…

CPU标高load标高;linux故障日志排查

一般情况下&#xff0c;服务器不太会出问题。但是遇到特别诡异的情况&#xff0c;多半是服务器本身的问题。遇到问题&#xff0c;我们不能一味的去排查应用&#xff0c;中间件。更应该想到服务器的问题。否则很容易出现南辕北辙的情况。 这次分享的是一次服务器故障&#xff0c…

【小沐学Python】Python实现Web服务器(Flask+celery,生产者-消费者)

文章目录 1、简介2、安装和下载2.1 flask2.2 celery2.3 redis 3、功能开发3.1 创建异步任务的方法3.1.1 使用默认的参数3.1.2 指定相关参数3.1.3 自定义Task基类 3.2 调用异步任务的方法3.2.1 app.send_task3.2.2 Task.delay3.2.3 Task.apply_async 3.3 获取任务结果和状态 4、…

Java LeetCode篇-深入了解关于栈的经典解法(栈实现:中缀表达式转后缀)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 中缀表达式转后缀说明 1.1 实现中缀表达式转后缀思路 2.0 逆波兰表达式求值 2.1 实现逆波兰表达式求值思路 3.0 有效的括号 3.1 实现有效的括号思路 4.0 栈的压…

一文读懂MongoDB的全部知识点(1),惊呆面试官。

文章目录 01、mongodb是什么&#xff1f;02、mongodb有哪些特点&#xff1f;03、你说的NoSQL数据库是什么意思&#xff1f;NoSQL与RDBMS直接有什么区别&#xff1f;为什么要使用和不使用NoSQL数据库&#xff1f;说一说NoSQL数据库的几个优点?04、NoSQL数据库有哪些类型?05、M…

SmartSoftHelp8,端口安全进程查看管理工具

PID 协议 端口 所属进程名 本地绑定地址 远程地址 当前状态 关闭进程 下载地址&#xff1a; https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg?pwd8888

ctfhub技能树_web_web前置技能_HTTP

目录 一、HTTP协议 1.1、请求方式 1.2、302跳转 1.3、Cookie 1.4、基础认证 1.5、响应包源代码 一、HTTP协议 1.1、请求方式 注&#xff1a;HTTP协议中定义了八种请求方法。这八种都有&#xff1a;1、OPTIONS &#xff1a;返回服务器针对特定资源所支持的HTTP请求方法…

微服务的流量管理-服务网格

对于单体应用来说&#xff0c;一般只有流入和流出两种流量。而微服务架构引入了跨进程的网络通信&#xff0c;流量发生在服务之间。由许多服务组成了复杂的网络拓扑结构&#xff0c;每次请求都会产生流量。 这些流量如果没有妥善的管理&#xff0c;整个应用的行为和状态将会不…

Linux安装nginx超完整步骤

1、到官网&#xff08;http://nginx.org&#xff09;下载nginx包,推荐使用稳定版本 2、上传nginx到linux系统&#xff0c;我上传的默认路径在/usr/local/下 3、安装依赖环境&#xff1a; ①安装gcc环境 yum install gcc-c ②安装PCRE库&#xff0c;用于解析正则表达式 yum…

轻易云AI:引领企业数智化转型提升企业AI效率

近期&#xff0c;轻易云AI与汤臣倍健的合作引起了业界的广泛关注。通过这一合作&#xff0c;轻易云AI不仅成功打造了集团小汤AI助手这一标志性的企业智能助手&#xff0c;更重要的是&#xff0c;这一合作凸显了轻易云AI作为专业AI应用集成专家的核心能力。轻易云AI已成功集成了…

数据结构算法-冒泡排序算法

引言 虽然选择排序好用 &#xff0c;但有点问题 也就是频繁找最大值下标 放到 未排序的后面 因为每次需要扫描整个未排序序列&#xff0c;找到最大值或最小值的下标&#xff0c;并将其交换到未排序序列的最后一个位置。这样做的问题在于&#xff0c;在后面的迭代中&#xff0c…

LinkWeChat,唯一以开源为核心的SCRM

LinkWeChat是国内首个基于企业微信的开源SCRM&#xff0c;在集成了企微强大的开放能力的基础上&#xff0c;进一步升级拓展灵活高效的客户运营能力及多元化精准营销能力&#xff0c;让客户与企业之间建立强链接&#xff0c;帮助企业提高客户运营效率&#xff0c;强化营销能力&a…

python 图书馆选座小程序源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索房间&#xff0c;轮播图&#xff0…

三个写法统计整数前导0个数

从键盘输入一个整数(可能有前导0)&#xff0c;编程统计其前导0个数&#xff0c;其法有三。 (笔记模板由python脚本于2023年12月03日 12:32:32创建&#xff0c;本篇笔记适合对python整型int和字符型str熟悉的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…

ftp的服务安装配置

安装 yum install -y vsftpd # 是否安装成功 rpm -qa | grep vsftpd # 是否开机启动 systemctl list-unit-files | grep vsftpd # 开机启动 systemctl enable vsftpd.service # ftp端口 netstat -antup | grep ftp # 状态 service vsftpd status service vsftpd start service…