redis高级(面试题二)

news2024/11/24 5:38:00

目录

一、redis的五大数据结构有哪些?zset底层是什么结构?

1、redis五大数据结构有哪些?

2、什么是skiplist?

3、zset底层是什么结构?

 二、Redis的内存过期策略是什么?Redis的内存淘汰策略有哪些?

1、redis如何判断key是否过期?

2、redis的内存过期策略是什么?

3、redis的内存淘汰策略有哪些?

三、Redis缓存和Mysql数据库怎么保证数据一致性?Redis的缓存穿透、缓存雪崩、缓存击穿分别是什么意思?怎么解决?

 1、Redis缓存和Mysql数据库怎么保证数据一致性?

2、如何解决缓存穿透问题?

3、如何解决缓存雪崩问题?

4、如何解决缓存击穿问题?


一、redis的五大数据结构有哪些?zset底层是什么结构?

1、redis五大数据结构有哪些?

  • String

  • List

  • Set

  • SortedSet

  • Hash

2、什么是skiplist?

skiplist(跳表)首先是链表,与传统链表相比有几点差异:

  • 元素按照升序排列存储

  • 节点可能包含多个指针,指针跨度不同。

        传统链表只有指向前后的指针,因此只能顺序一次访问。如果查找的元素在链表中间,查询的效率会比较低。而skiplist则不同,它内部包含跨度不同的多级指针,可以让我们条约查找链表中间的元素,效率非常高。

其结构如图所示:

        我们可以看到1号元素就有指向3、5、10的多个指针,查询时就可以跳跃查找。例如我们要找大小为14的元素,查找的流程是这样的:

  • 首先找元素1节点最高级指针,也就是4级指针,起始元素大小为1,指针跨度为9,可以判断出目标元素大小为10。由于14比10大,肯定要从10这个元素向下接着找。

  • 找到10这个元素,发现10这个元素的最高级指针跨度为5,判断出目标元素大小为15,大于14,需要判断下级指针

  • 10这个元素的2级指针跨度为3,判断出目标元素为13,小于14,因此要基于元素13接着找

  • 13这个元素最高级级指针跨度为2,判断出目标元素为15,比14大,需要判断下级指针。

  • 13的下级指针跨度为1,因此目标元素是14,刚好于目标一致,找到。

        这种多级指针的查询方式就避免了传统链表的逐个遍历导致的查询效率下降问题。在对有序数据做随机查询和排序时效率非常高。

3、zset底层是什么结构?

        zset底层是哈希表加上跳表实现的。zset是有序集合,底层存储的每个数据都包含element和score两个值。score是得分,element则是字符串值。zset会根据每个element的score值排序,形成有序集合。

        它支持的操作很多,比如:根据element查询score的值、按照score值升序或降序查询element。

        要实现element查询对应的score值,就必须实现element与score之间的键值映射。zset底层是基于hashtable实现的。

        要实现对score值排序,并且查询效率还高,就需要一种高效的有序数据结构,zset是基于跳表实现的。

加分项:因为zset底层需要用到两种数据结构,堆内存的占用比较高 。因此redis底层会对zset中的元素大小做判断。如果元素大小小于128且每个元素都小于64字节,zset底层会采用ziplist,也就是压缩列表来代替hashtable和skiplist,不过,ziplist存在连锁更新问题,因此在redis7.0版本之后ziplist又被替换位listpack(紧凑列表)。

Redis源码中zset,也就是SortedSet的结构体如下:

typedef struct zset {
    dict *dict; // dict,底层就是HashTable
    zskiplist *zsl; // 跳表
} zset;

 其内存结构如图:

 二、Redis的内存过期策略是什么?Redis的内存淘汰策略有哪些?

1、redis如何判断key是否过期?

        在redis中会有两个dict,也就是hashtable,其中一个记录key-value键值对,另一个记录key和过期时间。要判断一个key是否过期,只需要到记录过期时间的dict中根据key查询即可。

redis是合适删除过期key得呢?

        redis并不会在key过期的时候立刻删除key,因为要实现这样得效果就必须给每一个过期的key设置时钟,并监控这些key的过期状态。无论对cpu还是内存都会带来极大的负担。

2、redis的内存过期策略是什么?

惰性删除:顾名思义就是果期七之后不会立刻删除。redis会在灭磁访问key的时候判断当前key有没有设置过期时间,如果有,判断过期时间是否已经到期,如果已经过期并不会立刻删除,而是当下次再次访问该key时候才会删除。

周期删除:顾名思义就是通过一个定时任务,周期性的抽样部分过期的key然后删除。

周期删除有两种模式:

  • SLOW模式:通过一个定时任务,定期的抽样部分带有TTL的KEY,判断其是否过期。默认情况下定时任务的执行频率是每秒10次,但每次执行不能超过25毫秒。如果执行抽样后发现时间还有剩余,并且过期KEY的比例较高,则会多次抽样。

  • FAST模式:在Redis每次处理NIO事件之前,都会抽样部分带有TTL的KEY,判断是否过期,因此执行频率较高。但是每次执行时长不能超过1ms,如果时间充足并且过期KEY比例过高,也会多次抽样

3、redis的内存淘汰策略有哪些?

Redis支持8种不同的内存淘汰策略:

  • noeviction: 不淘汰任何key,但是内存满时不允许写入新数据,默认就是这种策略。

  • volatile-ttl: 对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰

  • allkeys-random:对全体key ,随机进行淘汰。也就是直接从db->dict中随机挑选

  • volatile-random:对设置了TTL的key ,随机进行淘汰。也就是从db->expires中随机挑选。

  • allkeys-lru: 对全体key,基于LRU算法进行淘汰

  • volatile-lru: 对设置了TTL的key,基于LRU算法进行淘汰

  • allkeys-lfu: 对全体key,基于LFU算法进行淘汰

  • volatile-lfu: 对设置了TTL的key,基于LFI算法进行淘汰

比较容易混淆的有两个算法:

  • LRULeast Recently Used),最近最久未使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

  • LFULeast Frequently Used),最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高。

三、Redis缓存和Mysql数据库怎么保证数据一致性?Redis的缓存穿透、缓存雪崩、缓存击穿分别是什么意思?怎么解决?

 1、Redis缓存和Mysql数据库怎么保证数据一致性?

        答:缓存的双写一致性很难保证强一致,只能尽可能降低不一致的概率,确保最终一致。我们项目中采用的是Cache Aside模式。简单来说,就是在更新数据库之后删除缓存;在查询时先查询缓存,如果未命中则查询数据库并写入缓存。同时我们会给缓存设置过期时间作为兜底方案,如果真的出现了不一致的情况,也可以通过缓存过期来保证最终一致。

2、如何解决缓存穿透问题

        答:缓存穿透也可以说是穿透攻击,具体来说是因为请求访问到了数据库不存在的值,这样缓存无法命中,必然访问数据库。如果高并发的访问这样的接口,会给数据库带来巨大压力。

        我们项目中都是基于布隆过滤器来解决缓存穿透问题的,当缓存未命中时基于布隆过滤器判断数据是否存在。如果不存在则不去访问数据库。当然,也可以使用缓存空值的方式解决,不过这种方案比较浪费内存。

3、如何解决缓存雪崩问题

        答:缓存雪崩的常见原因有两个,第一是因为大量key同时过期。针对问这个题我们可以可以给缓存key设置不同的TTL值,避免key同时过期。

        第二个原因是Redis宕机导致缓存不可用。针对这个问题我们可以利用集群提高Redis的可用性。也可以添加多级缓存,当Redis宕机时还有本地缓存可用。

4、如何解决缓存击穿问题

        答:缓存击穿往往是由热点Key引起的,当热点Key过期时,大量请求涌入同时查询,发现缓存未命中都会去访问数据库,导致数据库压力激增。解决这个问题的主要思路就是避免多线程并发去重建缓存,因此方案有两种。

        第一种是基于互斥锁,当发现缓存未命中时需要先获取互斥锁,再重建缓存,缓存重建完成释放锁。这样就可以保证缓存重建同一时刻只会有一个线程执行。不过这种做法会导致缓存重建时性能下降严重。

        第二种是基于逻辑过期,也就是不给热点Key设置过期时间,而是给数据添加一个过期时间的字段。这样热点Key就不会过期,缓存中永远有数据。

        查询到数据时基于其中的过期时间判断key是否过期,如果过期开启独立新线程异步的重建缓存,而查询请求先返回旧数据即可。当然,这个过程也要加互斥锁,但由于重建缓存是异步的,而且获取锁失败也无需等待,而是返回旧数据,这样性能几乎不受影响。

        需要注意的是,无论是采用哪种方式,在获取互斥锁后一定要再次判断缓存是否命中,做double check. 因为当你获取锁成功时,可能是在你之前有其它线程已经重建缓存了。

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

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

相关文章

【专题】数据库系统的基本原理

1. 数据库系统概述 1.1. 数据库系统的应用 电信业、银行业、金融业、销售业、联机的零售商、大学、航空业、人力资源、制造业等等。 1.2 数据库系统的概念 (1) 数据(Data) 数据是数据库存储的基本对象。是描述现实世界中各种具体事物或抽象概念的、可…

Nuxt日志监控(服务端及客户端日志检测)

此文章主要讲解如何使用Nuxt进行日志监控,例如服务端请求日志,客户端请求日志,方便线上出现问题能及时排查问题所在 一、下载依赖 npm install winston winston-daily-rotate-file二、plugin下创建日志处理插件winston.js,对日志…

靠谱!有了它,微信自动统计报表轻松搞定!

当你需要定期统计多个微信号的数据时,每次都要逐一登录并手动统计各种数据,这不仅耗时,还容易出错。 好在,一个便捷的工具——个微管理系统能够帮助我们高效地管理这些繁杂的数据,让我们的工作事半功倍。 好友统计报…

安装Node.js环境,安装vue工具(最佳实践)

一、安装Node.js 去官网下载自己需求的安装包(我提供的步骤是windows10 64x) 下载 | Node.js 中文网 (nodejs.cn)https://nodejs.cn/download/ 下载好后,安装到默认路径就好了,所占用的内容很少。 一直点next就行了 安装好后&a…

python操作.docx、.pptx文件

python操作.docx、.pptx文件 .docx文件和.pptx文件是Microsoft Office套件中两种常见的文件格式,分别对应Word文档和PowerPoint演示文稿。WPS Office完美支持Microsoft Office文件格式。 使用 Python 操作 .docx 和 .pptx 文件是一项非常实用的技能,尤…

BlabkForestLabs 又放大招:“蓝莓”模型其实是 Flux1.1?!

神秘的 AI 生成模型 BlabkForestLabs 又放大招了?就在 AI 绘画圈还在训练 Flux.1 练的不亦乐乎的时候,黑森林工作室又推出了一个新的模型—— Flux1.1 !这次升级后的 Flux1.1 性能直接完爆前版的 Flux.1 ,再次将 AI 绘画的上限拉高…

如何给ppt增加新的一页?这2个ppt使用技巧值得推荐!

在当今讲究视觉表现力的时代,PPT已经成为职场中不可或缺的工具。无论是汇报工作、演示方案还是传递想法,一份精美的PPT都能让你的演讲(演示)更加出色。 然而,制作PPT并非易事,尤其是对于新手来说&#xff…

STM32-HAL库 驱动DS18B20温度传感器 -- 2024.10.8

目录 一、教程简介 二、驱动理论讲解 三、CubeMX生成底层代码 四、Keil5编写代码 五、实验结果 一、教程简介 本教程面向初学者,只介绍DS18B20的常用功能,但也能满足大部分的运用需求。跟着本教程操作,可在10分钟内解决DS18b20通信难题。…

windows认证

本地环境用户信息存储在%systemroot%/system32/SAM 域环境用户信息存储在ntds.dit 本地认证 windows系统下哈希结构:username:RID:LM-HASH:NT-HASH LM哈希 算法: 转大写,转二进制,补0补足14字节 二分获得两段字串&#xff…

算法:238.除自身以外数组的乘积

题目 链接:leetcode链接 思路分析(前缀和) 这道题非常类似 724. 寻找数组的中心下标 在前一篇博客讲解了该题目 传送门:算法:724.寻找数组的中心下标 这道题目的区别在于,这道题是预处理前缀积和后缀积 另外&#x…

了解网页 blob 链接

blob 链接 自从 HTML5 提供了 video 标签,在网页中播放视频变得非常简单,只要在代码中插入一个 video 标签,再将 video 标签的 src 属性设置为视频的链接就可以了。由于 src 指向的是视频文件真实的地址,所以当我们通过浏览器的调…

如何绘制短剧产业链图谱?短剧产业前景如何?

绘制短剧产业链图谱是一个涉及多个环节的复杂过程。我们首先需要确定产业链的主要环节,包括内容创作、制作、发行、宣传和观众。每个环节都由不同的参与者组成,如编剧、导演、演员、制作公司、版权销售商、在线平台、电视台、广告公司和消费者等&#xf…

《CTF 特训营》:网络安全竞赛的进阶指南

在网络安全领域日益受到重视的今天,CTF(Capture The Flag)竞赛作为一种检验和提升网络安全技能的方式,受到了越来越多爱好者的关注。而《CTF 特训营》这本书,无疑是一本帮助读者深入了解 CTF 竞赛的优秀读物。 一、书籍…

Linux shell编程学习笔记86:sensors命令——硬件体温计

0 引言 同事们使用的Windows系统电脑,经常莫名其妙地装上了鲁大师,鲁大师的一项功能是显示系统cpu等硬件的温度。 在Linux系统中,sensors命令可以提供类似的功能。 1 sensors命令 的安装和配置 1.1 sensors命令 的安装 要使用sensors命…

INS淡绿色风格人像街拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 INS 淡绿色风格人像街拍通过 Lightroom 调色可以营造出清新、自然、时尚的视觉效果。这种风格以淡绿色为主色调,给人一种宁静、舒适的感觉。 预设信息 调色风格:INS风格预设适合类型:人像,街拍,自拍&#…

动态规划算法题目练习——62.不同路径

1.题目解析 题目来源:62.不同路径——力扣 测试用例 2.算法原理 1.状态表示 这时由于避免越界初始化所以将左上角置为虚拟位置,创建一个二维dp表用来存储到当前为止的所有路径 2.状态转移方程 以dp[i,j]为例,起点到该位置的路径是起点到其上…

信息安全工程师(40)防火墙技术应用

一、防火墙的基本概念 防火墙是一种网络安全设备,用于监控和控制网络流量,以保护网络免受未经授权的访问和攻击。它可以是装配多张网卡的通用计算机,也可能是通用的物理设备。防火墙通过在网络之间设置访问控制策略,对进出的通信流…

JAVA开源项目 新生报到网站 计算机毕业设计

本文项目编号 T 002 ,文末自助获取源码 \color{red}{T002,文末自助获取源码} T002,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 提…

【C语言】指针练习题

一、指针指向问题 int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } 结果为:2,5。&a是整个数组(&a 1)被强转为(int*&am…

mujoco版本问题以及ERROR: Failed building wheel for mujoco-py

问题: ERROR: Failed building wheel for mujoco-py Failed to build mujoco-py ERROR: Could not build wheels for mujoco-py, which is required to install pyproject.toml-based projects 起因: 一开始我使用这个命令安装pip install mujoco_py&…