当前位置: 首页 > news >正文

【百面成神】Redis基础11问,你能坚持到第几问

在这里插入图片描述

前 言
🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端
☕专栏简介:纯手打总结面试题,自用备用
🌰 文章简介:Redis最基础、重要的11道面试题

文章目录

      • 1.redis的五种数据类型及其使用场景
      • 2.Redis在项目中是如何应用的
      • 3.缓存穿透、缓存击穿、缓存雪崩的区别和解决场景
      • 4.主从机制
      • 4.Redis的性能为什么很好
      • 6.Redis的持久化机制
      • 7.Redis为什么是单线程的?
      • 8.什么是哨兵机制
      • 9.redis的集群
      • 10.一致性哈希
      • 11.知道大key问题吗?

1.redis的五种数据类型及其使用场景

哈希(hash,键值对形式)
链表(list,元素有序可以重复)
集合(set,元素无序且不可重复,可以进行交、并、差运算)
有序集合(zset,元素有序的集合)
字符串(String,可以存储字符串、数字、二进制数等)

2.Redis在项目中是如何应用的

用它进行排序、排名、点赞数统计等

3.缓存穿透、缓存击穿、缓存雪崩的区别和解决场景

一般我们获取数据,会先访问缓存,如果缓存中存在则直接返回。如果缓存不存在则从数据库中获取,如果数据库中存在,会将获取的数据放入缓存、返回。如果数据库中也获取不到数据,就会直接返回失败。

在一些场景,如用户伪造不存在的数据进行查询,就需要每次都访问数据库。这时,缓存就不起作用了,因此我们称这种情况为缓存穿透。如果穿透了缓存,服务器请求数非常大,数据库可能因为扛不住压力挂掉。可以使用布隆过滤器(其底层是使用哈希算法的map缓存已经存在的数据)解决,但是可能因为哈希冲突导致误判,也可能存在数据更新问题。另外一种解决思路是缓存控制,即使某个用户id(key)的数据在数据库中找不到,也可以把id缓存到redis缓存中,这样该用户获取数据时就不会有缓存穿透问题。

在诸如秒杀活动的场景,同一时刻大量请求访问服务器,而此时缓存失效了,就会导致缓存击穿。缓存击穿的原因是同一时刻的访问量过大,因此可以通过加锁方式解决。也可以从缓存失效的角度出发,可以进行自动续期,防止缓存失效。

缓存雪崩是缓存击穿的plus版本,多个热门key都失效了。问题很严重,我们称为缓存雪崩。可以通过设置过期时间加随机数避免缓存在同一时间失效。另一个角度是从架构角度设计高可用的架构,比如如果使用的是redis做为缓存,可以使用哨兵模式(主机挂掉自动选举新主机)或者集群模式。也可以设置服务降级方案(如直接在配置中读默认数据)进行兜底。

区别:缓存穿透没数据、缓存击穿在缓存中没有数据,缓存雪崩是plus版本的缓存击穿

4.主从机制

将master上的数据及时有效的复制到slave上。一个master对应多个slave,但是一个slave只对应一个master。

主从复制的步骤是:建立连接、数据同步、命令传播(解决主机状态在同步过程中发生改变,主从状态不一致问题)。

在命令传播阶段,二者采用心跳机制保持连接确认。

主从复制可能出现的问题:
频繁的全量复制:因为主从复制过程中主机重启导致,可以记住主机runid解决。
从机数据不一致:可能是因为网络延迟导致,可以将主从部署在同一机房环境。

主从复制的好处有:(负载性能、数据安全、服务安全三个方面)
读写分离(主结点写,从结点读),提高负载能力。
数据冗余备份。
故障恢复(主机当掉有从机顶)
负载均衡
高可用的基石

4.Redis的性能为什么很好

Redis是纯内存的数据库,使用非阻塞式IO,全程使用hash数据结构,读取数据速度很快。

6.Redis的持久化机制

RDB:使用单独的线程进行数据IO,主线程不进行任何的IO,这种方式可以保证性能,但是可能会有数据丢失的情况
AOF:将数据持久化到特定的日志文件中,定时为1s持久化一次。其效率比RDB低。但是其安全性较高。
建议两者同时使用。如果可以容忍数分钟的数据丢失,可以使用RDB方式。

7.Redis为什么是单线程的?

程序清晰简单,不用考虑线程安全问题,但是可能会浪费多核cpu资源,可以同时开启多个redis服务器解决。

8.什么是哨兵机制

哨兵(集群:防止把网络的问题误判为主机的问题)用于监视主机的状态变化(发ping消息),当主机当掉,可以进行主从服务器的切换(由集群的leader执行),并通过「发布者/订阅者机制」通知给客户端,保证系统的高可用。

9.redis的集群

在特定场景下,如写并发,海量数据的存储压力,需要使用redis集群。Redis的集群采用分布式存储,每台服务器上存储不同的数据内容。其数据分布的策略是使用哈希槽来分配数据,默认一个cluster分配16384个槽,数据存储位置就是哈希值%16384。

10.一致性哈希

在海量数据的情形下,可能需要扩充服务器。常规的哈希算法需要重新计算所以服务实例的哈希值。一致性hash的出现解决了这种问题。将服务器结点构成一个环,每个结点分配一个token。在查找时先根据key计算哈希值,然后顺时针找到第一个大于等于该哈希值的token结点。这样删除、插入新结点只影响相邻的两个结点,缺点是插入、删除结点可能导致数据命中问题。

11.知道大key问题吗?

所谓大key问题,就是key对应的value值较大。如某个热门课程的收藏用户可能是一个很庞大的list。因为redis的主线程是单线程机制,因此大key问题会导致线程阻塞,并发量下降,客户端超时等。产生大key的原因可能有:一直往value里塞数据,但没有删除机制;没有做数据分片,将大key转换为小key。

可以使用big-keys命令或可视化工具找到大key。

解决大key问题可以通过:对于可删除的情况,删除非热点大key;压缩(string)和拆分key(list和set)。

相关文章:

【百面成神】Redis基础11问,你能坚持到第几问

前 言 🍉 作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:纯手打总结面试题,自用备用 🌰 文章简介:Redis最基础、重要的11道面试题 文章目录…...

十大排序算法极简汇总篇

说明 十大排序算法可以说是每个程序员都必须得掌握的了,如果你们像从 0 详细学习每一篇,那么你们可以看前面的文章。 但是呢,有些人可能已经学过,想要快速复习一下,看看代码怎么写的,那么可以看这篇十大排…...

数据结构笔记

文章目录第一章:数据结构与算法第二章:稀疏数组和队列一 、稀疏sparsearray 数组(一)案例需求(二)稀疏数组介绍(三)应用实列(四)代码实现二、队列&#xff08…...

web前端框架——Vue的特性

目录 前言: 一.vue 二.特性 1.轻量级 2.数据绑定 3.指令 4.插件 三.比较Angular 、React 、Vue 框架之间的比较 1. Angular Angular的优点: 2. React React 的优点: 3.vue 3.Vue的优点: 前言: 本篇文章…...

提权工具推荐(PEASS-ng、linpeas_linux_amd64、winPEASany_ofs)

介绍 在这里,您可以找到适用于Windows、Linux/Unix*和MacOS的权限提升工具。 这些工具搜索您可以利用的可能的本地权限提升路径,并用漂亮的颜色打印给您,这样您就可以很容易地识别错误配置。 查看book.hacktricks.xyz中的本地Windows权限提升检查表WinPEAS-Windows本地权限…...

Spark - 继承 FileOutputFormat 实现向 HDFS 地址追加文件

目录 一.引言 二.源码浅析 1.RDD.saveAsTextFile 2.TextOutputFormat 3.FileOutputFormat 三.源码修改 1.修改文件生成逻辑 - getRecordWriter 2.允许目录存在 - checkoutputSpecs 3.全部代码 - TextOutputFormatV2 四.追加存储代码实战 五.总结 一.引言 Output d…...

树莓派编程控制继电器及继电器组

目录 一,继电器说明 ● 继电器接口说明 ① 继电器输入端: ② 继电器输出端: 二,树莓派控制继电器 三,树莓派控制继电器组 一,继电器说明 通俗点讲,可以把继电器理解成是一些功能设备的控制开关。 ● LOW&#…...

oracle和mysql的区别

Oracle与MySQL的区别以及优缺点 MySQL的特点 1、性能卓越,服务稳定,很少出现异常宕机; 2、开放源代码无版本制约,自主性及使用成本低; 3、历史悠久,社区和用户非常活跃,遇到问题及时寻求帮助…...

<Linux开发> linux应用开发-之-uart通信开发例程

一、简介 串口全称叫做串行接口,串行接口指的是数据一个一个的按顺序传输,通信线路简单。使用两条线即可. 实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工…...

基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)

摘要:安全帽检测系统用于自动化监测安全帽佩戴情况,在需要佩戴安全帽的场合自动安全提醒,实现图片、视频和摄像头等多种形式监测。在介绍算法原理的同时,给出Python的实现代码、训练数据集,以及PyQt的UI界面。安全帽检…...

Linux - 进程控制(进程替换)

0.引入创建子进程的目的是什么?就是为了让子进程帮我执行特定的任务让子进程执行父进程的一部分代码如果子进程想执行一个全新的程序代码呢? 那么就要使用进程的程序替换为什么要有程序替换?也就是说子进程想执行一个全新的程序代码&#xff…...

Java中 ==和equals的区别是什么?

作用: 基本类型,比较值是否相等引用类型,比较内存地址值是否相等不能比较没有父子关系的两个对象equals()方法的作用: JDK 中的类一般已经重写了 equals(),比较的是内容自定义类如果没有重写 equals(),将…...

Linux(网络基础---网络层)

文章目录0. 前言1. IP协议1-1 基本概念1-2 协议头格式2. 网段划分2-1 基本概念2.2 IP地址分五大类2-3 特殊的IP地址2-4 IP地址的数量限制2-5 私有IP地址和公网IP地址2-6 路由0. 前言 前面我们讲了,应用层、传输层;本章讲网络层。 应用层:我…...

空间信息智能应用团队研究成果介绍及人才引进

目录1、多平台移动测量技术1.1 车载移动测量系统1.2 机载移动测量系统2、数据处理与应用技术研究2.1 点云与影像融合2.2 点云配准与拼接2.3 点云滤波与分类2.4 道路矢量地图提取2.5 道路三维自动建模2.6 道路路面三维病害分析2.7 多期点云三维变形分析2.8 地表覆盖遥感监测分析…...

ChatGPT应用场景与工具推荐

目录 写在前面 一、关于ChatGPT 二、应用实例 1.写文章 2.入门新的知识 3.解决疑难问题 4.生成预演问题 5.文本改写 6.语言翻译 7.思维导图 8.PDF阅读理解 9.操作格式化的数据 10.模拟场景 11.写代码 三、现存局限 写在前面 本文会简单介绍ChatGPT的特点、局限以…...

图像分类卷积神经网络模型综述

图像分类卷积神经网络模型综述遇到问题 图像分类:核心任务是从给定的分类集合中给图像分配一个标签任务。 输入:图片 输出:类别。 数据集MNIST数据集 MNIST数据集是用来识别手写数字,由0~9共10类别组成。 从MNIST数据集的SD-1和…...

艹,终于在8226上把灯点亮了

接上次点文章ESP8266还可以这样玩这次,我终于学会了在ESP8266上面点亮LED灯了现在一个单片机的价格是几块,加上一个晶振,再来一个快递费,十几块钱还是需要的。所以能用这个ESP8266来当单片机玩,还是比较不错的可以在ub…...

脱不下孔乙己的长衫,现代的年轻人该怎么办?

“如果我没读过书,我还可以做别的工作,可我偏偏读过书” “学历本该是我的敲门砖,却成了我脱不下的长衫。” 最近,“脱下孔乙己的长衫”在网上火了。在鲁迅的原著小说中,孔乙己属于知识阶级(长衫客&#xf…...

Matlab实现遗传算法

遗传算法(Genetic Algorithm,GA)是一种基于生物进化理论的优化算法,通过模拟自然界中的遗传过程,来寻找最优解。 在遗传算法中,每个解被称为个体,每个个体由一组基因表示,每个基因是…...

评价公式-均方误差

均方误差的公式可以通过以下步骤推导得出: 假设有n个样本,真实值分别为y₁, y₂, ……, yₙ,预测值分别为ŷ₁, ŷ₂, ……, ŷₙ。 首先,我们可以定义误差(error)为预测值与真实值之间的差: …...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

【C++进阶篇】智能指针

C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...

git: early EOF

macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...