Redis详解(redis线程模式、数据持久化机制、主从复制、缓存穿透、缓存击穿等)

一.redis概述

redis主要用作数据库、缓存和消息中间件, 支持多种语言, 是基于内存的key-value数据结构存储系统.

redis支持数据的持久化, 可以将内存中的数据保存在磁盘中, 重启的时候可以再次加载进行使用.

redis不仅仅支持key-value数据结构, 还支持list, set, hash等数据结构.

redis支持数据的备份,即master-slave(主-从)模式的数据备份.

二.redis线程模型

在redis6.x之前是真正的单线程, 对外提供的键值存储服务也是单线程的, 整个网络IO和数据读写操作都是由单线程完成的.

在redis6.x之后引入的多线程指的是网络的请求时多线程的, 但是读写数据的读写操作还是单线程的, 所以redis是并发安全的.

那么为什么redis是单线程的执行速度还那么快呢?

1.redis是基于内存操作的, 所有的运算都是内存级别的, 查找和操作的时间复杂度都是O(1), 所以cpu不是redis的瓶颈, 所以它的性能比较高.

2.底层数据结构简单, 是hash表, 查找和操作的时间复杂度都是O(1)的.

3.redis使用的是I/O多路复用监听多个socket连接客户端, 是的一个线程来处理多个情况, 减少线程切换带来的开销, 同时也避免了I/O阻塞操作, 大大提高了redis的性能

4.因为单线程模型, 避免了不必要的上下文切换和多线程的竞争.

全局的hash表:

hash 可以在 O(1)的时间内计算出 hash 值并且找到对应的 entry 位置,entry里面是一个一个 key 指针和 value 指针,其实还有其他信息。这也是 redis 之所以性能高的原因之一.

三.redis持久化

Redis 是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。Redis 还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和 AOF(Append Only File).

在我们安装了 redis 之后,所有的配置都是在 redis.conf 文件中,里面保存了 RDB 和 AOF 两种持久化机制的各种配置。当符合一定条件时 Redis 会自动将内存中的数据进行快照并持久化到硬盘。

1.RDB方式

rdb持久化就是在指定的时间间隔内将内存中的数据集快照写入磁盘,也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为 dump.rdb。 在redis.conf中有触发快制造快照的条件:

如下配置: save 900 1 :表示 900 秒钟内至少 1 个键被更改则进行快照。

save 300 10 :表示 300 秒内至少 10 个键被更改则进行快照。

save 60 10000 :表示 60 秒内至少 10000 个键被更改则进行快照。

在redis客户端模式中,使用shutdown save 命令在关闭redis服务时,保存快照

重新启动redis服务时,把dump.rdb文件内容还原回来.

2.AOF方式

以日志的形式来记录每个写操作,将 Redis 执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis 启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作.

appendfsync always #每次修改都会 sync 消耗性能

appendfsync everysec #每秒执行一次 sync,可能会丢失这1s 的数据(默认)

定期结合mysql,人为的定期将数据写入到mysql中

四.redis事务

redis事务,是将多条命令放入到一个队列中,按顺序执行, 保证多条命令,在同一个事务中执行.

不受其他客户端的影响.

redis事务操作:

multi 开启事务

命令1

命令2

命令3 把命令加入到一个队列中,并没有立即执行

exec 执行事务

但是事务不保证同一事物中多条命令执行的原子性,即使命令有错误也会添加到队列中,执行报错也不影响其他命令执行.

redisTemplate.multi();开启事务
        ValueOperations valueOperations = redisTemplate.opsForValue();
        valueOperations.set();
        valueOperations.set();
        valueOperations.set();
     redisTemplate.exec();执行事务

五.主从复制

是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。使用一个 Redis 实例作为主机,其余的作为备份机。主机和备份机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取。也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。

即使期间,有一台服务器出现问题,其他redis服务也可以正常工作.当有问题的服务故障排除后,可以继续在集群中工作.

那么要实现redis主从复制的安全性, 肯定避免不了数据冗余, 服务器冗余的问题

主从复制的作用有:

负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量.

高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis 高可用的基础

redis主从集群不提供容错和恢复的功能, 一旦主节点挂了, 不会自动选取出新的master, 导致客户端所有的写请求都失败, 所以redis提供了哨兵机制, 解决了恢复的功能,但是存在在线扩容的问题, 于是就有了第三种集群方式---redis cluster

redis cluster

实现了redis分布式存储, 也就是每一个节点存储不同的数据, 实现数据分片的功能, 在redis cluster中引入了slot槽, 来实现数据分片, slot的整体取值范围为0----16383, 每个节点会分配一个slot空间, 当我们存取key的时候, redis会根据key计算一个slot值, 找到对应节点进行数据读写操作. 从集群架构来说, redis cluster是一个多主多从的集群, 只有在redis服务器宕机之后在会工作.

哨兵机制:

哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。

它可以通过一套选举机制,在多台从机中选取一台作为主机, 当主机故障恢复后,临时主机又变为从机角色.

六.Key 过期策略

1. 立即删除。在设置键的过期时间时,创建一个回调事件,当过期时间达到时,由时间处理器自动执行键的删除操作。立即删除能保证内存中数据的最大新鲜度,因为它保证过期键值会在过期后马上被删除,其所占用的内存也会随之释放。但是立即删除对 cpu 是最不友好的。因为删除操作会占用 cpu 的时间.

2. 惰性删除。惰性删除是指,某个键值过期后,此键值不会马上被删除,而是等到下次被使用的时候,才会被检查到过期,此时才能得到删除。所以惰性删除的缺点很明显:浪费内存。dict 字典和 expires 字典都要保存这个键值的信息。

3. 定时删除。每隔一段时间,对 expires 字典进行检查,删除里面的过期键。可以看到,第二种为被动删除,第一种和第三种为主动删除,且第一种实时性更高。每隔一段时间执行一次删除操作,并通过限制删除操作执行的时长和频率,来减少删除操作对 cpu 的影响。另一方面定时删除也有效的减少了因惰性删除带来的内存浪费。

redis 使用的过期键值删除策略是:惰性删除加上定期删除,两者配合使用。

七.缓存穿透、缓存击穿、缓存雪崩

首先看一下缓存处理流程:

1.缓存穿透

我们要查询的数据在数据库中本身就是不存在的, 那么redis中也是不存在的, 每次查询的请求都会直接进入到数据库中.

2.缓存击穿

前提是数据库中有数据, 在某个时间点上, 热点key过期了, 而这时有大量的请求, 如果没有任何的限制, 全都进入到redis中,但是redis中的key已经过期, 所有的请求都会直接进入到数据库中, 导致mysql被压垮

解决的方法:

1.合理的设置过期的时间

2.加锁, redis中如果为空, 等第一个请求的数据进入到缓冲池中时, 再让其他请求从缓存中获取数据.

3.缓存雪崩

大量的key过期,或者缓存出现故障,导致大量的请求到达mysql

解决办法:

1.设置随机过期时间

2.把热点key,放在不同的从机

3.设置不过期

4.定时任务,将快过期的key,重新放入到缓存

对于“Redis 宕机,请求全部走数据库”这种情况,我们可以有以下的思路:

事发前:实现 Redis 的高可用(主从架构+Sentinel(哨兵),尽量避免 Redis挂掉这种情况发生。

事发中:万一 Redis 真的挂了,我们可以设置本地缓存(ehcache)+限流,尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)

事发后:redis 持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CHAPTER 7 HPC集群部署 - hadoop

HPC集群部署 - hadoop1. 介绍2. 优点3. 架构及相关组件3.1 HDFS3.1.1 NameNode3.1.2 DataNode3.1.3 Secondary NameNode3.1.4 Client(客户端)3.2 Mapreduce(分布式计算框架)3.3. HBase(分布式列存储数据库)3.4 Zookeeper&#xff…

【其它】玩一玩无线网桥PicoStation M2

一、无线网桥是什么? 无线网桥就是代替网线实现网络连接的装置。看下面这个场景,摄像头与录像机之间可以直接用网线连接,但遇到两者相距较远的情况,铺设网线成本太高,这时候可以用无线网桥进行连接。无线网桥一般成对…

SSM项目之租赁汽车管理

项⽬描述 汽⻋租赁管理系统,管理系统中不仅有客户的管理还有⻋辆租赁的管理,租赁⻋辆公司对于租⻋的流程,租⻋过程的问题,对于客户的维护及不同维度统计租⻋的情况做数据化管理,⽅便租⻋公司更好的维护⻋辆和⻋辆的信…

易基因: m6A RNA甲基化研究的前期探索性实验思路|干货系列

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近年来,m6A RNA甲基化作为国家自然科学基金表观遗传学研究的热门领域,相关研究成果层出不穷,高分文章不断。研究方向包括疾病发生发展、发育和分化、环…

误删磁盘恢复方法

一、工具如下:1、磁盘分区恢复工具(分区助手 9.8.0)---链接:https://pan.baidu.com/s/1t3siEwtYZl7XtcNJ8t5oLg 提取码:9tsy2、DiskGenius 磁盘信息查看工具(修复要收费):链接:https://pan.baid…

(源码篇02)webpack5中的事件调度系统和NormalModuleFactary核心逻辑

1. 书接上回,从 this.factorizeQueue.add(options, callback); 开始 不是很清楚上下文的兄弟,可以去看下我之前写的 (源码篇01)浅析webpack5中Compiler中重要的hook调用过程。 此文比较干,各位读者开始阅读前&#xf…

反射器和Spring中的IOC/DI

1.什么是反射 1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。 2)Java属于先编译…

LC-1637. 两点之间不包含任何点的最宽垂直区域(模拟)

1637. 两点之间不包含任何点的最宽垂直区域 难度中等25 给你 n 个二维平面上的点 points ,其中 points[i] [xi, yi] ,请你返回两点之间内部不包含任何点的 最宽垂直区域 的宽度。 垂直区域 的定义是固定宽度,而 y 轴上无限延伸的一块区域…

户外徒步用什么耳机好?户外运动耳机推荐

作为一个徒步爱好者,在长时间的户外行走的途中自然会准备一个耳机来陪伴我。市面上各种运动型耳机层出不穷,价格也从几十到上千不等。但是喜爱的运动项目不同对运动耳机的需求也不一样。今天我们就来盘带点一下市面上各产品的性能参数,哪一款…

如何理解文件描述符和文件指针,两者的区别和联系?

下面是一些预备的知识: 我们先来回顾一下这张图 如果你对此图并不了解,甚至完全都知道这张图,那么下面的内容了解起来可能并不容易。 第一,首先我们要明确的认识一点,文件流指针是各种语言对系统调用接口的封装&…

代码随想录算法训练营第四十二天 | 416. 分割等和子集

背包问题之01背包问题基础: 视频讲解 (一)常见要求: 有n件物品,每个物品只有一个,和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次&a…

【操作系统】模块六 :文件系统 (Linux文件目录 | 文件系统 | B树 B+树 |分布式文件系统)

文章目录【操作系统】模块六 :文件系统Linux的文件目录分区结构挂载目录结构/usr(Unix System Resource) 包含系统需要的资源文件,通常应用程序会把后来安装的可执行文件 也放到这个目录下,比如说文件系统底层设计 FAT…

树莓派学习笔记(十二)Linux驱动认知及编译加载驱动

文章目录一、Linux驱动认知二、内核空间1、如何找到相关的驱动2、主设备号和次设备号3、驱动链表:管理所有设备的驱动4、驱动插入链表的顺序由设备号检索5、驱动代码的开发三、驱动编写、编译、测试四、驱动阶段性总结一、Linux驱动认知 Linux驱动分为用户空间、内…

TCP网络事件模型的封装2.0

TCP网络事件模型的封装2.0 最近学习了TCP网络模型的封装,其中运用的封装技术个人感觉有点绕 在反复读代码、做思维导图下初步理解了这套封装模型,不禁感叹原来代码还能这样写?神奇! 为此将源码分享出来并将流程图画出&#xff…

FITC-PEG-SH,荧光素-聚乙二醇-巯基的用途:用于修饰氨基酸,蛋白质等

FITC-PEG-SH 荧光素聚乙二醇巯基 英文名称:Fluorescein (polyethylene glycol)Thiol 中文名称:荧光素聚乙二醇巯基 外观: 黄色液体、半固体或固体,取决于分子量。 溶剂:溶于水等其他常规性有机溶剂 激光/发射波长&#xff1a…

ChatGPT使用案例之自然语言处理

ChatGPT使用案例之自然语言处理 自然语言处理被誉为“人工智能皇冠上的明珠”,这句话就已经说明了自然语言处理在整个人工智能体系中的重要性,自然语言处理(Natural Language Processing,NLP)是一种涉及计算机和人类自…

联想小新 青春版-14笔记本电脑重装系统教程

在使用笔记本电脑的过程中,我们难免会遇到一些问题,比如系统崩溃、病毒感染等等。这时候,我们就需要重装系统来解决这些问题。而联想小新 青春版-14笔记本电脑的系统重装方法,就是我们需要掌握的技能之一。本文将详细介绍如何重装…

python怎么自学

其实0基础选择python学习入行的不在少数,Python近段时间一直涨势迅猛,在各大编程排行榜中崭露头角,得益于它多功能性和简单易上手的特性,让它可以在很多不同的工作中发挥重大作用。 正因如此,目前几乎所有大中型互联网…

element-plus官网访问太慢 下载文档到本地部署 实现快速查阅

我只是吐槽下 element基于githup pages这个部署文档地址 本来访问就慢,然后吧这个文档看的人还很多,导致更慢了 经常卡半天才出来文档地址 文档地址: https://github.com/element-plus/element-plus/tree/gh-pages 文档的地址(你直接下载下来 想跑起来的话可能需要更改文档的路…

【C++】IO流 + 空间配置器(了解)

文章目录📖 前言1. IO流1.1 C语言的输入和输出:1.2 流的概念及特性:1.3 自定义类型隐式类型转换:1.4 在线OJ中的输入和输出:1.5 CIO流对文件的操作:1.6 stringstream介绍:2. 空间配置器2.1 什么…
最新文章