java面试题(Redis)

事情干的差不多了,开刷面试题和算法,争取在短时间内快速成长,理解java面试的常见题型

一、redis使用场景:

缓存:穿透、击穿、雪崩 双写一致、持久化 数据过期、淘汰策略

分布式锁:setnx、redisson

计数器:

保存token:

消息队列:

延迟队列:

二、其他面试题:

集群:主从 哨兵 集群

事务:

redis为什么快:

(1)、缓存穿透

缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会每次请求都查数据库

解决一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存

优点:简单

缺点:小号内存,可能会发生不一致的问题

解决二:布隆过滤器

布隆过滤器的实现方案:redisson,Guava

优点:内存占用较少,没有多余key

缺点:实现复杂,存在误判

(2)缓存击穿

当redis的key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把db压垮

两种,一种是互斥锁恢复数据库数据,一种是逻辑过期

(3)缓存雪崩

缓存雪崩是指同一时段大量的缓存key失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力

解决方案:给不同的key的TTL添加随机值,利用redis集群提高服务的可用性,给缓存业务添加降级限流策略,给业务添加多级缓存

(4)双写一致性

读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间

写操作:延迟双删

不双删的话应对多线程会出现错误

第二种方法:分布式锁

共享锁:读锁readLock,加锁之后,其他线程可以共享读操作

排他锁:独占锁writeLock也叫,枷锁周,阻塞其他线程读写操作

读数据时添加共享锁,读不互斥,写互斥

写数据时添加排他锁,读写互斥

(5)redis持久化

1、RDB

2、AOF

(6)redis过期策略

redis数据删除策略-惰性删除

惰性删除:设置该key过期时间后 ,不管,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key

定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量)

定期清理有两种模式:

SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整这个次数

FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

(7)数据淘汰策略

当redis中的内存不够用时,此时在向redis中添加新的key,那么redis就会按照某一种规则将内存中的数据删掉,这种数据的删除规则被称之为内存的淘汰策略

8种不同策略来选择要了删除的key:

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

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

相关文章

【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )

文章目录 一、函数定义方法1、命名函数2、函数表达式3、函数表达式示例 一、函数定义方法 1、命名函数 定义函数的标准方式 就是 命名函数 , 也就是之前讲过的 声明函数 ; 函数 声明后 , 才能被调用 ; 声明函数的语法如下 : function functionName(parameters) { // 函数体 …

计算机网络:数据链路层 - 可靠传输协议

计算机网络:数据链路层 - 可靠传输协议 可靠传输概念停止-等待协议 SW回退N帧协议 GBN选择重传协议 SR 可靠传输概念 如下所示,帧在传输过程中受到干扰,产生了误码。接收方的数据链路层,通过真伪中的真检验序列 FCS 字段的值&…

ROS 2边学边练(13)-- 创建一个功能包

前言 功能包是啥 简单理解,功能包就是一个文件夹,一个具备一定功能的文件夹,一个有组织有结构的文件夹,一个能方便分享给其他人使用的文件夹,比如我们的小海龟功能包,它就是一个文件夹,名字叫t…

【每日刷题】Day2

1. 26. 删除有序数组中的重复项 - 力扣(LeetCode) int removeDuplicates(int* nums, int numsSize) { int* newnums (int*)malloc(numsSize*sizeof(int)); int k 0; int i 0; int pf1 0; int pf2 1; if(numsSize1) { newnums[k] nums[0]; } if(nu…

Swagger2配置

Swagger2 Swagger2简介 Swagger 是一个规范和完整的框架,用于生成、描述、功能调用测试和可视化 RESTful 风格的在线的接口文档工具。 Swagger 是一套基于 OpenAPI 规范(OpenAPI Specification,OAS)构建的开源工具。 Swagger 提…

WPS 不登录无法使用基本功能的解决办法

使用wps时,常常有个比较让人烦恼的事,在不登录的情况下,新建或者打开文档时,wps不让你使用其基本的功能,如设置字体等,相关界面变成灰色,这时Wps提示用户登录注册或登录,但我又不想登…

均值滤波算法与SSE2指令集并行优化

均值滤波是经典的机器视觉方法,本篇将讨论如何对该算法进行优化,使得其比OpenCV的实现更快。 为量化运行速度,先实现遍历求和的均值滤波算法,看看其运行效率究竟有多慢,代码如下: 遍历求和均值滤波算法 #include <opencv2/opencv.hpp> #include <iostream>…

【QT入门】 无边框窗口设计之综合运用,实现WPS的tab页面

往期回顾&#xff1a; 【QT入门】 无边框窗口设计之实现窗口阴影-CSDN博客 【QT入门】 无边框窗口设计之实现圆角窗口-CSDN博客 【QT入门】 无边框窗口设计综合运用之自定义标题栏带圆角阴影的窗口-CSDN博客 【QT入门】 无边框窗口设计之综合运用&#xff0c;实现WPS的tab页面 …

Nexus的docker安装,maven私服

文章目录 前言安装创建文件夹设置文件夹权限docker创建指令制作docker-compose.yaml文件 查看网站访问网页查看密码 前言 nexus作为私服的maven仓库&#xff0c;在企业级应用中&#xff0c;提供了依赖来源的稳定性&#xff0c;为构建庞大的微服务体系&#xff0c;打下基础 安…

如何实现在不给定长度的情况下进行输入?

在输入一串数字时&#xff0c;不管是使用for循环还while循环&#xff0c;我们都必须知道要输入的具体长度。 可是如果题目没有给定输入长度&#xff0c;也没有给定最大范围呢&#xff1f; 同样也有for与while两种循环方式。 for #include<iostream> using namespace …

Svelte Web 框架介绍

Svelte 是一个用于构建网络应用程序的现代框架&#xff0c;它与其他用户界面框架&#xff08;如React和Vue&#xff09;有着本质的不同。Svelte 的核心理念是在构建应用程序时&#xff0c;将大部分工作转移到编译步骤中&#xff0c;而不是在用户的浏览器中运行时处理。这种方法…

算法——分治(快速排序)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于快速排序的专题 对于快速排序在我个人主页专栏 <排序> 有详细的介绍,此专题对快排进行了优化操作,并介绍了优化后的快排的几种运用 如果有不足的或者错误的请…

Linux初学(十五)ssh服务

一、SSH服务 1.1 简介 远程登录Linux用的就是ssh服务 ssh服务的特点就是数据会机密传输 ssh服务 组件&#xff1a;openssl 服务名&#xff1a;sshd 默认端口&#xff1a;22 1.2 配置文件 /etc/ssh/sshd_config #Port 22 ssh的端口 #Use…

【正点原子探索者STM32F4】TFTLCD实验学习记录:FSMC控制 TFTLCD的寄存器配置

FSMC控制 TFTLCD的寄存器配置 异步模式 A控制 TFTLCDFSMC寄存器配置ILI9341电平持续时间要求 参考 异步模式 A控制 TFTLCD LCD以ILI9341为例 FSMC寄存器配置 对于异步突发访问方式&#xff0c; FSMC 主要设置 3 个时间参数&#xff1a;地址建立时间(ADDSET)、 数据 建立时间…

Linux服务器上安装多个版本cuda的一些准备

1. 在已经有cuda10.1的基础上安装cuda11.3并配置进环境变量 linux20.04 cuda避坑安装/nvidia驱动/环境配置/安装cuDNN_linux安装cuda-CSDN博客 2. 配置环境变量的过程需要用到Vim编辑器&#xff0c;Vim编辑器的使用方法 vim 的基本使用命令_vim命令行操作-CSDN博客 3.cuda…

Java学习之抽象类和接口

目录 抽象方法和抽象类 示例 使用要点 接口(interface) 作用 定义及使用 声明格式 定义接口的详细说明 要点 示例 接口中定义静态方法和默认方法(JDK8及以后) 默认方法 示例 静态方法 接口的多继承 示例 抽象方法和抽象类 抽象方法 使用abstract修饰的方法&…

Unity之PUN实现多人联机射击游戏的优化(Section 2)

目录 &#x1f3ae;一、准备工作 &#x1f3ae;二、实现手雷投掷动作 &#x1f3ae;三、手雷投掷同步 &#x1f4a4;3.1 photonView.RPC &#x1f3ae;四、同步手雷伤害 这几周都给我布置任务了&#xff0c;最近可忙。现在终于有机会更新了&#xff0c;也谢谢大家的阅读&a…

JavaSE-11笔记【多线程2(+2024新)】

文章目录 6.线程安全6.1 线程安全问题6.2 线程同步机制6.3 关于线程同步的面试题6.3.1 版本16.3.2 版本26.3.3 版本36.3.4 版本4 7.死锁7.1 多线程卖票问题 8.线程通信8.1 wait()和sleep的区别&#xff1f;8.2 两个线程交替输出8.3 三个线程交替输出8.4 线程通信-生产者和消费者…

C++枚举类型

在 C++ 中,枚举(Enumeration)是一种用户定义的数据类型,用于定义一组有限的命名常量。枚举类型可以简化代码,提高代码的可读性。 C++ 中的枚举类型有两种:普通枚举和枚举类。 1. 普通枚举 普通枚举使用关键字 enum 定义,可以指定枚举常量的取值。 #include <iost…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…