【Redis技能熟练掌握之十年内功】

news2024/12/28 17:33:48

Redis技能熟练掌握之十年内功

    • 1.redis是什么?为什么要使用redis?
    • 2.redis一般应用于什么场景(四个场景)?
    • 3. Redis持久化机制是什么?各自的优缺点?一般咋么用?
    • 4. redis五个基础类型支持的操作?
    • 5. Redis 的对象机制(redisObject)?
    • 6. Redis数据类型有哪些底层数据结构?
    • 7. Redis RDB触发方式有什么
    • 8. Redis边读边写如何保存内存数据一致性的?
    • 9.RDB快照操作的时间内,如果发生服务崩溃咋么办?
    • 10. AOF是写前日志还是写后日志?

1.redis是什么?为什么要使用redis?

redis是一种支持key-value等多种数据结构的存储系统,可用于缓存,事件发布与订阅,高速队列等场景,支持网络,提供字符串,列表,哈希,集合结构,直接存取,基于内存,可持久化。

  • 读写性能优异
    • Redis能读的速度是11w次/s,写的速度是8.1w次/s
  • 数据类型丰富
    • Redis支持二进制案例的Strings,lists,hashes,Sets及OrderedSets数据类型操作。
  • 原子性
    • Redis的所有操作都是原子性的,同时redis还支持对几个操作合并后的原子性操作。
  • 丰富的特性
    • redis支持publish/subscribe,通知,key过期等特性。
  • 持久性
    • redis支持AOF,RDB等持久化方式。
  • 发布订阅
  • 分布式
    • Redis cluster。

2.redis一般应用于什么场景(四个场景)?

  1. 热点数据的缓存
    1.1 缓存是Redis最常见的应用场景,之所有这么使用,主要是因为Redis读写性能优异。而且逐渐有取代memcached,成为首选服务端缓存的组件。而且,Redis内部是支持事务的,在使用时候能有效保证数据的一致性。

  1. 限时业务的应用
    2.1 redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它。利用这一特性可以运用在限时的优惠活动信息、手机验证码等业务场景。

  1. 计数器的相关问题
    redis由于incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成、具体业务还体现在比如限制一个手机号发多少条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。

  1. 分布式锁
    这个主要利用redis的setnx命令进行,setnx:"set if not exists"就是如果不存在则成功设置缓存同时返回1,否则返回0 ,这个特性在后台中有所运用,因为我们服务器是集群的,定时任务可能在两台机器上都会运行,所以在定时任务中首先 通过setnx设置一个lock,如果成功设置则执行,如果没有成功设置,则表明该定时任务已执行。 当然结合具体业务,我们可以给这个lock加一个过期时间,比如说30分钟执行一次的定时任务,那么这个过期时间设置为小于30分钟的一个时间就可以,这个与定时任务的周期以及定时任务执行消耗时间相关。

3. Redis持久化机制是什么?各自的优缺点?一般咋么用?

  1. Redis持久化是吧当前进程数据生成快照保存到磁盘上的过程,针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。
  2. AOF 是“写后”日志,Redis先执行命令,把数据写入内存,然后才记录日志。日志里记录的Redis收到的每一条命令,这些命令以文本的形式保存。
  3. Redis4.0提出了混合使用AOF日志和内存快照的方法,简单来说,内存快照以一定的频率执行,在两次快照之间,使用AOF日志记录这期间的所有命令操作。

这样一来,快照就不用频繁地执行,这就避免了fork对主线程的影响,而且,AOF日志也只用于记录两次快照间的操作,也就是说,不需要记录所有操作了,因此,就不会出现日志文件过大的情况了,也可以避免重写开销。
如:T1和T2时刻的修改,用AOF日志记录,等到第二次坐全量快照时,就可以清空AOF日志,因为此时的修改都已经记录到快照里了,恢复就不再用日志了。


好处:这个方法既能享受到 RDB 文件快速恢复的好处,又能享受到 AOF 只记录操作命令的简单优势, 实际环境中用的很多。

4. redis五个基础类型支持的操作?

  1. 字符串
    1.1 字符串可以是整型、浮点型,数字类型可以自增或自减;
    1.2 字符串类型的话,可以对子付出进行操作
  2. 列表list
    2.1 一个链表,链表每个节点都是一个字符串
    2.2 对链表的两端进行push和pop操作,读取单个或多个元素,根据值查找或删除元素;
  3. 哈希Hash
    3.1 包含键值对的无序散列表
    3.2 包含方法有添加、删除、获取单个元素
  4. Set集合
    4.1 包含字符串的无需集合
    4.2 方法:添加、删除、获取、还包含计算交集、并集、差集等
  5. Zset集合
    5.1 和散列一样,用于存储键值对
    5.2 字符串成员与浮点数之间有序映射;元素的排列顺序由分数大小决定,方法包含了添加、获取、删除、以及根据分数范围或成员获取元素。

5. Redis 的对象机制(redisObject)?

  • 提供了统一访问不同数据结构的接口
  • 提供了类型泛型,通过不同的类型泛型推断,优化存储结构
/*
 * Redis 对象
 */
typedef struct redisObject {

    // 类型
    unsigned type:4;

    // 编码方式
    unsigned encoding:4;

    // LRU - 24位, 记录最末一次访问时间(相对于lru_clock); 
    // 或者 LFU(最少使用的数据:8位频率,16位访问时间)
    unsigned lru:LRU_BITS; // LRU_BITS: 24

    // 引用计数
    int refcount;

    // 指向底层数据结构实例
    void *ptr;

} robj;

在这里插入图片描述

6. Redis数据类型有哪些底层数据结构?

在这里插入图片描述

Redis 设计的底层数据结构分为:如下

  • 简单动态字符串 - sds
    • 用于存储字符串值的数据结构
    • 特点包含:
      1. 动态扩展,避免字符串缓冲区溢出
      1. 常数级获取字符串长度
      1. 可修改性: 可以对字符串进行修改操作,如追加、删除、替换等
      1. 二进制安全:可以存储任意二进制数据,不仅可以鵆文本字符串,还可以存储图片、视频等二进制数据。
    • 空间预分配和惰性空间释放
    • Redis字符串类型最多可以容纳512MB数据。
  • 压缩列表 - ZipList
  • 快表 - QuickList
  • 字典/哈希表 - Dict
  • 整数集 - IntSet
  • 跳表 - ZSkipList

7. Redis RDB触发方式有什么

  1. 手动触发
    1.1 save命令:阻塞当前redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上不建议使用。
    1.2 bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短,bgsave流程图如下所示:
    在这里插入图片描述

  1. 自动触发
    2.1 redis.conf中配置save m n ,即在m秒内有n次修改时,自动触发bgsave生成rdb文件;
    2.2 主从复制,从节点要从主节点进行全量复制时也会触发bgsave操作,生成当时的快照发送到从节点
    2.3 执行debug reload命令重载redis时也会触发bgsave操作;
    2.4 默认情况下执行shutdown命令时,如果没有开启aof持久化,那么也会触发bgsave操作;

8. Redis边读边写如何保存内存数据一致性的?

思考:rdb由于生产环境下我们为redis开辟的内存空间区域都比较大,比如6gb,那么将内存中的数据同步到硬盘的过程可能就会持续比较长的时间,而实际情况是这段时间redis服务一般都会接收到新的写操作请求。那么如何保证数据一致性呢?


从两方面说:

  1. RDB的核心思路是copy-on-write,来保证在进行快照操作的这段时间,需要压缩写入磁盘上的数据在内存不会发生变化。一方面,redis主进程会fork一个新的快照进程专门来做这个事情,这样保证了redis服务不会停止接收客户端包括写请求在内的任何请求;
  2. 另一方面,这段时间发生变化的数据会以副本的方式存放在另一个新的内存区域,待快照操作结束后才会同步到原来的内存区域。

在这里插入图片描述

9.RDB快照操作的时间内,如果发生服务崩溃咋么办?

在没有将数据完全写入到temp rdb file(或磁盘)前,这次快照操作都不算成功。如果出现了服务崩溃的情况,将上一次完整的rdb快照文件作为恢复内存数据的参考。也就是说,在快照过程中不能影响上一次的备份数据。redis服务会在磁盘上创建一个临时文件进行数据操作,待操作成功后才会用这个临时文件替换掉上一次的历史备份。

在这里插入图片描述

10. AOF是写前日志还是写后日志?

AOF日志采用的写后日志,即先写内存,后写日志。


Q:为什么采用写后日志(针对AOF)?
A:

  1. 避免额外的检查开销,Redis AOF写前日志,肯定需要对命令正确性校验,否则redis使用日志恢复数据时,就可能出错;但写后日志就不用再次检查了。
  2. 不会阻塞当前的操作

但这种也存在潜在风险:

  • 如果命令执行完成了,写日志前宕机了,会丢失数据。
  • 主线程写磁盘压力大,导致写盘慢,阻塞后续操作。

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

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

相关文章

Microsoft Edge WebView2运行时安装包获取

目前越来越多的软件将WebView2当做运行时,发现一些精简版的系统精简掉了WebView2或者人为误删除,一些软件无法正常运行,我们可以重新安装即可 浏览器访问WebView2官方页面 https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/ …

kafka负载均衡迁移(通过kafka eagle)

在grafana监控中发现kafka的各个节点磁盘不均匀 出现这样的情况是因为kafka默认是以文件数作为平衡的条件的。换句话说,kafka不会管一个副本有多大,只会看磁盘中有多少个副本文件。 解决方式: 1、修改策略,改为按照磁盘大小平衡…

计算机毕设设计推荐-基于python+Djanog大数据的电影数据可视化分析

精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻 💖🔥作者主页:计算机毕设木哥🔥 💖 文章目录 一、电影数据可视…

数控机床中的滚柱导轨什么情况下需要重新更换?

滚柱导轨是数控机床中重要的传动零部件,主要用于支撑和引导运动部件的直线运动,它的故障通常会导致加工精度下降、噪音大、导轨摩擦不顺畅等问题。那么,我们应该如何确定滚柱导轨是否需要更换呢? 1、‌外观检查‌:首先…

第二证券:“产业+科技” 中国并购重组市场持续升温

A股商场正在进入新一轮并购重组周期。新“国九条”出台以来,多项关于并购重组商场的方针接连推出,方针环境不断优化,相关事例数量较去年同期显着增加。从具体事例来看,工业链整合成为本年并购商场的重要“主线”,以“硬…

QT菜单之快捷菜单设计

快捷菜单又称为上下文菜单,通常在用鼠标右击的时候弹出。创建快捷菜单的方法和创建菜单栏菜单类似。 效果图: 一、将MainWindow类对象的ContextMenuPolicy属性设置为customContextMenu。 打开mainWindow.ui,在属性视图上找到ContextMenuPoli…

ubuntu、linux安装redis(使用tar包的方式)

目录 1、准备redis的tar包 2、执行make 3、执行make install 4、运行redis 5、总结 1、准备redis的tar包 去官网或者github上下载对应的tar包,我下载的是 redis-6.2.14.tar.gz 上传到ubuntu后,使用指令进行解压: tar -xvf redis-6.2.14.t…

内卷时代企业数字化营销策略

当前,内循环经济为主的后疫情时代消费心理的变化表现如下: 1. 焦虑与压力感增加 内卷时代的竞争压力和不确定性给消费者带来了焦虑和压力感。他们在消费过程中,不仅关注产品的功能和价值,还希望通过消费来缓解压力、获得心理上的…

S2-057远程执⾏代码漏洞

启动环境 vulhub靶场 /struts2/s2-057 访问 http://172.16.1.45:8080/struts2-showcase http://172.16.1.45:8080/struts2-showcase/${(123123)}/register2.action http://172.16.1.137:8080/struts2-showcase/$%7B%0A%28%23dm%3Dognl.OgnlContextDEFAULT_MEMBER_ACCESS%29.%28…

地图(高德)判断某一点位是否位于某一城市/区域/地区/行政区划内

地图(高德)判断某一点位是否位于某一城市/地区/行政区划内 这里以高德地图示例,其他地图思路是类似的 调用API(可以申请api选择web服务获取key) https://restapi.amap.com/v3/config/district?keyyourAppKey&keywords330500&exte…

罗德岛战记游戏源码(客户端+服务端+数据库+全套源码)游戏大小9.41G

罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 下载地址: 通过网盘分享的文件:【源码】罗德岛战记游戏源码(客户端服务端数据库全套源码)游戏大小9.41G 链接: https://pan.baidu.com/s/1y0…

RustDesk自建服务器,实现手机控制手机,电脑远程控制,手机控制电脑,电脑控制手机,实现任意互相操作

RustDesk自建服务器,实现手机控制手机,电脑远程控制,手机控制电脑,电脑控制手机,可以互相操作。 如果你不想搭建服务器,也可以联系我,共享服务器给你。 自己搭建服务器很简单,一年…

【BetterBench博士】2024华为杯C题:数据驱动下磁性元件的磁芯损耗建模 Python代码实现

题目 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动…

有了BIO为啥还需要NIO

写在前面 注意:这里的NIO指的是Java nio技术。 源码 。 本文看下NIO相关内容。NIO太重要了,netty,tomcat,jetty等底层使用的都是Java nio,所以很有必要好好了解一下咯,涨薪不涨薪的咱不知道,至少…

【网络安全】网络基础第一阶段——第二节:网络协议基础---- 路由和ARP协议

本篇文章我们来介绍IP路由的基本概念,包括路由的原理、静态路由和动态路由的配置与特点。 目录 一、路由 1.1 IP路由原理、静态路由及动态路由区分 1.1.1 什么是路由 1.1.2 路由的原理 1.1.2 路由表 1.1.3 静态路由与动态路由 1.2 路由原理详解 1.2.1 路由的…

Python增强办公效率的11个实用代码段

如果你正在学习Python,那么你需要的话可以,点击这里👉Python重磅福利:入门&进阶全套学习资料、电子书、软件包、项目源码等等免费分享! 引言 在日常工作中,许多任务可以通过编程自动化来提高效率。本…

QT6.7创建Non-Qt Project工程

QT6.7创建Non-Qt Project工程

数据结构——“二叉搜索树”

二叉搜索树是一个很重要的数据结构,它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是O(n),最好是O(logn)。接下来看一看它的接口函数的实现。 为了使用方便,这里采用模版的方式: 一、节点 temp…

TaskRes: Task Residual for Tuning Vision-Language Models

文章汇总 当前VLMs微调中存在的问题 提示微调的问题 在提示调优中缺乏对先验知识保存的保证(me:即提示微调有可能会丢失预训练模型中的通用知识)。虽然预先训练的文本分支模块(如文本编码器和投影)的权重在提示调优范式中被冻结,但原始的良好学习的分类…

图文深入理解SQL语句的执行过程

List item 本文将深入介绍SQL语句的执行过程。 一.在RDBMS(关系型DB)中,看似很简单的一条已写入DB内存的SQL语句执行过程却非常复杂,也就是说,你执行了一条诸如select count(*) where id 001 from table_name的非常简…