当前位置:网站首页>阿里面试Redis常考问题,你略知多少?
阿里面试Redis常考问题,你略知多少?
2022-07-20 12:50:00 【蒙娜丽莎的Java】
1.0 实现步骤
- 编写实体类DEmo
- 编写getDemo()方法
- 测试
2.0 SringBoot默认使用json解析框架:javkson
创建一个SringBoot项目
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.edp</groupId>
<artifactId>spring-boot-hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>spring-boot-hello</name>
<url>http://maven.apache.org</url>
<!-- spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置,spring boot会自动选择最合适的版本进行添加。 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 指定一下jdk的版本 ,这里我们使用jdk 1.8 ,默认是1.6 -->
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- spring-boot-starter-web: MVC,AOP的依赖包.... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- <version></version> 由于我们在上面指定了 parent(spring boot) -->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
启动类
package com.edp;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 编写启动类
* 在这里我们使用@SpringBootApplication指定这是一个
* spring boot的应用程序.
* @author Edpeng
*
*/
@SpringBootApplication
public class App {
public static void main(String[] args) {
/*
* 在main方法进行启动我们的应用程序.
*/
SpringApplication.run(App.class, args);
}
}
控制类
package com.edp;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 在这里我们使用RestController (等待于 @Controller 和 @RequestBody)
* @author Edpeng
*@version v.0.1
*@date 2022年07月7日
*/
@RestController
public class HelloController {
/**
* 在这里我们使用@RequestMapping 建立请求映射如下图所示:

##### 3.0 使用FastJson解析JSON数据
###### 3.1 引入fastjson依赖包
pom.xml
…………
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
</dependencies>
###### 3.2 配置fastjon
目前有们一般采取以下两种解决方案。
(1)我们在开发过程中要避免给大量数据设置相同的过期时间。我们可以在给数据设置过期时间时给时间加一个很小的随机数,这样不同数据的过期时间就会有所差别,但差别也不会太大,保证数据在一定范围内过期,从而满足业务层要求同时过期的需要。
(2)服务降级。所谓的服务降级,是指发生缓存雪崩后,针对不同的数据采取不同的策略。
* 当业务访问非核心数据时(例如商品属性信息),我们直接返回预定义的信息。
* 当业务访问的是如库存数据等核心数据时,仍然允许查询缓存,如果缓存缺失,也可以从数据库中继续读取。
这样一来,只有部分过期的数据会访问数据库,所以数据库压力就没那么大。
# 2.Redis实例发生故障
当Redis实例发生故障,那就相当于缓存已经废掉了,所以大量请求会直接请求数据库,造成数据库压力变大,甚至宕机。针对这种情况发生的缓存雪崩,我们有以下两种处理方式。
**(1)在业务系统侧实现服务熔断或请求限流机制** 所谓的服务熔断,就是指在发生缓存雪崩时,为了防止大流量直接打到数据库,我们会暂停对缓存系统的访问。当上层应用访问缓存时,缓存接口不会去访问Redis实例,而是直接返回。等redis恢复后,再允许应用程序请求缓存系统。这样就会避免因为redis缓存宕机,导致数据库压力陡增的情况。
服务熔断虽然可以保证数据库不被崩溃,但是暂停了整个服务的访问,对业务的影响范围大,为了减小对上层服务的影响,我们一般采用请求限流。请求限流是指业务系统去控制每秒进入系统的请求数,避免过多的请求被发送到数据库。
比如正常运行时,业务系统每秒进入的请求是1万个,其中有80%在缓存中就可以处理了,有20%会去数据库中处理。一旦发生缓存雪崩,100%的流量就会请求数据库,为了不造成数据库崩溃,我们就可以启动请求限流机制。业务系统只允许30%的流量进入,而70%的流量被拒绝服务。**这也是目前主流大厂常用的方法,比如在某个明星爆出大瓜后,我们刷微博经常刷不出来,多刷几次就能进入,那就是因为做了服务降级。只允许一部分流量进入。**

**(2)使用高可靠集群**
我们可以通过主从节点来部署高可靠的Redis集群。当主节点挂掉后,从节点还可以切换成主节点。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
# 二、缓存击穿
缓存击穿是指针对某个热点数据,无法在缓存中进行处理,然后访问该数据的大量请求,一下子都发到后端数据库中,导致数据库压力激增。对于缓存击穿的情况,**经常发生在热点数据过期失效时**。
为了避免这种情况发生,最常采取的措施就是对于访问特别频繁的热点数据,我们就不设置过期时间了。这样一来,对热点数据的访问,都可以在缓存中进行。
# 三、缓存穿透
缓存穿透是指要访问的数据既不在缓存中,也不在数据库中,会导致请求缓存时,发生缓存缺失,然后请求数据库,发现数据库中也没有需要的数据。这样一来,缓存就成了“摆设”,如果有大量的这种请求,就会给数据库带来很大的压力。
这个问题一般都是黑客进行恶意攻击造成的。为了避免这种问题发生,我们有三种解决方式。
# 1、缓存空值或者缺省值
一旦发生缓存穿透,我们就可以在redis中设置一个空值或者给定的某个缺省值。这样,业务应用的后续这种请求,都可以命中缓存。这样就避免了把大量请求发送给数据库了。
# 2、使用布隆过滤器来快速判断数据是否存在
这里我们先来解释一下什么是布隆过滤器。
布隆过滤器由一个初值都为0的bit数组和N个哈希函数组成,可以用来快速判断某个数据是否存在。当我们想标记某个数据存在时,布隆过滤器会通过三个操作来完成标记:
* 首先,使用N个哈希函数,分别计算数据的哈希值,得到N个哈希值。
* 然后把这N个哈希值对bit数组的长度取模,得到每个哈希值在数组中的位置。
* 最后,我们把对应位置的bit位设置为1,这样就完成了布隆过滤器中标记数据的操作。
如果数据不存在,也就是我们没有用布隆过滤器标记过,bit数组对应的bit位为0。 当我们需要判断某个数据是否存在时,我们就执行上面的计算过程,我们先求出这个数据对应的hash值,然后取模,然后去bit数组查这N个位置上的bit值。只要这N个bit值有一个不为1,就表明这个数据没有被标记过。 基于布隆过滤器的快速检测特性,我们可以把数据写入数据库时,使用布隆过滤器做个标记,当缓存失效后,上层应用查询数据库时,可以通过查询布隆过滤器快速判断数据是否存在。如果不存在,就不用在去数据库中去查了。这样一来,即使发生缓存穿透,也不会对数据库造成压力。
# 3、业务层对请求进行检测
缓存穿透发生的原因主要就是恶意请求访问不存在的数据,所以业务层接受到请求后,一定要进行合法性检测,把恶意请求给过滤掉,这样就可以避免缓存穿透的问题了。
Java架构师资料点击下方名片领取添加
↓↓↓
边栏推荐
- Kubernetes 集群中流量暴露的几种方案
- Module learning (III) - laser ranging module (tof10120)
- Chapter 9 Yunji datacanvas ylearn causal learning open source project: from prediction to decision making
- redis排行榜
- 干货丨重中之重:数据分析中常用指标及术语!
- 解决Visual Studio 2019 更新升级后,出现更新实体数据模型失败现象
- 《流浪(Stray)》工人外套与安全帽获得方法 工人安全帽怎么获得
- Overview | comprehensive comparative research on image denoising
- POI import and export small cases
- Yyds dry goods inventory # solve the real problem of famous enterprises: small trick meow running
猜你喜欢
程序员看的JPEG图像压缩介绍(多图慎入)
马斯克回应是否会将大脑上传到云端:Already did it!
Module learning (III) - laser ranging module (tof10120)
华为摄像机布局
redis实现周边景点由近到远排序
华为之后再无谁可阻挡苹果,预期iPhone14获国内用户热捧至亿部
RENIX_ IPv6 automatic configuration -- practical operation of network tester
Four redis cluster schemes you must know and their advantages and disadvantages
redis排行榜
鴻蒙3.0發布,多屏融合穩步推進,穀歌卻再受重挫
随机推荐
Locate the kernel code through vmlinuz
RENIX_ IPv6 automatic configuration -- practical operation of network tester
With the release of Hongmeng 3.0, multi screen integration has been steadily promoted, but Google has suffered another setback
如何查询、修改参数状态值
Disjoint Set class (union search set)
A strange problem in the running process of LoadRunner
[daily question] 1260 2D mesh migration
【Appium】Failed to create session. An unknown server-side error occurred while processing the command
There are 450million 5g network users and more than 900million 5g package users. Why are users still unwilling to accept 5g?
SAP Spartacus 服务器端渲染的三种可能情形
通过vmlinuz定位到内核代码
嵌入式开发:成功进行代码审查的10个问题
解决Visual Studio 2019 更新升级后,出现更新实体数据模型失败现象
内存对齐的前因后果
Sax parsing XML and pull parsing XML
shell脚本编程-获取系统信息
数据治理笔记
Sax解析xml及pull解析xml
PG优化篇--执行计划
空域降噪和时域降噪