redis面试

0.思维导图

在这里插入图片描述

1. redis的数据类型♥♥♥

redis有五种数据类型,包括string,list,set,hash,zset;string就类似于java中的字符串,list就类似于Java中的列表,可以存放重复的元素,set就类似于java中的hashset,不能存放重复的元素,hash就类似于Java中的hashMap,存放键值对元素,zset是一个有序集合,每个元素都会有一个score,按照score来进行排序。

2. zset的底层实现♥♥

  • 它有两种实现方式:一个是压缩列表,还有一种是字典加上跳跃表
    • 压缩列表使用紧挨在一起的几点来保存元素和score,第一个节点保存元素,第二个节点保存score,压缩列表的元素按score从小到大排序。
      • 它的使用需要满足两个条件,否则就使用字典加跳跃表:元素个数小于128个,元素长度小于64字节
    • 跳跃表是一种可以进行二分查找的有序链表。原理就是在原有的有序链表上面增加了多级索引,通过索引来实现快速查找;

3. BitMaps

在这里插入图片描述

4. HyperLogLog

在这里插入图片描述
在这里插入图片描述

5. redis的持久化方案♥♥♥

  • RDB(默认的持久化方式):定期保存数据快照至一个rdb文件中,并在启动时自动加载rdb文件,恢复之前保存的数据。

  • AOF:把每一个写请求都记录在一个aof文件中,并且在启动时,会把aof文件中记录的所有写操作顺序执行一遍,确保数据恢复到最新。

  • 区别:RDD效率更高,因为它是直接将Redis的最新数据完整的保存下来,但如果Redis中存储的数据量比较大时,也会有一定的性能消耗,因为它需要创建额外的进程来进行数据的持久化,所以要制定合理的策略;而AOF效率相对RDB要低一些,因为它会将历史的写操作都执行一遍来进行恢复,同时在执行写操作的时候也会将每一个指令存储下来,当我们对数据的安全性要求较高的时候,可以考虑AOF

  • 扩展1:数据量较大时进行快照,用时相对会比较长。如果服务器这个期间收到写请求,那么就不能保证快照的完整性。那么Redis是如何做的?

    • Redis使用的是操作系统提供的写时复制技术,在执行快照的时候,正常处理写操作。【如果主线程要修改一块数据,这块数据就会被复制一份,生成该数据的副本,此时主线程在该副本上进行修改,fork的子线程继续把原来的数据写入RDB文件中】
  • 扩展2:在进行RDB快照的过程中,发生服务崩溃了怎么办?

    • 在快照操作过程中不能影响上一次备份的数据,将上一次完整的RDB快照文件作为恢复内存的参考

6. 缓存穿透,缓存击穿,缓存雪崩♥♥♥

  • 在应用程序和mysql数据块之间建立一个中间层:redis缓存,通过redis缓存可以有效减少查询数据库的时间消耗,但是引入redis又有可能出现缓存穿透,缓存击穿,缓存雪崩等问题
  • 缓存穿透:key在缓存和数据源都没有,那么所有的请求都会去查询数据源,压垮数据源
    • 解决:
      • 当查询不存在时,也就空保存在缓存中【key-null】
      • 采用布隆过滤器,将所有可能存在的数据hash到一个足够大的bitmap中,一个一定不存在的key会被这个bitmap拦截掉,从而避免了对数据源的查询压力。
  • 缓存击穿:key在数据源中有,在缓存中没有,通常时缓存过期了,这时候大量的并发就会全部去请求数据源,导致数据源瘫痪
    • 解决:使用互斥锁,利用setnx来实现该功能,因为当Key不存在的时候,它才会设置一个Key
  • 缓存雪崩:当缓存服务器重启或者大量key缓存集中在某一个时间失效,这时候给数据源的压力也非常大
    • 解决:为key设置不同的缓存失效时间。

7. redis实现分布式锁♥

  锁是一种常用的并发控制机制,用于保证一项资源在任何时候只能被一个线程使用,如果其他线程也要使用同样的资源,必须排队等待上一个线程用完。

  上面说的锁指的是程序级别的锁,例如java语言中的synchronized和ReentrantLock在但应用中使用不会有任何问题,但如果放到分布式环境下就不适用了,这个时候我们就要使用分布式锁。分布式锁比较好理解就是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。

分布式锁比较常见的实现方式有三种:

  • Memcached实现的分布式锁:使用add命令,添加成功的情况下,表示创建分布式锁成功。
  • Zookeeper实现的分布式锁:使用Zookeeper顺序临时节点来实现分布式锁。
  • Redis实现的分布式锁
    • 使用setnx,如果创建成功则表名次锁创建成功,否则代表这个锁已经被占用,创建失败。
    • setnx lock true 创建锁
    • del lock 释放锁
    • setnx的问题:setnx虽然可以成功创建分布式锁,但存在一个问题,如果此程序在创建了锁之后,程序异常退出了,那么这个锁将永远不会被释放,就造成了死锁问题
      • 使用set命令来设置分布式锁,并设置超时时间,而且set命令可以保证原子性:set lock true ex 30 nx

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

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

相关文章

索引文件的建立与查询示例(五)

隔了好几天没顾上更新内容,在此继续吧。还是得多动头脑,否则忙于日常事务,脑子不够灵活。在代码的世界里还是能有一些灵感。上次说到在内存中实现链表建立以及打印出链表的操作。这节我们试着将链表存入文件,并从文件中进行读取。…

关于maven项目构建的解释

在Idea中使用模块化构建项目 项目介绍: sky-server依赖sky-pojo和sky-common,继承sky-take-outsky-pojo继承sky-take-outsky-common继承sky-take-out 由于Idea编译器自动识别引入的模块,所以在Idea中可以运行项目。 在Idea中使用maven打包…

Java多线程--同步机制解决线程安全问题方式二:同步方法

文章目录 一、同步方法(1)同步方法--案例11、案例12、案例1之同步监视器 (2)同步方法--案例21、案例2之同步监视器的问题2、案例2的补充说明 二、代码及重要说明(1)代码(2)重要说明 …

用GPT写PHP框架

参考https://www.askchat.ai?r237422 写一个mvc框架 上面是简单的案例,完整的PHP框架,其核心通常包含以下几个关键组件: 1. 路由(Routing):路由组件负责解析请求的URL,并将其映射到相应的控制…

Springboot项目启动后浏览器不能直接访问接口,而postman可以访问?

在云服务器上部署springboot后端时,项目启动后浏览器不能直接访问接口,而postman可以访问。这是当时困扰了我大半天的小问题,在我打开防火墙和阿里云安全组之后还是没解决。然后在网上搜了很多很多资料,以为是浏览器访问权限或者是https什么证…

【乳腺肿瘤诊断分类及预测】基于LVQNN学习向量量化神经网络

课题名称:基于LVQ神经网络的乳腺肿瘤诊断(类型分类) 版本日期:2023-03-10 运行方式: 直接运行0501_LVQ0501.m 文件即可 代码获取方式:私信博主或QQ:491052175 模型描述: 威斯康辛大学医学院…

H.264与H.265的主要差异

H.265仍然采用混合编解码,编解码结构域H.264基本一致, H.265与H.264的主要不同 编码块划分结构:采用CU (CodingUnit)、PU(PredictionUnit)和TU(TransformUnit)的递归结构。 并行工具:增加了Tile以及WPP等并行工具集以提高编码速…

优化器刺客之limit 1--Order by col limit n 代价预估优化探索

一、现象 order by 排序加了limit后更慢了? test# explain analyze select userid from dba_users where username like %aaaaaaaaaaaaaaaaaa% order by userid ;QUERY PLAN --------------…

第4章 python深度学习——(波斯美女)

第4章 机器学习基础 本章包括以下内容: 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例,你应该已经知道如何用神经网络解决分类问题和回归…

调试小结:PHY初始化前后Link Status是否能正确反应网线插上、拔下状态

1 说明 为了验证是否需要初始化PHY才能检测到网线插上、拔下,这里我们对比初始化PHY(LAN8720)前后,插拔网线PHY寄存器1的bit2的是否按照预期变化来进行测试。 我们查看的PHY寄存器是1的bit2,定义如下: 2…

anaconda离线安装包的方法

当设备没有网络时,可以使用有网络的设备先下载所需安装包,然后离线拷贝到需要安装的设备,最后安装。 一. 下载所需安装包 下载命令:使用pip download。详细描述参见pip download -h 以"blind-watermark"为例。 pip …

asp.net core监听本地ip地址

开发asp.net core的时候遇到一个问题我想提供访问供其他同事测试,但是默认都是localhost或者127.0.0.1。我想换成我的Ip地址访问但是不行,百度搜索需要更换监听的地址即修改launchSettings.json,修改为0.0.0.0:5248,这样不管local…

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现CPO-SVR冠豪猪优化支持向量机的数据多输入…

visual studio2022专业版安装步骤

目录 一、Visual studio下载二、创建C#项目——Hello World三、专业版秘钥激活 一、Visual studio下载 首先进入下载官网 先下载2022专业版,等等后面还需要选环境 我勾选了以下几个和c#开发有关的,后面缺什么还可以再安装所有以少勾了问题也不大 然后…

故障脚本的重要作用:预防、诊断与恢复

故障脚本是在信息技术和计算机领域中广泛使用的一种自动化工具,它们的主要目的是预测、诊断和修复系统或软件中的故障。这些脚本在现代技术环境中扮演着至关重要的角色,本文将介绍故障脚本的主要作用。 一、预防性作用 监控和预警 故障脚本可以用于监控系…

C# 一个快速读取写入操作execl的方法封装

这里封装了3个实用类ExcelDataReaderExtensions,ExcelDataSetConfiguration,ExcelDataTableConfiguration和一个实用代码参考: using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.T…

GitHub国内打不开(解决办法有效)

最近国内访问github.com经常打不开,无法访问。 github网站打不开的解决方法 1.打开网站http://tool.chinaz.com/dns/ ,在A类型的查询中输入 github.com,找出最快的IP地址。 2.修改hosts文件。 在hosts文件中添加: # localhost n…

leetcode 27.移除元素(python版)

需求 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度…

【新课】安装部署系列Ⅲ—Oracle 19c Data Guard部署之两节点RAC部署实战

本课程由云贝教育-刘峰老师出品,感谢关注 课程介绍 Oracle Real Application Clusters (RAC) 是一种跨多个节点分布数据库的企业级解决方案。它使组织能够通过实现容错和负载平衡来提高可用性和可扩展性,同时提高性能。本课程基于当前主流版本Oracle 1…

图的学习

图的基本概念和术语 图的定义:图是由顶点的有穷非空集合和顶点之间的边的集合组成的,G表示,V是图G中顶点的集合,E是图G中边的集合 无向图:任意两点的边都是无向边组成的图(无向边:&#xff08…