面向面试知识-Redis

面向面试知识-Redis

什么是Redis

运行于内存的基于key-value的非关系型数据库。

一款开源的内存数据结构存储,用作数据库、缓存、消息代理等。(可以基于Redis实现分布式锁、以及消息队列)
发布订阅??

对数据类型的操作都是原子性的,因为执行命令由单线程负责,不存在并发竞争的问题。
除此之外,Redis还支持:

Redis与Memcached的区别?

Redis和Memcached的共同点:

  1. 都是基于内存的数据库,性能都很高,一般可以用做缓存;
  2. 都有过期策略。

Redis和Memcached的区别:

  • Redis支持的数据类型更加丰富(String、Hash、Set、List、Zset);而Memcached只支持最简单的key-value数据类型;
  • Redis支持数据的持久化,如何持久化??,可以将内存中的数据保持在磁盘中,重启时可以再次加载使用;而Memcached没有持久化功能;
  • Redis原生支持集群;
  • Redis支持订阅模型、Lua脚本、事务等功能,而Memcached不支持。

为什么使用Redis作为MySQL的缓存

主要是因为高性能和高并发

  1. Redis具备高性能
    运行在内存的key-value缓存,读取速度快。
    在这里插入图片描述
    但是需要一定的方法解决Redis和MySQL数据库数据一致性的问题。
  2. Redis具备高并发
    单台设备的Redis的QPS(Query Per Second),是MySQL的10倍,Redis单机的QPS能轻松破10w,而MySQL单机的QPS很难破1W。
    因此可以考虑把数据库的部分数据转移到缓存中,这样会直接到缓存而不用经过数据库。

Redis的数据类型

类型类型:存储的值:结构的读写能力;

String字符串;缓存对象、常规计数、分布式锁、共享session信息等;
Hash哈希;缓存对象、购物车等??
List列表;消息队列(有两个问题①生产者需要自行实现全局唯一;②不能以消费组形式消费数据等;);
Set集合;聚合计算(并集、交集、差集)场景,比如点赞、共同关注、==抽奖活动,为嘛?==等
Zset有序集合;排序场景,比如排行榜、电话和姓名排序等。

Redis常见数据类型:
在这里插入图片描述
数据类型:存储的值:结构的读写能力
在这里插入图片描述
Redis各数据类型的数据结构实现:
在这里插入图片描述

  1. String类型内部实现:
    主要是SDS,Simple Dynamic String,简单动态字符串。
  • SDS不仅可以保存文本数据,还可以保存二进制数据。
  • SDS获取字符串长度的时间复杂度为O(1)。
  • Redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。
  1. List类型内部实现:
    底层数据结构是由双向链表或压缩列表实现的:
  • if 列表元素个数小于512,每个item的值都小于64字节,Redis会使用List类型的底层;
  • else 使用双向链表;
    在Redis3.2之后,List数据类型的底层DS只由quickList实现。
  1. Hash类型内部实现:
    压缩列表或者哈希表
  • if 列表元素个数小于512,且所有值小于64字节,用压缩列表;
  • else 使用Hash表;
    Redis 7.0之后只由quickList实现
  1. Set类型内部实现:
    Hash表或者整数集合实现
  • if 集合中的元素都是整数,且元素个数小于512,使用整数集合;
  • else 使用哈希表;
  1. Zset类型内部实现
    压缩列表或者跳表:
  • if 有序集合的元素个数小于128个,且所有元素的值小于64个字节时,使用压缩列表;
  • else 使用跳表;
    Redis7.0之后使用listpack实现。

Redis的线程模型

Redis是单线程吗?

在处理一系列请求时,即接受客户端请求,解析请求,进行数据读写等操作,返回数据给客服端的过程,是单线程;
但是Redis程序并不是单线程的,Redis在启动的时候,会启动后台线程(BIO)。

  • Redis在2.6版本加了两个后台线程,分别处理关闭文件、AOF刷盘两个任务;
  • Redis 4.0之后,新增了一个后台线程,用来异步释放Redis内存,也就是lazyfree线程。
    详细内容见Redis 常见面试题
    之所以 Redis 为「关闭文件、AOF 刷盘、释放内存」这些任务创建单独的线程来处理,是因为这些任务的操作都是很耗时的,如果把这些任务都放在主线程来处理,那么 Redis 主线程就很容易发生阻塞,这样就无法处理后续的请求了。
    在这里插入图片描述
    此图太大了,内容有点多,慢慢看一下;
    在这里插入图片描述

为什么Redis采用单线程都能这么快?

  1. 运行在内存;
  2. 非多线程,避免了多线程竞争,免去了线程切换等的资源消耗;
  3. 采用I/O多路复用处理大量的客户端Socket请求;

Redis在6.0之后引入了多线程,但是主要面向I/O,采用了多个I/O线程来处理网络请求,因为随着网络硬件的性能提升,Redis的性能瓶颈有时会出现在网络I/O的处理上。

Redis持久化

Redis如何实现数据不丢失

Redis运行在内存,当重启或者崩溃,内存中的数据会丢失,因此需要将数据保存至磁盘实现数据的持久化,在Redis重启后重新恢复保存在磁盘中的数据,避免数据丢失。
三种持久化方式:

  • AOF日志:每执行一条写操作,就将该命令以追加的方式写入一个特定文件中。
  • RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘。
  • 混合持久化方式:集成了AOF和RDB的优点。

AOF日志是如何实现的?

RDB是如何实现的?

上两部分见参考:Redis 如何实现数据不丢失?

Redis的内存淘汰策略

Redis如何保证数据一致性

Redis如何解决数据一致性问题?
延迟双删

如何解决缓存击穿、穿透、雪崩等问题?

缓存击穿

缓存穿透

缓存雪崩

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

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

相关文章

【操作系统笔记】内存分配

内存对齐 问题:为什么需要内存对齐呢? 主要原因是为了兼容,为了让程序可以运行在不同的处理器中,有很多处理器在访问内存的时候,只能从特定的内存地址读取数据。换个说法就是处理器每次只能从内存取出特定个数字节的数…

Spring Boot实现对超大文件进行异步压缩下载

在Web应用中,文件下载功能是一个常见的需求,特别是当你需要提供用户下载各种类型的文件时。本文将演示如何使用Spring Boot框架来实现一个简单而强大的文件下载功能。我们将创建一个RESTful API,通过该API,用户可以下载问价为ZIP压…

Python计算机二级知识点整理

1.当一个进程在运行过程中释放了系统资源后要调用 唤醒进程原语 唤醒进程原语是把进程从等待队列里移出到就绪队列并设置进程为就绪状态,当一个进程在运行过程中释放了系统资源后进入就绪状态,调用唤醒进程原语。 2. 3. 4.在希尔排序法中&#x…

免费开源 | 基于SSM的校园订餐系统

源码下载地址获取 关注并私信回复“订餐”,获取源码下载方式 一定要关注后发消息,否则系统限制无法回复消息 感谢开源!侵删! 一、功能实现 1. 前台模块 前台主要功能有:用户注册、用户登录、我的购物车、我的订单、…

人类认知的贝叶斯与机器的贝叶斯

贝叶斯原理是一种基于概率的分析方法,可以用来估计一个事件发生的概率。在人类认知和机器学习领域中,都有对应的贝叶斯原理。 人类认知的贝叶斯原理: 在人类认知研究中,贝叶斯原理被认为是一种重要的思维方式。人类的认知过程通常…

大数据与云计算实验一

检查是否开启 sudo service docker status 开启服务 sudo service docker start 运行服务 sudo docker run -itd -p 8080:80 nginx 查询ID docker ps -all 进入容器shell sudo docker exec -it <容器ID或容器名称> /bin/bash 找到/usr/share/nginx/html/index.…

DevSecOps内置安全保护

前言 随着DevOps的发展&#xff0c;DevOps大幅提升了企业应用迭代的速度。但同时&#xff0c;安全如果不能跟上步伐&#xff0c;不仅会抵消DevOps变革带来的提升&#xff0c;拖慢企业数字化转型进程&#xff0c;还会导致漏洞与风险不约而至。所以安全能力在全球范围内受到的重…

图像识别-YOLO V8安装部署-window-CPU-Pycharm

前言 安装过程中发现&#xff0c;YOLO V8一直在更新&#xff0c;现在是2023-9-20的版本&#xff0c;已经和1月份刚发布的不一样了。 eg: 目录已经变了&#xff0c;旧版预测:在ultralytics/yolo/v8/下detect 新版&#xff1a;ultralytics/models/yolo/detect/predict.py 1.安…

aspose-words导出word方法

一、引用依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>19.5</version><classifier>jdk17</classifier></dependency>二、导出类 public class WordTable {//定…

腾讯云阿里云云服务器 Linux 操作系统 BT 宝塔面板快速建站教程

宝塔面板概述 宝塔面板是一款服务器管理软件&#xff0c;支持Windows和Linux系统&#xff0c;可以通过Web端轻松管理服务器&#xff0c;提升运维效率。总体来说&#xff0c;宝塔面板具有操作简单、功能丰富、安全可靠等特点&#xff0c;是一款非常实用的服务器管理软件。 宝塔…

GPT,GPT-2,GPT-3,InstructGPT的进化之路

ChatGPT 火遍圈内外&#xff0c;突然之间&#xff0c;好多人开始想要了解 NLP 这个领域&#xff0c;想知道 ChatGPT 到底是个什么&#xff1f;作为在这个行业奋斗5年的从业者&#xff0c;真的很开心让人们知道有一群人在干着这么样的一件事情。这也是我结合各位大佬的文章&…

滚雪球学Java(25):动态代理

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

IPv6协议基本概念

目前大多数设备节点支持IPv6和IPv4双栈,但随着IPv6逐渐应用,某些设备已经只支持纯IPv6,即IPv6 Only。 一、IPv6地址格式 1、IPv6地址表示方式 IPv6可以写成一组8个十六进制数,用冒号(:)分割。也可以写成128位2进制的0和1。 32即8x4,8表示8组16进制数,4表示每组16禁止包…

Git基础操作

前言 本文会向您介绍如何安装git&#xff0c;以及快速地上手add&#xff0c;commit&#xff0c;push&#xff0c;版本回退操作 基础配置 关于windous上的安装git官网已经介绍的很清楚了&#xff0c;您可以直接点入链接windows安装 如果你的平台是centos&#xff0c;以centos…

【Verilog教程】2.4Verilog表达式

表达式 表达式由操作符和操作数构成&#xff0c;其目的是根据操作符的意义得到一个计算结果。表达式可以在出现数值的任何地方使用。 例如&#xff1a; a^b ; //a与b进行异或操作 address[9:0] 10b1 ; //地址累加 flag1 && flag2 ; //逻辑与操作操作数 …

有没有普通人可以做的项目?分享几个项目适合普通人做的!

当谈到副业时&#xff0c;我们通常会想到能够轻松实施的兼职方式&#xff0c;并且希望通过这些副业增加我们的收入。那么&#xff0c;以下是我推荐的几种副业&#xff0c;这些副业不仅有良好的收入潜力&#xff0c;而且在执行过程中也很有趣。让我们一起看看吧&#xff01; 第…

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…

爬虫框架Scrapy学习笔记-2

前言 Scrapy是一个功能强大的Python爬虫框架&#xff0c;它被广泛用于抓取和处理互联网上的数据。本文将介绍Scrapy框架的架构概览、工作流程、安装步骤以及一个示例爬虫的详细说明&#xff0c;旨在帮助初学者了解如何使用Scrapy来构建和运行自己的网络爬虫。 爬虫框架Scrapy学…

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…

华为云云耀云服务器L实例评测|轻量级应用服务器对决:基于 STREAM 深度测评华为云云耀云服务器L实例的内存性能

本文收录在专栏&#xff1a;#云计算入门与实践 - 华为云 专栏中&#xff0c;本系列博文还在更新中 相关华为云云耀云服务器L实例评测文章列表如下&#xff1a; 华为云云耀云服务器L实例评测 | 从零开始&#xff1a;云耀云服务器L实例的全面使用解析指南华为云云耀云服务器L实…