【Redis面试题】Redis常见的一些高频面试题

分享几个Redis入门级常见面试过程中遇到的题目!

你项目中哪里使用到了redis?可以讲一讲嘛

这个题目无论是大公司还是小公司都经常考,建议大家根据自己的项目做总结

redis的几种基础数据结构

redis为什么那么快?

1.基于内存实现:我们都知道内存读写是比磁盘读写快很多的。

2.合理的数据结构,他支持的数据结构如字符串、列表、集合等都是非常接近底层的,这意味着对数据的操作几乎是即时的。

3.redis的读写是单线程的。

4.Redis 使用非阻塞 I/O 模型,即事件驱动模型。这使得 Redis 能高效地处理来自客户端的多个连接和请求,即使在大量连接的情况下也能保持高性能。

从 Redis 6.0 开始,Redis 引入了对多线程的支持,但这种多线程的支持方式与传统的多线程数据库服务器有所不同。在 Redis 6.0 中,多线程主要用于处理网络 I/O,而不是数据的读写操作。

Redis 6.0 的多线程模型是一个有限的多线程模型,专注于优化网络 I/O 处理,而非数据操作。这种设计旨在提高 Redis 在多核 CPU 环境下处理大量并发网络请求的能力,同时保持其单线程执行命令的特性,确保操作的原子性和一致性。因此,尽管 Redis 6.0 支持多线程,但它的核心数据处理逻辑仍然是单线程的。

简述redis哨兵模式,缓存雪崩,缓存穿透,缓存击穿?

Redis 哨兵模式和缓存相关的几个问题(缓存雪崩、缓存穿透和缓存击穿)是分布式系统设计中常见的概念和问题。下面简要介绍每个概念:

Redis 哨兵模式(Sentinel)

Redis 哨兵模式是 Redis 的高可用性解决方案。在这种模式下,有一个或多个哨兵实例对 Redis 服务器(master 以及其 replicas)进行监控。哨兵的主要任务包括:

  1. 监控:哨兵会检测 Redis 主服务器和从服务器是否正常工作。
  2. 通知:当某个 Redis 实例出现问题时,哨兵可以通过 API 向管理员或其他应用程序发送通知。
  3. 自动故障转移:如果主服务器不可用,哨兵会自动将一个从服务器升级为新的主服务器,并让其他从服务器指向新的主服务器。
  4. 配置提供者:客户端可以询问哨兵当前哪个 Redis 实例是主服务器,并进行连接。

缓存雪崩

缓存雪崩是指在某一个时间点,由于大量的缓存同时失效,导致大量的请求直接落到数据库上,造成数据库压力骤增,甚至引发数据库宕机的现象。缓存雪崩可能因为缓存同一时间设置的过期时间导致的。

解决策略

  • 设置不同的过期时间,避免同时大量缓存过期。
  • 使用持久化存储作为备份,如 Redis 的 RDB 或 AOF。
  • 限流降级策略,避免数据库被打垮。

缓存穿透

缓存穿透是指查询一个数据库中不存在的数据。由于缓存是不命中的,每次查询都要到数据库查询,导致数据库压力增大。

解决策略

  • 对查询结果为空的情况也进行缓存,避免对同一数据的重复查询打到数据库上。
  • 使用布隆过滤器,将所有可能查询的数据哈希到一个足够大的位数组中,一个不存在的数据会被这个布隆过滤器拦截掉,从而避免对数据库的查询。

缓存击穿

缓存击穿是指一个热点的 key 在缓存中过期的瞬间,同时有大量的请求查询这个 key。这时,这些请求都会落到数据库上,造成数据库短时间内大量的请求压力。

解决策略

  • 设置热点数据永不过期,或者用互斥锁控制对这个 key 的数据库访问请求,确保即使缓存失效,对数据库的访问也是串行的。
  • 使用更细粒度的锁,例如分布式锁,来控制对这个热点 key 的访问。

理解这些概念和相应的解决策略对于设计高效、可靠的缓存系统至关重要,可以有效地提升应用的性能和稳定性。

Redis的缓存淘汰算法

FIFO(先进先出): 根据缓存被储存的时间,离当前最远的数据优先被淘汰

LRU(最近最少使用): 根据最近被使用的时间,离当前最远的数据优先被淘汰

LFU(最不经常使用): 在一段时间内,缓存数据被使用次数最少的会被淘汰

LRU 缓存实现

如果碰到这种题⽬先不要慌张,现在脑海⾥回忆⼀遍 LRU 的基本概念:LRU(Least Recently Used,最近最少使⽤)是⼀种缓存算法,其核⼼思想是将最近最少使⽤的缓存项移除,以便为更常 ⽤的缓存项腾出空间。

适⽤场景:

  • 频繁访问:LRU 算法适⽤于那些有频繁访问的数据,⽐如缓存、⻚⾯置换等场景。
  • 有局部性:当访问模式具有局部性,即近期访问的数据更可能在未来被再次访问时,LRU 算法 能够有较好的表现。
  • 数据访问分布均匀:如果数据的访问分布较为均匀,没有出现热点数据或周期性访问模式, LRU 算法的命中率较⾼。
  • 缓存容ᰁ适中:LRU 算法适⽤于缓存容ᰁ适中的场景,过⼤的缓存可能导致淘汰开销增⼤,⽽过⼩的缓存则可能导致频繁缓存失效。

在 Java 中,可以使⽤ LinkedHashMap 来实现 LRU 缓存。使⽤LinkedHashMap实现 LRU 缓存可 以极⼤地简化代码,因为LinkedHashMap已经内置了按照访问顺序排序的功能。所以使⽤LinkedHashMap 确实可以避免⼿动实现双向链表和节点的逻辑。

为了使⽤ LinkedHashMap 来实现 LRU 缓存,在创建 LinkedHashMap 对象时设置它的访问顺序为 true,这样元素将按照访问顺序进⾏排序。然后,我们可以重写它的 removeEldestEntry ⽅法来控制 是否移除最⽼的数据。

import java.util.LinkedHashMap;
import java.util.Map;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {private int capacity;    public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}public int get(int key) {return super.getOrDefault(key, -1);}public void put(int key, int value) {super.put(key, value);}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {// 当缓存元素个数超过容ᰁ时,移除最⽼的元素return size() > capacity;}public static void main(String[] args) {// 创建⼀个容ᰁ为3的LRU缓存LRUCache<Integer, String> lruCache = new LRUCache<>(3);// 添加数据lruCache.put(1, "One");lruCache.put(2, "Two");lruCache.put(3, "Three");// 此时缓存为:{1=One, 2=Two, 3=Three}// 访问某个元素,使其成为最近访问的元素String value = lruCache.get(2);// 此时缓存为:{1=One, 3=Three, 2=Two}// 添加新的数据,触发淘汰lruCache.put(4, "Four");// 此时缓存为:{3=Three, 2=Two, 4=Four}// 元素1被淘汰,因为它是最近最少访问的元素}
}

在上⾯的代码中, removeEldestEntry ⽅法是⽤于控制是否移除最⽼的数据。当缓存⼤⼩超过指定容 ᰁ时, removeEldestEntry 会返回 true,表示需要移除最⽼的数据。这样,通过 LinkedHashMap 和 重写 removeEldestEntry ⽅法,实现了⼀个简单的 LRU 缓存。

对于⾯试时遇到 LRU 实现的问题,如果不限制使⽤特定的数据结构,可以直接采⽤上述⽅案来进 ⾏简单实现。

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

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

相关文章

如何在postman上提交文件格式的数据

如何在postman上提交文件格式的数据 今天在写一个文件上传的功能接口时&#xff0c;想用postman进行提交&#xff0c;花了些时间才找到在postman提交文件格式的数据。记录一下吧&#xff01; 1.打开postman&#xff0c;选择POST提交方式&#xff0c;然后在Params那一行的Head…

protobuf在配置文件管理上的应用

TextFormat::ParseFromString 是 Google Protocol Buffers&#xff08;通常简称为 Protobuf&#xff09;库中的一个函数&#xff0c;用于从文本格式解析消息。Protobuf 是一种用于序列化结构化数据的库&#xff0c;它允许你定义数据的结构&#xff0c;然后自动生成源代码来处理…

可视化大屏应用场景:智慧安防,保驾护航

hello&#xff0c;我是大千UI工场&#xff0c;本篇分享智慧安防的大屏设计&#xff0c;关注我们&#xff0c;学习N多UI干货&#xff0c;有设计需求&#xff0c;我们也可以接单。 实时监控与预警 可视化大屏可以将安防系统中的监控画面、报警信息、传感器数据等实时展示在大屏上…

【C++】学习笔记——string_5

文章目录 六、string类7. string类的模拟实现8. string类的模拟实现的完整代码string.h头文件test.c源文件 9. string收尾写时拷贝 未完待续 六、string类 7. string类的模拟实现 我们之前讲了实现 insert &#xff0c;但是那个插入函数仅仅是在 pos 位置插入一个字符而且&am…

SpirngBoot整合快递100

目录 一、注册快递100 二、技术文档地址 三、需要认证的key和comcumer 四、spring boot 整合快递 100使用 4.1 引入快递100和hutool的依赖 4.2 将key和comcumer写入application.properties文件中 4.3 新建一个modle,用于将查出来的json数据转成对象 4.4 新建一个controll…

网络安全实训Day16

网络空间安全实训-渗透测试 漏洞扫描 定义 扫描和探测目标范围内的主机存在哪些安全漏洞&#xff0c;或扫描目标范围内的那些主机存在某个指定的漏洞 漏扫工具 AWVS APPScan MSF 使用MSF扫描漏洞并利用 1.搜索需要的攻击模块 search ms17-010 2.使用攻击模块 use 模块名称…

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路&#xff1a; 导入必要的库和模块&#xff1a;首先&#xff0c;我们导入了Python的os、time库以及pygame库&#xff0c;还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…

ElasticSearch01(ES简介,安装ES,操作索引,操作文档,RestAPI)【全详解】

目录 一、ES简介 1. 数据库查询的问题 2. ES简介 1 ElasticSearch简介 2 ElasticSearch发展 3. 倒排索引【面试】 1 正向索引 2 倒排索引 4. ES和MySql 5. 小结 二、安装ES 1. 方式1:使用docker安装 1 准备工作 2 创建ElasticSearch容器 3 给ElasticSearch配置i…

有限单元法-编程与软件应用(崔济东、沈雪龙)【PDF下载】

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

vue2项目webpack3.x打包文件分割优化加载

vue2项目webpack3.x打包文件分割优化加载 0. 项目目录和依赖信息1. 开启 gzip&#xff08;建议&#xff09;2. vue2项目配置懒加载&#xff08;建议&#xff09;3. 拆分 vendor 包注意&#xff1a;webpack3使用CommonsChunkPlugin实现 本文使用 3 种方案进行叠加优化 优先级按以…

postman一直转圈圈,无法启动

解决 地址栏输入%appdata%进入此目录&#xff0c;删除%appdata%目录下的postman文件可以解决问题。

node.js中path模块-路径处理,语法讲解

node中的path 模块是node.js的基础语法&#xff0c;实际开发中&#xff0c;我们通过使用 path 模块来得到绝对路径&#xff0c;避免因为相对路径带来的找不到资源的问题。 具体来说&#xff1a;Node.js 执行 JS 代码时&#xff0c;代码中的路径都是以终端所在文件夹出发查找相…

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入&#xff1a;机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…

SpringBoot中实现发送邮件

概要 在Spring Boot中发送电子邮件相对简单。你可以使用Spring的邮件支持来实现这一点。 步骤&#xff1a; 1.添加依赖&#xff1a;首先&#xff0c;需要在你的pom.xml文件中添加Spring Boot的邮件发送器依赖。 2. 配置邮件服务器&#xff1a;在application.properties或app…

网络相关知识总结

1、网口设置 网口设置IP&#xff0c;即操作/etc/sysconfig/network-scripts路径下的ifcfg-xx文件 主要参数详解&#xff1a; DEVICE:网口名 ONBOOT&#xff1a;表示启动系统时是否激活网卡&#xff0c;yes为激活&#xff0c;no不激活 HWADDR:mac值 DEFROUTE://默认路由设置…

RTMP 直播推流 Demo(一)—— 项目配置与视频预览

音视频编解码系列目录&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff09;—— 音频解码与音视频同步 RTMP 直播推流 Demo&#xff08;一&#xff09;—— 项目…

linux 服务器利用阿里网盘API实现文件的上传和下载

文章目录 背景脚本初始化 阿里云盘API工具 aligo安装aligoaligo教程实战parse.py 演示上传文件上传文件夹下载文件下载文件夹 背景 最近在用ubuntu系统做实验&#xff0c;而ubuntu 系统的文件上传和下载操作很麻烦&#xff1b; 于是便打算使用阿里网盘的API 进行文件下载与上传…

Docker - 修改服务的端口

1. 测试 新建一个httpd服务 docker run -itd -p 1314:80 --name test -h test httpd 2. 先停止容器和 docke r服务 docker stop test #停止容器3. 修改配置 cd /var/lib/docker/containers ls 找到需要修改的 cd 1fc55f0d24014217cff68c9a417ca46cf50312caa5c9e6bb24085126…

为什么 IP 地址通常以 192.168 开头?(精简版)

网络通讯的本质就是收发数据包。如果说收发数据包就跟收发快递一样。IP地址就类似于快递上填的收件地址和发件地址一样&#xff0c;路由器就充当快递员的角色&#xff0c;在这个纷繁复杂的网络世界里找到该由谁来接收这个数据包&#xff0c;所以说&#xff1a;IP地址就像快递里…

django搭建一个AI博客进行YouTube视频自动生成文字博客

文章目录 一、生成Django框架二、项目代码&#xff08;前端&#xff09;1、编写前端代码&#xff08;正文界面&#xff09;1.1、生产html框架1.2、添加live preview扩展1.3、更改title元素中文本1.4、添加CDN&#xff08;CSS&#xff09;样式链接1.5、nav标签1.6、在body标签中…