面试集中营—Redis面试题

一、Redis的线程模型

        Redis是基于非阻塞的IO复用模型,内部使用文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型,它采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器进行处理。

        文件事件处理器的结构包括四个部分

       1、多个socket;

       2、IO多路复用程序

       3、文件事件分排器

       4、事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

       多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程 序会 监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理

二、客户端与Redis服务器的一次通讯过程

        一次通讯的过程如下图所示:

       1、客户端socket01发起建立连接的请求,此时Server Socket会产生一个AE_READABLE事件,IO多路复用程序监听到这个事件后把事件压入事件队列中;

       2、文件事件分派器从队列中拿到事件,根据事件的类型分发给连接应答处理器,创建socket01,并将socket01的AE_READABLE事件与命令请求处理器关联,这样下次的AE_READABLE事件就不是由连接应答处理器处理而是由命令请求处理器处理;

       3、连接建立成功后,客户端发送set key  value 请求,Server Socket会再产生一个AE_READABLE事件,IO多路复用程序监听到这个事件后把事件压入事件队列中,文件事件分派器从队列中拿到事件,交由命令请求处理器处理;

       4、命令请求处理器从socket01中的读取key value请求,并完成key value的设置,将socket01的AE_WRITABLE事件与命令回复处理器关联;

       5、如果此时客户端准备好接收返回结果了,那么Server Socket会产生AE_WRITABLE事件,同样压入队列中,事件分派器找到相关联的命令回复处理器,向socket01输出本次操作的一个结果,最后将AE_WRITABLE事件与命令回复处理器解除关联;

       本次请求完成

三、Redis Cluster的原理

        Redis集群中内置了16384个哈希槽,当需要在Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样每个key都会对应一个编号0-16384之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点上。

        1、所有节点相互是连接的,客户端连接任意节点都可以操作所有的数据;

        2、集群消息通信通过集群总线通信,集群总线端口大小为客户端服务端口 + 10000;

3、 节点与节点之间通过二进制协议进行通信
        4、数据按照 Slot 存储分布在多个 Redis 实例上
 
        5、集群节点挂掉会自动故障转移
        6、可以相对平滑扩/ 缩容节点

四、如果有大量的key需要设置同一时间过期,需要注意什么

        如果有大量的 key 在同一时间过期,那么可能同一秒都从数据库获取数据,给数据库造成很大的压力,导致数据库崩溃,系统出现 502 问题。也有可能同时失效,那一刻不用都访问数据库,压力不够大的话,那么 Redis 会出现短暂的卡顿问题。所以为了预防这种问题的发生,最好给 数据的过期 时间加一个随机值,让过期时间更加分散。

五、缓存和数据库的读写一致性问题

        这里比较简单的方法就是当一个更新请求过来的时候,先删除缓存数据,再更新数据库,最后再更新缓存。

        写请求删除缓存成功,则更新数据库,如果更新数据库失败,则直接返回,写请求结束,此 时数据库中的值依旧是旧值,读请求过来后,发现缓存中没有数据, 则会直接向数据库中请求, 同时将数据写入到缓存中,此时也不会出现数据一致性的问题。

        更新数据成功之后,再更新缓存,如果此时更新缓存失败,则缓存中没有数据,数据库中是 新值,写请求结束,此时读请求还是一样,发现缓存中没有数据,同样会从数据库中读取数据, 并且存入到缓存中,其实这里不管更新缓存成功还是失败,都不会出现数据一致性的问题。

       以上其实没啥问题,问题在于,如果一个更新请求还没有结束,比如刚删了缓存,读请求进来了,此时数据库还没有更新,那么读取的就是老的数据,这就要看是否容忍这种问题。如果不能容忍那么就必须要针对同id数据的读写请求进行排队,写请求进来先进入队列,读请求排在后面等写请求完成了,再处理读请求。

六、缓存雪崩、缓存穿透、缓存预热

缓存雪崩

        缓存雪崩就是大量的key在同一时间过期,此时大部分请求都打到了数据库上,造成了数据库CPU和内存的压力过大可能成为数据库宕机,此时会造成更大面积的系统瘫痪,就好像雪崩一样。

        解决的方法第一种就是在读数据的时候先加一层锁,比如redis的分布式锁,只让一个请求进入数据库去查询。第二种方法就是尽量不让大量的key在同一时间过期,比如过期时间上增加一个随机时间;

缓存穿透

        缓存穿透就是指查询一个在缓存中不存在的key,由于不存在会去查询数据库,如果大量的查询不存在的key,还是会对数据库造成大量的压力。

        解决的方法第一种是如果发现数据库中不存在的key,也在redis中缓存一份,过期时间5分钟,这样5分种内同样的key查询就不会进入数据库了;第二种方式是使用布隆过滤器,这需要将所有可能的数据都存到了一个足够大的bitmap中,通过布隆过滤器可以确定请求的key是否合法;

缓存预热

        缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户
请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

七、过期策略以及内存淘汰机制

过期策略        

        针对Key过期的情况,redis采用了定期删除配合惰性删除的策略;

        定期删除:每个100ms检查过期的key,如果由过期的key就删除,但每次不是全量的检查,而是随机抽取进行检查,比如抽取100个,发现其中由20个过期了,就把这20个key删除掉。如果过期 key 的占比超过可接受的过期 key 的百分比(比如20%),则重复删除的过程,直到过期key的比例降至可接受的过期 key 的百分比以下。

        惰性删除:惰性删除是指当客户端请求某个key的时候,会检查这个key是否过期,如果过期了就删除掉;

 内存淘汰机制      

        内存总会有用完的时候,如果内存已经占满了,怎么办呢?这就需要淘汰一部分的key,那么怎么淘汰呢?     

8种内存淘汰策略

1.noeviction(默认策略): 不会删除任何数据,拒绝所有写入操作并返回客户端错误消息(error)OOM command not allowed when used memory,此时 Redis 只响应删和读操作;

2.allkeys-lru: 从所有 key 中使用 LRU 算法进行淘汰(LRU 算法:最近最少使用算法);

3.allkeys-lfu: 从所有 key 中使用 LFU 算法进行淘汰(LFU 算法:最不常用算法,根据使用频率计算,4.0 版本新增);

4.volatile-lru: 从设置了过期时间的 key 中使用 LRU 算法进行淘汰;

5.volatile-lfu: 从设置了过期时间的 key 中使用 LFU 算法进行淘汰;

6.allkeys-random: 从所有 key 中随机淘汰数据;

7.volatile-random: 从设置了过期时间的 key 中随机淘汰数据;

8.volatile-ttl: 在设置了过期时间的key中,淘汰过期时间剩余最短的。

注意: 当使用 volatile-lru、volatile-lfu、volatile-random、volatile-ttl 这四种淘汰策略时,如果没有 key 可以淘汰,则和 neoviction 一样返回错误。

怎么选择淘汰策略

一般根据经验来说:

使用 allkeys-lru 策略场景:

        1.当你期望元素的子集将比其他元素更频繁地被访问时,比如幂律分布,20%的数据占有80%的使用次数;

        2.当你不确定使用哪种策略时。

使用 allkeys-random 策略场景:

        1.当你有一个循环访问,其中所有 key 进行会被连续地访问;

        2.当你希望所有 key 的分布比较均匀。

使用 volatile-ttl 策略场景:

        1.当你大部分缓存都设有不同的 ttl 值,向 Redis 提供过期候选的提示时。

八、Redis的数据类型及使用场景

1、字符串

        String类型是一种最基本的数据类型,它是一个键值对的存储结构,其中键和值都是字符串类型。String类型的特点是快速存储和读取,适用于存储一些简单的数据,如字符串、整数或浮点数等。        

使用场景

  • 缓存:经典使用场景,把常用信息,字符串,图片或者视频等信息放到Redis中,Redis作为缓存层,MySQL做持久化层,降低MySQL的读写压力
  • 计数器:Redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
  • Session:常见方案Spring Session + Redis实现Session共享。

2、List

        列表是简单的字符串列表,按照插入顺序排序,底层是双向列表(压缩列表),一种快速、高效、可靠的数据存储结构,适用于实现队列、栈等常见的数据结构。

  • 消息队列:List类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的List类型实现简单的点对点的消息队列。

  • 排行榜:List类型的range命令可以分页查看队列中的数据,但是只有顶式计算的排行榜才适合使用List类型存储。

  • 最新列表:List类型的lpush命令和range命令能实现最新列表的功能.每次通过lpush的命令往列表里插入新的元素,然后通过lrange命令读取最新元素列表,如朋友圈的点赞列表、评论列表。

3、Set

        Set对外提供的功能与List类似是一个列表的功能,特殊之处在于Set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,Set是一个很好的选择,并且Set提供了判断某个成员是否在一个Set集合内的重要接口,这个也是List所不能提供的。Redis的Set是String类型的无序集合。它底层其实是一个Value为Null的Hash表,所以添加,删除,查找的复杂度都是O(1)

  • 推荐:通过sinter命令计算交集,比如美团给你推荐附近外卖时就可以根据你的外卖记录与附近商家计算交集推送安全提示:
  • 集合保存:微信群成员保存在一个set中,用户好友也保存在Set中。当用户加入群聊时可以提醒非好友用户注意安全

4、Hash

        hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

  • 结构化存储场景:一个hash结构中存储某个商品所有sku

5、ZSet(sortedSet)

        Zset与普通集合Set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的 。因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

        排行榜:一个销量排行榜,就可以使用店家的订单做score,这个查询出来的结果就是有序的权重队列:score作为优先级,这样取出来的数据权重都是最大优先执行的

        延时任务:score作为任务启动执行时间,取值时判断该值执行即可。

        

 参考:

Redis学习(六)8种内存淘汰机制_redis淘汰策略-CSDN博客

redis的过期键删除策略_redis过期键删除策略-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

gorm-sharding分表插件升级版

代码地址: GitHub - 137/gorm-sharding: Sharding 是一个高性能的 Gorm 分表中间件。它基于 Conn 层做 SQL 拦截、AST 解析、分表路由、自增主键填充,带来的额外开销极小。对开发者友好、透明,使用上与普通 SQL、Gorm 查询无差别.解决了原生s…

爬虫学习--5.xpath数据解析

xpath是XML路径语言,它可以用来确定xml文档中的元素位置,通过元素路径来完成对元素的查找。HTML就是XML的一种实现方式,所以xpath是一种非常强大的定位方式。 基本概念 XPath(XML Path Language)是一种XML的查询语言…

03.进程

并发 进程是运行起来的程序,是OS(操作系统)进行资源分配和调度的基本单位。 当只有一个cpu,进程遇到阻塞事件的时候(可能是要去磁盘中读取数据),我们知道cpu的执行速度和磁盘的IO速度相差特别大…

传感器—超声波雷达

声波技术 在讲述超声波雷达之前,先了解一下声波的概念以及超声波和声波之间的关系 什么是声波? 声波是物体机械振动状态(或能量)的传播形式。所谓振动是指物质的质点在其平衡位置附近进行的往返运动形式,这种振动状…

2023盘古石晋级赛 移动终端取证 WP

9. 根据容恨寒的安卓手机分析,MAC的开机密码是[答案:asdcz] 到这里火眼就寄了,盘古石 启动! 10. 根据容恨寒的安卓手机分析,苹果手机的备份密码前4位是[答案:1234] 11. 根据魏文茵苹果手机分析&#xff0c…

找不到vcruntime140_1.dll怎么办,介绍5种简单有效的解决方法

当您的电脑系统提示找不到vcruntime140_1.dll文件时,这通常意味着系统在尝试运行某个应用程序或游戏时,无法定位到这个至关重要的动态链接库(DLL)文件。此情况可能源于几个不同的原因,包括但不限于:文件被误…

电信网关配置管理系统 rewrite.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

三分钟上手安全渗透系统Kali Linux

kali linux系统集成了常用的安全渗透工具,省去了安装工具的时间,做安全相关的工作是非常推荐使用的。 安装Kalii Linux 安装系统 一般使用虚拟机进行安装,Kali Linux基于Debian内核,虚拟机的操作系统选择Debian 7.x 64 选择系统…

C++入门 string类(第二章):string类对象的容量操作

文章目录 🚀1. string类对象的容量操作⚡️1.1 size⚡️1.2 capacity⚡️1.3 max_size⚡️1.4 resize⚡️1.5 reserve⚡️1.6 clear⚡️1.7 empty 🚀2. string类对象访问元素⚡️2.1 at⚡️2.2 back 与 front 🚀3. string类对象的字符串操作&…

嵌入式学习<1>:建立工程、GPIO和keil仿真

嵌入式学习_part1 本部分笔记用于学习记录,笔记源头 >>b站江科大_STM32入门教程_新建工程 建立工程、GPIO 开发环境:keil MDK、STM32F103C8T6 1 )建立工程 (1)基于寄存器开发、基于标准库 或者 基于HAL库开…

海睿思受邀参加 “走进中节能”研习交流,探索新能源数据治理的创新路径

近日,OceanMind海睿思参加由江苏省企业信息化协会(以下简称“苏信会”)主办的“走进中节能太阳能科技(镇江)有限公司”研习交流活动。 海睿思与苏美达、远东控股、隆基乐叶、固德威、上能电气等40多位来自制造业领域的…

VMware Workstation 17 Player 创建虚拟机教程

本教程是以windows server 2012物理机服务器安装好的VMware Workstation 17 Player为例进行演示,安装VMware Workstation 17 Player大家可以自行网上搜索安装。 1、新建虚拟机 双击安装好的VMvare图标,点击创建虚拟机。 2、选择是否安装系统 本步骤选…

socks5代理的工作原理是什么?

SOCKS5代理是一种采用SOCKS协议的代理服务器,是一种通用的代理服务器。SOCKS5代理服务器可以在前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器能够访问Internet网中的服务器,同时提供更加安全的通讯方式。那么&#xff0c…

解决参考文献自动生成标号,换行时自动缩进

问题如下图所示,红色方框部分应该填充内容,但自动生成标号时不会填充: 解决方案: 1. 选中内容: 2. 找到布局-段落: 3. 选择“无”,即可。

苹果电脑免费第三方软件CleanMyMac X2025电脑版垃圾清理软件神器

Mac电脑用户在长时间使用电脑之后,时常会看到“暂存盘已满”的提示,这无疑会给后续的电脑使用带来烦恼,那么苹果电脑暂存盘已满怎么清理呢,下面将给大家带来一些干货帮你更好地解决这个问题。 CleanMyMac X2024全新版下载如下: h…

开源交互审计系统:功能强大、安全好用【送源码】

在当今信息化时代,网络安全越来越受到重视。传统的远程控制工具,如RDP、SSH、VNC等,虽然方便易用,但存在安全隐患,容易被黑客利用。很多时候我们都需要做一些防护的处理来来保障网络安全。 今天了不起来分享一款开源好…

27、Qt自定义标题栏

一、说明 QtWidget及其子类有默认的标题栏,但是这个标题栏不能美化,有时候满足不了我们的使用需求,所以进行自定义标题栏 二、下载图标 在下面的链接中下载两种颜色的最大化、向下还原、最大化和关闭八个图片,并找一张当做图标…

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1,概述 2,识别预测通路 3,连续的信号转导 4,预测空间共定位细胞群之间的关键信号转导事件…

numpy1

注意:reshape函数的 - 1(是让电脑 自己计算的意思 import numpy as np n np.arange(0,25).reshape(5,5) m np.array([0,5,10,15,20])nn np.repeat(n,2,axis 1) m m.reshape(-1,1)nn[:,1:8:2] np.tile(m,(1,4)) nn[:,0:-1]

【计算机毕业设计】springboot果蔬种植销售一体化服务平台

伴随着我国社会的发展,人民生活质量日益提高。于是对果蔬种植销售一体化服务管理进行规范而严格是十分有必要的,所以许许多多的 信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套果蔬种植销售一体化服务平台&…