【Redis】面试题

1. 为什么要用缓存

1. 提高系统的读写性能。
2. 减轻数据库的压力,防止大量的请求到达数据库,让数据库压力剧增,拖垮数据库。redis数据存储在内存中,高效的数据结构,读写数据比数据库快。
将热点数据存储在redis当中,可以提高热点数据的访问速度。

2. 什么是redis

- redis是开源的,数据存储在内存的非关系型数据库。
- 可以作为数据库存储数据,缓存数据,也可以作为消息中心件。
- redis的网络请求模块是一个单线程的,基于多路复用的性能I/O模型实现redis单线程机制下的数据高速访问。
- 具备数据持久化的功能,提供了AOF和RDB两种数据持久化机制,确保服务宕机之后,数据不会丢失。
- 哨兵机制和Cluster集群模式确保redis的高可用。

3. redis中的线程模型

https://www.cnblogs.com/reecelin/p/13538382.htmlredis开发了自己的文件事件处理器。文件事件处理器由Socket、IO多路复用程序、文件事件分派器,事件处理器四部分组成。IO多路复用程序就是指一个线程处理多个I/O流。多路复用程序会一直监听socket产生的套接字上的连接请求和数据请求,
一旦有请求到达,会触发对应的事件,redis会将这些事件放进一个事件队列,文件事件分派器会对队列中的事件不断处理,
根据事件类型调用不同的文件事件处理器来处理。
因为redis是讲事件放入事件队列中,redis无需一直轮询是否有请求实际发生。这样redis就不会阻塞在某一个特定的套接字上。文件事件处理器由三种:连接应答事件处理器命令请求事件处理器命令回复事件处理器事件种类:AE_READABLE: 客户端连接请求时,连接应答事件与socket的AE_READABLE的事件连接起来客户端命令请求时,命令请求事件与socket的AE_READABLE的事件连接起来AE_WRITEABLE:服务端有数据回传给客户端时,服务端讲命令回复事件处理器与socket的AE_WRITEABLE事件连接起来。示例:当客户端与服务端有需要返回的写命令操作时:客服端发起对redis的连接,redis中的socket的连接监听套接字触发AE_READABLE事件,事件进入队列,文件事件分派器分派事件,连接应答事件处理器与AE_READABLE建立关联。客服端发起写命令,redis中的套接字产生AE_READABLE事件,事件进入队列,文件事件分派器分派事件,命令请求事件处理器与AE_READABLE建立关联

4. redis持久化实现有哪些?有什么区别?

AOF:记录redis的写后命令。优点:数据安全:AOF有三种写回策略,当配置always时,同步写回,基本不会丢失数据。当配置everysec时,每秒写回,不会影响每次的写操作,可能会丢失1s的数据。
缺点:恢复速度:服务宕机之后,AOF需要根据命令执行恢复数据,速度慢。阻碍主线程:当AOF文件过大的时候,主线程需要fork bgrewirteaof线程来进行AOF文件的重写,阻碍主线程。比RDB占用更多的空间RDB:内存快照,记录某一时刻的内存数据。优点:	存放的是内存快照数据,数据恢复速度比AOF快。性能最大化,fork bgsave子线程来完成数据记录,让主线程继续处理命令。缺点:数据安全性低,RDB是每隔一段时间数据持久化,持久化之间服务宕机数据将会丢失。内存快照频率不好把握。如何选择:结合AOF和RDB一起使用。每次内存快照使用RDB方式,在内存快照期间使用AOF方式持久化数据

5. redis哨兵机制

6. redis的Cluster集群模式

7. 为什么使用redis而不是使用memcache

支持的数据类型不同memcache:仅支持key-value的数据结构。redis:不仅支持key-value的string字符串数据结构,还支持hash、set、list、sorted set基本数据结构,还支持Bitmap、HyperLogLog、GEO等数据结构。数据持久化memcache:不支持数据持久化,如果服务宕机,数据就全丢失了。redis:支持AOF\RDB两种方式的数据持久化,可以定期的讲数据持久化到磁盘,当服务宕机后,可以根据持久化数据恢复数据。存储的数据类型大小memcache:单个value的最大值为1mredis:单个value的最大值为512m集群模式memcache:不支持集群模式,如果硬要实现集群模式,需要客户端自己实现,然后往集群中的分片写数据redis:原生就支持集群模式,不需要而外的开发来实现。在企业级的场景下单单进支持key-value的数据结构就已经不能满足业务的需求,所以使用redis。

8. 为什么单线程模型的redis效率那么高?

首先:redis并不是所有的操作都是单线程的。redis中的单线程是指网络IO和数据的读写是单线程的。redis中的数据持久化,异步删除,集群数据同步等是由而外的线程实现的。redis效率为什么那么高?1. 纯内存操作。2. 高效的数据结构。3. 基于非阻塞的多路复用的I/O模型实现的。4. 网络IO和数据读写的单线程可以避免多线程频繁的上下文切换,避免多线程开发的并发控制问题。

9. 为什么redis把数据都存在内存中

1. 提高数据的访问效率。内存的访问效率在几十纳秒到几百纳秒之间,而磁盘的访问效率在几微妙甚至几毫秒之间。
如果数据放到磁盘当中,磁盘I/O将会严重影响redis的响应效率。2. redis提供数据持久化功能,不用担心服务重启数据丢失问题。

10. redis的同步机制

redis提供主从库模式,一个主库可以有多个从库。redis的写操作只会写到主库,为了保持主从库的数据同步,这里就涉及到数据同步。同步机制:主从库之间的第一次同步:

11. redis缓存淘汰机制

不进行淘汰
设置了过期时间的数据淘汰:volatile-ttl:先过期的先淘汰。volatile-random: 随机淘汰。volatile-lru: lru算法淘汰。volatile-lfu:lfu算法淘汰。所有key中数据淘汰:allkeys-random: 随机淘汰。allkeys-lru: lru算法淘汰。allkeys-lfu: lfu算法淘汰。

12. lfu淘汰算法、lfu淘汰算法

13. redis为什么设计成单线程?

1. 多线程处理会涉及到多线程竞争同一个资源的问题,使用单线程可以避免多线程硬气的并发资源访问问题。
2. redis的多路复用I/O使得单线程的redis也能高效的处理客服端请求。
3. redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽,所以没有必要多线程

14. redis实例有哪些阻塞点?

	- 集合全量查询和聚合操作:HGETALL、SMEMBERS,以及集合的聚合统计- bigkey删除操作- 清空数据库:FLUSHDB、FLUSHALL操作- AOF日志同步写回- AOF日志重写- 从库加载RDB文件:从库接收到RDB文件之后,会清空数据库并加载RDB文件。

15. 什么是bigkey有什么影响?

占用内存空间很大的key。1. 网络阻塞,获取bigkey时,传输的数据量较大,增加带宽压力。
2. 操作效率低。
3. 删除bigkey可能会阻塞主线程。因为删除bigkey,释放键值对占用的内存空间,操作系统需要向释放掉的内空块
插入一个空闲内存块连表,如果释放大量内存,空间内存块链表操作时间会增加。

17. redis的集群模式有哪些?

18. 是否使用过 Redis Cluster 集群,集群的原理是什么?

19. Redis Cluster 集群方案什么情况下会导致整个集群不可用?

20. Redis 集群架构模式有哪几种?

21. 说说 Redis 哈希槽的概念

22. Redis 常见性能问题和解决方案有哪些

- Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件;
- 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次;
- 为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网内;
- 尽量避免在压力很大的主库上增加从库;
- 采用主-从-从集群结构

23.

24. 如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

注意缓存雪崩如果大量key相同时间过期,可能大量请求缺失缓存,都请求到数据库,给数据库造成很大压力,导致数据库崩溃,服务无法正常提供请求。如何解决大量key相同时间过期的问题?给数据的过期时间加一个随机值,分散数据。

25. 缓存和数据库谁先更新呢?

为了保持缓冲和数据库的一致性,有两种数据更新方式1. 先删除缓存、后更新数据库没有并发请求的情况下先删除缓存,如果数据库更新失败,数据库的数据还是旧数据,这个时候可以删除重试解决。有并发请求的情况下A请求删除缓存之后,有B请求进来发现缓存缺失,B又查询数据库重新缓存数据,这个时候A再更新数据库,缓存的数据还是旧的可以采用延迟双删解决2. 先更新数据库,后删除缓存没有并发请求的情况下	数据库更新成功,缓存删除失败,有请求进来读取到的还是旧缓存,可以采用重试缓存删除解决有并发请求的情况下数据库更新成功,缓存还未被删除,期间的请求读取到的还是旧缓存。更新数据库到缓存删除的期间可能会存在数据不一致的问题。那该如何选择那种处理方式呢?两种方案不使用外力作用都没有办法保证数据强一致性要求如果对数据一致性要求没有那么高的情况下,建议使用先更新数据库,后删除缓存为什么呢?1. 因为先删除缓存后更新数据库,可能请求缓存缺少,造成数据库压力增大。2. 先删除缓存,后更新数据库的延迟双删的等待时间不好设置。如果对数据强一致性要求我们就需要先在Redis缓存客户端暂存并发读请求,等数据库更新完、缓存值删除后,再读取数据,从而保证数据一致性

26. 怎么提高缓存命中率?

- 数据提前缓存
- 加大内存,缓存更多的数据
- 设置合适的淘汰策略

27. 缓存雪崩、缓存击穿、缓存穿透、缓存预热、缓存更新、缓存降级等问题?

- 缓存雪崩:原因:同一时间大量缓存失效,大量请求同时到达数据库,对数据库造成巨大压力,甚至服务宕机,无法提供使用。解决办法:1. 相同过期时间的key加随机值,分散过期时间。2. 源头上解决:系统实现上加锁或者队列的方式保证不会有大量的请求对数据库一次性的读写。- 缓存击穿:原因:访问非常频繁的数据在缓存中没有,导致大量请求到达数据库解决办法:1. 热点数据不设置过期时间。- 缓存穿透:原因:访问的数据在数据库和缓存中都没有。解决办法:	1. 缓存空值或者缺省值。2. 布隆过滤器

28. redis的数据类型,以及每种数据类型的使用场景?

五大基本数据类型1. string
2. hash
3. set
4. list
5. sorted set我讲下我项目中的使用情况吧
1. string类型,当然是应用最广泛的,比如我的项目发送验证码缓存验证码,接口并发控制等都使用string类型2. hash:key-value的键值对格式。我做的Api接口鉴权底层使用的就是hash格式。redis key为前缀+用户id,hashkey为应用编码
value为权限点编码数组3. set类型:实现用户的共同关注功能、SCARD命令计算用户的关注数。redis key为用户id、value存放关注的用户的id集合,计算两个用户的共同关注,取交集。当然还可以做其他去重、并集、差集等功能。不过Set的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致Redis实例阻塞,你可以从主从集群中选择一个从库,让它专门负责聚合计算,或者是把数据读取到客户端,在客户端来完成聚合统计4. sorted set:排行榜功能。
5. list
6. bitmap:统计用户一年访问页面的总天数其他数据类型
bitmap:统计
hyperLogLog: 统计页面的访问量
GEO:范围统计

29. redis是如何保证高可用的?

- 持久化机制
- 主从模式与哨兵机制
- Redis Cluster集群模式

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

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

相关文章

#P1004. [NOIP1998普及组] 三连击

题目描述 将 1, 2, \ldots , 91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1 : 2 : 31:2:3 的比例,试求出所有满足条件的 33 个三位数。 输入格式 无 输出格式 若干行,每行 33 个数字。按照…

数据结构:分块查找

分块查找,也叫索引顺序查找,算法实现除了需要查找表本身之外,还需要根据查找表建立一个索引表。例如图 1,给定一个查找表,其对应的索引表如图所示: 图 1 查找表及其对应的索引表 图 1 中,查找表…

小程序 账号的体验版正式版的账号信息及相关配置

siteinfo.js // 正式环境 const releaseConfig {appID: "",apiUrl: "",imgUrl: "" }; // 测试环境(包含开发环境和体验环境) const developConfig {appID: "",apiUrl: "",imgUrl: "" }…

相机可用性变化监听AvailabilityCallback流程分析

相机可用性变化监听及流程分析 一、接口说明 ​ 相机可用性变化监听可以通过CameraManager中的接口registerAvailabilityCallback()来设置回调&#xff0c;接口如下&#xff1a; /** *注册一个回调以获得有关相机设备可用性的通知。 * *<p>再次注册相同的回调将用提供…

Nginx性能优化配置

一、全局优化 # 工作进程数 worker_processes auto; # 建议 CPU核心数|CPU线程数# 最大支持的连接(open-file)数量&#xff1b;最大值受限于 Linux open files (ulimit -n) # 建议公式&#xff1a;worker_rlimit_nofile > worker_processes * worker_connections…

vue指令-v-for

vue指令-v-for 1、目标2、语法语法 1、目标 列表渲染&#xff0c;所在标签结构&#xff0c;按照数据数量&#xff0c;循环生成 2、语法 v-for "(值变量&#xff0c;索引变量) in 目标结构"示例&#xff1a; <template><div id"app"><di…

安装Anaconda3和MiniConda3

MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&#xff0c;请安装Anaconda。MiniConda3官方版还是一个开源的软件包管理系统和环境管理系统&#xff0c;能够帮助用户安装多个版本的软件…

ChatGPT漫谈(三)

AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…

上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则 点击添加规则 填写信息 3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 <template><div><input type="file" @change="handleFileChange" /&…

数值线性代数:奇异值分解SVD

本文记录计算矩阵奇异值分解SVD的原理与流程。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 零、预修 0.1 矩阵的奇异值 设列满秩矩阵&#xff0c;若的特征值为&#xff0c;则称为矩阵的奇异值。 0.2 SVD(分解)定理 设&#xff0c;则…

神经网络简单介绍

人工神经网络(artififial neural network) 简称神经网络&#xff0c;它是一种模仿生物神经网络结构和功能的非线性数学模型。 神经网络通过输入层接受原始特征信息&#xff0c;再通过隐藏层进行特征信息的加工和提取&#xff0c;最后通过输出层输出结果。 根据需要神经网络可以…

RTPSv2.2(中文版)

实时发布订阅协议 &#xff08;RTPS&#xff09; DDS互操作性 有线协议规范 V2.2 &#xff08;2014-09-01正式发布&#xff09; https://www.omg.org/spec/DDSI-RTPS/2.2/PDF 目 录 1 范围Scope 9 2 一致性Conformance 9 3 参考文献References 9 4 术语和定义Terms a…

centos(linux)手动配置ip地址

查看系统 查看ip 进入网卡配置的目录 [root178-119-30-16 ~]# cd /etc/sysconfig/network-scripts/ [root178-119-30-16 network-scripts]# ls ifcfg-ens192 ifdown ifdown-ippp ifdown-post ifdown-sit ifdown-tunnel ifup-bnep ifup-ipv6 ifup-plus…

【Mysql】万字长文带你快速掌握数据库基础概念及SQL基本操作

文章目录 前言一、数据库相关概念1. 什么是数据库2. 数据库的种类3. Mysql 简介4. SQL简介5. 数据库中常见的数据类型 二、SQL基础1. SQL通用语法2. SQL的主要分类3. DDL&#xff08;数据库&#xff0c;表&#xff0c;索引&#xff0c;视图&#xff09;4. DML&#xff08;数据的…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

【每日一题】—— A - 1-2-4 Test (AtCoder Beginner Contest 270)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

HiveSQL SparkSQL中常用知识点记录

目录 0. 相关文章链接 1. hive中多表full join主键重复问题 2. Hive中选出最新一个分区中新增和变化的数据 3. Hive中使用sort_array函数解决collet_list列表排序混乱问题 4. SQL中对小数位数很多的数值转换成文本的时候不使用科学计数法 5. HiveSQL & SparkSQL中炸裂…

c#[WebMethod]方法接收前端传入的JsonArray的方法

一、第一种方法&#xff1a;可以这样接收前端传入的jsonArray字符串到一个类的数组中&#xff0c;然后遍历该数组取值 这种方法需要创建PointConfig类 class PointConfig{public string ptcrossing { get; set; }public string ptcrossingId { get; set; }public string camId …

小程序动态隐藏分享按钮

// 禁用分享 wx.hideShareMenu({menus: [shareAppMessage, shareTimeline] })// 显示分享 wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline] })//私密消息 wx.updateShareMenu({isPrivateMessage: true, })

驱动开发day3 7.25

ioctl控制LED、蜂鸣器、风扇、马达 (为每一个硬件注册一个驱动) 头文件 #ifndef __HEAD_H__ #define __HEAD_H__typedef struct{volatile unsigned int MODER;volatile unsigned int OTYPER;volatile unsigned int OSPEEDR;volatile unsigned int PUPDR;volatile unsigned in…