Redis的面试题

2023-11-04

1.为什么使用Redis做缓存

redis具有高性能和高并发的特点

redis为什么具有高性能,或者说redis为什么快?

1.首先redis的数据存在内存中,所以比存储磁盘上的数据库快。

2.其次redis本身使用了高效的数据结构

redis内部的基本数据类型有String , List, Set, Hash, Sorted Set

底层的数据结构:

键的数据结构

(Note:存整数时以long来存储)

String-简单动态字符串(Simple Dynamic String,SDS)

1.一个数组存储实际数据buf

2.数组占用长度alloc

3.实际使用长度len

值的数据结构

String - 简单动态字符串

List - 双向链表/压缩列表

Set - 整数数组/哈希表

Hash - 哈希表/压缩列表

SortedSet - 跳表/压缩列表

压缩列表是紧凑的数据结构,占用内存小的同时在数据量不大时访问速度也不慢。

跳表是利用了二分查找的思想,对链表建立了多级索引

键值对的组织结构:

redis维护了两个交替使用的全局hash表,由key指向value的指针。

冲突过多时进行渐进式rehash。

每处理一个请求将该索引位置的所有数据移到新表中。

3.Redis的单线程模式和网络框架

redis采用网络IO多路复用机制,在网络IO操作中能并发的处理大量的请求。

Redis的核心网络模型是单线程的单reactor模型,利用Linux系统提供的epoll/select的IO多路复用技术,在单线程的事件循环中不断处理事件,回写响应数据到客户端。

IO模型是什么?有哪些IO模型?

(152条消息) linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO_xiaohuima_dong的专栏-CSDN博客https://blog.csdn.net/xiaohuima_dong/article/details/45096865?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164629562316781683974719%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164629562316781683974719&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-14-45096865.pc_search_insert_es_download&utm_term=epoll%2Fselect&spm=1018.2226.3001.4187

在linux系统下, 根据IO操作是否被阻塞以及同步异步问题进行分类,可以得到5种IO模型。

1.阻塞I/O模型

2.非阻塞I/O模型

3.I/O复用模型

linux提供了select/poll/epoll 三个系统调用接口,可以将多个fd的集合传入,因此可以同时监控多个socket是否就绪。把多个IO的阻塞复用到一个select之类的阻塞上,从而使得系统在单线程的情况下同时支持处理多个请求。

区别:

select:

(1)数量有限,最多支持1024个fd。

  (2) 只知道有事件,不知道在哪个IO流发生的事件,所以对返回的fd集合进行遍历

poll: 和select类似,但是没有数量的限制,fd列表由一个数组表示

epoll:

epoll_create 创建一个epoll的描述符

epoll_ctl 对监听的事件进行注册。 为fd注册回调函数,当可读可写时,发生中断,内核调用该Socket的callback函数,把该fd加入到就绪的事件链表。

epoll_wait 从内核得到事件的链表。

epoll是触发式的,没有以上的缺点。

4.信号驱动异步I/O模型

5.异步I/O模型

redis的IO多路复用提供了一定程度上的高并发的能力。

还可以通过主从复制实现读写分离提供更高程度的并发能力。

Redis的过期删除

惰性删除:客户端访问某个key的时候,如果过期了则删除

定期删除:定期执行扫描,选择随机20个key,如果过期的比例超过25%则重复操作。

Redis的淘汰策略

noeviction 对可能导致内存增大的返回错误

volatile/allkeys - lru/random

volatile-ttl 选择剩余存活时间最短的

Redis的lru是近似lru。随机采样5个key,淘汰最老的。

Redis的持久化机制

redis的持久化机制主要有RDB快照和AOF(Append-Only-File)日志

AOF日志在写命令执行完后会在磁盘记录。记录日志的频率由appendfsync配置。

Always 每次写后记录到磁盘。

Everysec 写后记录在内存缓冲区,每秒更新到磁盘

No 写后记录在缓冲区,由操作系统决定何时写到磁盘。 

AOF文件过大会进行重写。

RDB快照

记录内存快照到磁盘中。使用CopyOnWrite的方式复制。

调用bgsave(), 调用fork(), 父子进程共享物理地址,发生写的时候会copy对应的page, 父子各一份。

可以执行全量快照和增量快照,也可以和全量快照和AOF文件结合使用。

周期性持久化数据仍然会丢失:解决方案-Gemfire 

缓存雪崩、缓存穿透、缓存击穿

缓存雪崩:大量数据集中在某一时间失效,大量访问数据库。

(1)给key设置一个失效时间的随机波动值。

(2)多级缓存(本地缓存)

(3)热点数据永不过期

缓存穿透:key对应的数据在数据库中不存在,没有缓存值,在缓存中查询不到会到数据库中查。

(1)boolean过滤器,所有可能存在的数据hash到一个bitmap上,如果不存在会被拦截。

(2)空值也缓存到缓存里

缓存击穿:某个数据失效的一瞬间,大量数据访问数据库

(1)对数据的访问加互斥锁,当一个线程访问该数据时,其他缓存不能访问。

(2)热点数据永不过期

并发竞争key问题

多个线程的多个读写操作是非原子性的,所以会出现竞争问题。

多个线程修改同一个key。

解决方案:

1.乐观锁:

watch命令会监控某一个key,如果key被其他线程修改过则事务会回滚。(数据分片情况下不适用)

2.分布式锁

3.时间戳

4.在客户端加锁

缓存和数据库双写时的数据一致性

使用Cache Aside模式, 缓存更新时先更新数据库,然后再让缓存失效,为缓存设置过期时间。

Redis的主从同步

为什么要做主从同步?

同一份数据具有多个备份,提供高可靠性。主从库实现读写分类,提供更高的并发能力

主从同步的机制:

第一次数据同步进行全量复制:

第一步:从库向主库发出同步请求,双方协商

第二步:主库将调用bgsave()创建子进程生成RDB文件,传给从库,从库加载rdb文件

第三步:主库的replication buffer储存了RDB文件后的写操作,传给从库,从库执行这些写操作。

数据同步的维护:

基于长连接的命令传播

网络断开后的恢复

有一个环形缓冲区,主库指向写到的位置,从库指向读到的位置。断网后进行增量复制。

只能实现最终一致性,如果需要强一致性的话,可以用gemfire。

Redis的哨兵机制

redis的哨兵也是redis实例,具有三个功能

监控,选主,通知。

监控通过发送命令是否响应判断服务器工作状态。

(主观下线和客观下线)

主库客观下线要进行选主,执行主从切换

选主

选主操作的执行者称为leader, leader通过投票选举产生。

通知

通知从库与新主库建立连接。

通过发布订阅模式通知客户端与新主库建立连接

Redis的集群

数据过大,单机存储困难。运行速度慢(RDB生成时进行fork(),占用内存越大越慢)

将数据划分为多份,每份用一个redis实例来储存

Redis Cluter 方案 将所有的key映射到一个固定数量的hash槽中,将这些槽在数据库实例中进行分配。可以手动或自动分配。

客户端会存储哈希槽和实例的对应关系,查找数据时先计算哈希槽,再去对应实例中取。

Redis事务

Redis是单线程的数据库,能够单线程运行得益于

1. 数据储存在内存中,读取和修改很快(没有IO)

2.Transaction很短,修改和读取的数据少

所以Redis的事务不支持交互式的事务,而是以Stored Procedure的形式运行事务。用户将预先写好的事务代码提交,Redis以脚本的方式运行,但不额外提供事务的atomicity。 

Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。

如果要执行真正的事务,可以通过LUA脚本执行。Lua脚本具有原子性。

Lua脚本和Redis的事务一样,都是完全在Server端运行,不需要IO,具有局部性执行快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis的面试题 的相关文章

  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • WSL Redis 遇到系统尚未使用 systemd 作为 init 系统(PID 1)启动。无法操作[已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试遵循本文中讨论的 Redis 安装过程article https www digitalocean com community
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 如何测试我的 Redis 缓存是否正常工作?

    我已经安装了 django redis cache 和 redis py 我遵循了 Django 的缓存文档 据我所知 以下设置就是我所需要的 但我如何判断它是否正常工作 设置 py CACHES default BACKEND redis
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • Redis是如何实现高吞吐量和高性能的?

    我知道这是一个非常普遍的问题 但是 我想了解允许 Redis 或 MemCached Cassandra 等缓存 以惊人的性能极限工作的主要架构决策是什么 如何维持连接 连接是 TCP 还是 HTTP 我知道它完全是用C写的 内存是如何管理
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • 为什么Redis中没有有序的hashmap?

    Redis 数据类型 http redis io topics data types包括排序集 http redis io topics data types intro sorted sets以及其他用于键值存储的必要数据结构 但我想知道
  • Redis+Docker+Django - 错误 111 连接被拒绝

    我正在尝试使用 Redis 作为使用 Docker Compose 的 Django 项目的 Celery 代理 我无法弄清楚我到底做错了什么 但尽管控制台日志消息告诉我 Redis 正在运行并接受连接 事实上 当我这样做时 docker
  • 如何配置Lettuce Redis集群异步连接池

    我正在配置我的生菜重新分配池 当我按照官方文档配置时 连接池无法正常初始化 无法获取连接 官方文档指出 RedisClusterClient clusterClient RedisClusterClient create RedisURI
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • 由于配置文件错误,无法启动 Redis 服务器

    我刚刚按照此处的说明安装了 Redis http redis io download http redis io download 当我运行 redis server redis conf 时出现以下错误 FATAL CONFIG FILE
  • 使用环境变量在 redis.conf 中设置动态路径

    我有一个环境变量MY HOME其中有一个目录的路径 home abc 现在 我有一个redis conf文件 我需要像这样设置这个路径 redis conf pidfile MY HOME local var pids redis pid
  • 将文件传递给活动作业/后台作业

    我通过标准文件输入接收请求参数中的文件 def create file params file upload Upload create file file filename img png end 但是 对于大型上传 我想在后台作业中执行
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • ServiceStack PooledRedisClientManager 故障转移如何工作?

    根据 git commit 消息 ServiceStack 最近添加了故障转移支持 我最初认为这意味着我可以关闭我的一个 Redis 实例 并且我的池客户端管理器将优雅地处理故障转移并尝试与我的备用 Redis 实例之一连接 不幸的是 我的

随机推荐

  • React兄弟组件之间的通讯

    案例要求 达到这样一个效果 组件拆分 搜索框是一个组件 传递状态 下面的展示列表是一个组件 使用状态 方式一 状态存在父组件之间 父组件传递给子组件消息可以使用props 子组件给父组件之间传递消息可以使用函数实现 APP组件代码 impo
  • 计算机D盘无法读取,解决Mac上的USB错误“此计算机无法读取您插入的磁盘”

    尽管USB驱动器是最紧凑 最可靠的存储解决方案 但遇到它们的问题并不少见 您可能会发现该设备不可访问 或者在连接设备时可能会遇到诸如 此计算机无法读取您插入的磁盘 之类的错误消息 您如何解决此类错误 是否可以再次访问无法读取的USB上的数据
  • 一文搞懂vue的$attrs和$listeners,和react props的对比后更容易记忆

    近期编写vue组件 用到vue新增的api attrs和 listeners 看了网上很多帖子 感觉介绍的都不直观 并不能让使用者快速了解二者到底是什么作用 本文结合实际使用场景 给出 attrs和 listeners的使用方法 并且引入引
  • gemm c++

    http www pittnuts com 2015 08 gemm of caffe 转载于 https www cnblogs com Wanggcong p 5281521 html
  • SpringBoot>16 - 使用 @Scheduled 实现定时任务

    简介 实现定时任务的方式很多 基于JDK的Timer Quartz等等 本章介绍 SpringBoot1 5 中Spring Task实现定时任务 非常方便 个人学习总结 链接 springboot springcloud docker 等
  • 【STM32】【HAL库】遥控关灯2 分机

    相关连接 STM32 HAL库 遥控关灯0 概述 STM32 HAL库 遥控关灯1主机 STM32 HAL库 遥控关灯2 分机 STM32 HAL库 遥控关灯3 遥控器 需求 接收RF433和红外信号 根据信号内容控制舵机 硬件设计 主控采
  • 什么是DevOps的三步工作法?

    作者介绍 张乐 DevOps时代联合创始人 高效运维社区合伙人 DevOpsDays大会 GOPS全球运维大会金牌讲师 国内首批DevOps Master 前百度资深敏捷教练 架构师 超过十四年敏捷转型 工程效能提升和大型项目管理实践经验
  • 电源篇 -- 降压电路(DCDC,非隔离)

    感谢阅读本文 在接下来很长的一段时间里 我将陆续分享项目实战经验 从电源 单片机 晶体管 驱动电路 显示电路 有线通讯 无线通信 传感器 原理图设计 PCB设计 软件设计 上位机等 给新手综合学习的平台 给老司机交流的平台 所有文章来源于项
  • 通过python实现局域网内传输大文件

    通过微信 网盘等进行传输速度很慢而且浪费流量 身旁又没有U盘等便携存储设备 那有没有一个方便的而且不用编程的局域网内传输的方式 那肯定有 step1 打开cmd cd进入需要分享的文件夹下 或者打开文件夹下 在当前路径下 打开cmd ste
  • Linux系统安装mysql

    1 卸载残留 如果服务器之前安装过mysql请先卸载 我这里是用yum安装的 现在通过yum去卸载 yum remove y mysql find name mysql 找到所有残留的文件 再通过rm rf去删除 2 卸载完成后 使用以下命
  • 乘积尾零

    如下的10行数据 每行有10个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 443
  • R语言第七讲 线性回归分析案例

    题目 MASS 库中包含 Boston 波士顿房价 数据集 它记录了波士顿周围 506 个街区的 medv 房价中位数 我们将设法用 13 个预测变量如 rm 每栋住宅的平均房间数 age 平均房 龄 lstat 社会经济地位低的家庭所占比
  • 017-爬虫-爬虫结果存入 sqlserver

    先上图 结果 一 利用这个模块连接sql server import pymssql 引入pymssql模块 安装方式 conda install pymssql 二 连接失败的可能原因 参考此博客 需要开启几个服务 https blog
  • win10中anaconda安装tensorflow时报错Traceback (most recent call last): File “E:\Anaconda3\lib\site-packag

    windows系统anaconda安装tensorflow时报错解决办法 报错 Traceback most recent call last File E Anaconda3 lib site packages pip vendor ur
  • 数组的复制(Java技巧篇,四种方法详解)

    使用java lang System类中的arraycopy方法 优点 该方法可复制全部内容 也可复制一部分成为子数组 且目标数组与源数组没有关系 目标数组可以比源数组大 比较灵活 缺点 返回值为void 所以需要手动创建目标数组 参数含义
  • OA项目之我的审批(查询&会议签字&审批)

    目录 会议查询 会议签字 会议审批 讲解思路 我的审批查询功能 手写签批插件及工具类介绍 手写签批插件集成 手写签批功能实现 会议查询 MeetingInfoDao java 我的审批 public List
  • 毕业设计-基于机器学习的二维码和条形码识别

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • STM32F10xNVIC探究与学习_2021-04-24

    NVIC探究与学习 嵌套向量中断控制器 NVIC NVIC 驱动有多种用途 例如使能或者失能 IRQ 中断 使能或者失能单独的 IRQ 通道 改变 IRQ 通道的优 先级等等 NVIC Enable 中断设置使能寄存器 Disable 中断
  • SQL Server 数据加密功能解析

    数据加密是数据库被破解 物理介质被盗 备份被窃取的最后一道防线 数据加密 一方面解决数据被窃取安全问题 另一方面有关法律要求强制加密数据 SQL Server的数据加密相较于其他数据库 功能相对完善 加密方法较多 通常来讲 数据加密分为对称
  • Redis的面试题

    1 为什么使用Redis做缓存 redis具有高性能和高并发的特点 redis为什么具有高性能 或者说redis为什么快 1 首先redis的数据存在内存中 所以比存储磁盘上的数据库快 2 其次redis本身使用了高效的数据结构 redis