Java开发之Redis(面试篇 持续更新)

文章目录

  • 前言
  • 一、redis使用场景
    • 1. 知识分布
    • 2. 缓存穿透
      • ① 问题引入
      • ② 举例说明
      • ③ 解决方案
      • ④ 实战面试
    • 3. 缓存击穿
      • ① 问题引入
      • ② 举例说明
      • ③ 解决方案
      • ④ 实战面试
    • 4. 缓存雪崩
      • ① 问题引入
      • ② 举例说明
      • ③ 解决方案
      • ④ 实战面试
    • 5. 缓存-双写一致性
      • ① 问题引入
      • ② 举例说明
      • ③ 解决方案
      • ④ 实战面试
  • 二、redis分布式锁
  • 引用声明


前言

本文主要记录redis的缓存穿透、缓存击穿、缓存雪崩、双写一致性、持久化、数据过期策略、数据淘汰策略、分布式锁等问题的分析与面试回答示例。


提示:以下是本篇文章正文内容,下面案例可供参考

一、redis使用场景

1. 知识分布

()
在这里插入图片描述

在这里插入图片描述

2. 缓存穿透

① 问题引入

在这里插入图片描述

② 举例说明

一个get请求路径:api/news/getById/1
从数据库中查询到了数据并加载到redis缓存,直接查询redis中的数据,查询到了就返回结果,否则查数据库,具体流程如下:
在这里插入图片描述
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库,给数据库增加压力。

③ 解决方案

方案一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存
优点:简单
缺点:消耗内存,可能数据库数据已经修改,但是redis中还是之前的空数据

方案二:布隆过滤器,拦截不存在的数据
优点:内存占用较少,没有多余的key
缺点:实现复杂,存在误判
在这里插入图片描述
补充:
在添加数据到数据库时,也需要添加到redis、布隆过滤器中
布隆过滤器依赖bitmap(位图):一个以(bit)位为单位的数组,只能存储二进制(0、1)

布隆过滤器的作用:用于检索一个元素是否在一个集合中。
比如添加一个id=1的数据,经过哈希函数计算,将0改为1,表示存在数据。
在这里插入图片描述
当id=1和id=2都存在,但是id=3不存在,经过hash函数计算得到的结果是存在,这就是误判。
误判率:数组越小误判率就越大,数组越大误判率就越小,但是同时带了了更多的内存消耗。
在这里插入图片描述
布隆过滤器的实现中我们可以控制误判率(5%之内)
在这里插入图片描述

④ 实战面试

在这里插入图片描述

3. 缓存击穿

① 问题引入

在这里插入图片描述

② 举例说明

缓存击穿: 当某一个热门的key设置了过期时间,当key过期的时候,恰好这个时间点对这个key有大量的并发请求过来,redis缓存重建的过程比较慢,这些并发请求可能会瞬间把数据库压垮。
在这里插入图片描述

③ 解决方案

**方案一:**互斥锁
优点:数据强一致
缺点:性能查
补充:当线程1在缓存的过程中,其他线程只能等待;当线程1把数据缓存成功,其他的线程就可以获取到数据

在这里插入图片描述

方案二: 逻辑过期
优点:高可用,保证查询效率
缺点:不能保证数据绝对一致
补充:当线程2没有将最新数据加入到缓存之前,所有的线程获取的都是过期数据,当线程2将数据更新完成后,所有的线程获取到最新数据。
在这里插入图片描述

④ 实战面试

在这里插入图片描述

4. 缓存雪崩

① 问题引入

在这里插入图片描述

② 举例说明

缓存雪崩: 是指在同一时段大量的缓存key同时失效或者Redis服务宕机导致大量请求到达数据库,带来巨大压力。
在这里插入图片描述

③ 解决方案

方案一:
情况:大量的缓存key同时失效
方法:给不同的key设置不同的过期时间,在原有的时间基础上再加一个随机时间值;
方案二:
情况:大量的缓存key同时失效
方法:给业务添加多级缓存;
方案三:
情况:Redis服务宕机
方法:利用Redis集群提高服务的可用性,比如哨兵模式、集群模式。
方案四:
情况:降级作为系统保底策略,适用于穿透、击穿、雪崩
方法:给缓存业务添加降级限流策略,比如nginx或者springcloud gateway

④ 实战面试

在这里插入图片描述

5. 缓存-双写一致性

① 问题引入

② 举例说明

双写一致性: 当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。
读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间。
在这里插入图片描述
写操作:延迟双删
在这里插入图片描述

  1. 先删除缓存还是先删除数据库?
    情况一:先删除缓存,再操作数据库,可能会出现脏数据
    在这里插入图片描述
    情况二:先操作数据库,再删除缓存,也可能会出现脏数据
    在这里插入图片描述
  2. 为什么要删除两次缓存?
    降低脏数据的出现
  3. 为什么要延时删除?
    数据库是主从分离的,延时把同步数据,也可能出现脏数据

③ 解决方案

**方案一:**分布式锁
优点:保证强一致性
缺点:性能低
在这里插入图片描述
方案二: 共享锁与排他锁(优化版)
优点:保证数据强一致性
共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
在这里插入图片描述
排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作
在这里插入图片描述
方案三: MQ异步通知
优点:保证数据的一致性
在这里插入图片描述
方案四: Canal异步通知
在这里插入图片描述

④ 实战面试

分为两种情况进行回答,主要是业务需要是属于一致性要求高、延迟一致性
在这里插入图片描述
情况一:强一致性
在这里插入图片描述
情况二:延迟一致
在这里插入图片描述

二、redis分布式锁

引用声明

文章内容来源:https://www.bilibili.com/video/BV1yT411H7YK?p=7&spm_id_from=pageDriver&vd_source=98092b0aee05ae7c890b09fe07f13df4

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux执行命令

命令格式 主命令 选项 参数(操作对象)例如: 修改主机名 hostname set-hostname 新名称显示/目录下的文件的详细信息 ls -l /命令 内置命令(builtin):shell程序自带的命令。 外部命令:有独立…

多通道振弦数据记录仪应用桥梁安全监测的关键要点

多通道振弦数据记录仪应用桥梁安全监测的关键要点 随着近年来桥梁建设和维护的不断推进,桥梁安全监测越来越成为公共关注的焦点。多通道振弦数据记录仪因其高效、准确的数据采集和处理能力,已经成为桥梁安全监测中不可或缺的设备。本文将从以下几个方面…

【JavaEE】_HTML

目录 1.HTML结构 2. HTML常用标签 2.1 注释标签 2.2 标题标签:h1~h6 2.3 段落标签:p 2.4 换行标签:br 2.5 格式化标签 2.6 图片标签:img 2.7 超链接标签:a 2.8 表格标签 2.9 列表标签 2.10 表单标签 2.10…

PPO算法

PPO算法 全称Proximal Policy Optimization,是TRPO(Trust Region Policy Optimization)算法的继承与简化,大大降低了实现难度。原论文 算法大致流程 首先,使用已有的策略采样 N N N条轨迹,使用这些轨迹上的数据估计优势函数 A ^ …

TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?

先来介绍一些osi七层模型 分为应用层、表示层、会话层、运输层、网络层、链路层、物理层。 应用层(数据):确定进程之间通信的性质以及满足用户需要以及提供网络和用户应用,为应用程序提供服务,DNS,HTTP,HTTPS&#xf…

【LeetCode】剑指 Offer <二刷>(7)

目录 题目:剑指 Offer 14- I. 剪绳子 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 14- II. 剪绳子 II - 力扣(…

Java“牵手”唯品会商品详情数据,唯品会商品详情API接口,唯品会API接口申请指南

唯品会平台商品详情接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取唯品会商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口,…

Rhinoceros(犀牛)使用技巧:有关曲线和曲面的分析

Rhinoceros(犀牛) for Mac破解版是一款功能强大的高级建模软件,可以创建、编辑、分析、提供、渲染、动画与转换 NURBS 线条、曲面、实体与多边形网格。不受精度、复杂、阶数或是尺寸的限制,在本篇文章中,为您介绍的是有…

CUDA 问题 ,一直头大。。。。

1.卸载cuda ubuntu系统安装/卸载cuda和cudnn_怎么删除cudnn_Zhijun.liStudio的博客-CSDN博客ubuntu系统安装/卸载cuda和cudnn_怎么删除cudnnhttps://blog.csdn.net/weixin_45921929/article/details/128849198?ops_request_misc%257B%2522request%255Fid%2522%253A%252216939…

复现XSS漏洞及分析

XSS漏洞概述: 类型一:反射型 类型二:存储型 类型三:DOM型 复现20字符短域名绕过 一、安装BEEF 1、在Kali中运行apt install beef-xss 2、运行beef 3、在浏览器访问 二、安装galleryCMS *遇到一点小问题 提示"last…

ping: www.baidu.com: Name or service not known 写了DNS还是不行

环境描述:ESXI平台上,一台Centos7虚拟主机。 问题描述:平台上的其他的虚拟机可以正常ping通,就这台ping IP地址可以通,ping域名解析失败。 排查过程: 1、检查网卡配置文件和/etc/resolv.conf配置文件是否…

postgis数据库导出csv表再导入postgis

1、导出csv表 from settings_Address import * from sqlalchemy import create_engine, MetaData import pandas as pd def create_conn(Postgis_user,Postgis_password,Postgis_host,Postgis_port,dbname_PG):# return create_engine(PostgispyPostgis://{}:{}{}:{}/{}.forma…

FOXBORO FBM232 P0926GW 自动化控制模块

Foxboro FBM232 P0926GW 是 Foxboro(福克斯博罗)自动化控制系统的一部分,通常用于监测和控制工业过程。以下是关于这种类型的自动化控制模块可能具有的一些常见功能: 数字输入通道: FBM232 P0926GW 控制模块通常具有多…

HTML 标签讲解

HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup (标记、标签)用来容纳和描述内容 严格意义上,标签是指开始标签&#xf…

Spring-Cloud-Openfeign如何传递用户信息?

用户信息传递 微服务系统中,前端会携带登录生成的token访问后端接口,请求会首先到达网关,网关一般会做token解析,然后把解析出来的用户ID放到http的请求头中继续传递给后端的微服务,微服务中会有拦截器来做用户信息的…

OFDM 系统在 AWGN 信道下对不同载波频率偏移 (CFO) 的 BER 灵敏度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决 今天发现rt系统的adc有一个缺陷(也可能是我移植的方法有问题,这就不得而知了!),就是只能单次转换,事情是这样的: 我在stm32的RT-T…

Git 版本回退 超神步骤

Git 版本回退 一. 背景 多版本分支开发,合并版本问题太多,需要回滚到某次版本。我的git客服端工具是 sourcetree 二.操作步骤 2.1 切到当前需要回退版本的分支 2.2 右击需要具体某一个分支,这个分支就是你想切到的分支版本,具体…

Windows中多线程的基础知识1——互斥对象

目录 1 多线程的基本概念1.1 进程一、程序和进程的概念二、进程组成三、进程地址空间 1.2 线程一、线程组成二、线程运行三、线程创建函数 1.3 多进程与多线程并发一、多进程并发二、多线程并发 2 线程同步2.1 一个经典的线程同步问题2.2 利用互斥对象实现线程同步一、创建互斥…

Redis 集群

1. 是什么 1.1 定义 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集 的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序…