Redis深入学习

news2025/2/11 9:49:47

目录

Redis是什么?

Redis使用场景

Redis线程模型

Redis执行命令是单线程的为什么还这么快?

Redis持久化

Redis 事务

Key 过期策略

Redis 和 mysql 如何保证数据一致?

缓存穿透

缓存击穿

缓存雪崩


Redis是什么?

        redis是一个nosql类型的数据库(非关系型数据库),数据在内存中以键值对形式存储。

        nosql:not only sql(不仅仅是sql) ,泛指非关系型数据库。一般把非关系型数据库称为nosql数据库。

        特点:读写速度快,也提供数据持久化方式。

        一般最常用的场景就是把redis用来做缓存

Redis使用场景

1.缓存

2.计数器,点赞

3.排行榜 数据结构,zset 按照分数排序

4.数据排重,去除重复数据

5.消息队列,redis中有一个list结构

6.分布式锁

Redis线程模型

        Redis 6.0版本前 完全依赖单线程模型,所有命令执行和网络 I/O 都在同一个线程中进行,虽然这保证了数据的一致性,但在高并发环境下可能导致性能瓶颈。

        Redis 6.0版本后:在保留单线程模型的基础上,新增了对多线程的支持,尤其是在网络 I/O 方面。通过多线程优化了客户端请求的接收和响应发送,从而提升了高并发环境下的性能,但核心的命令执行仍然是单线程的。

Redis执行命令是单线程的为什么还这么快?

1.数据都存储在内存中,读写速度都是内存级别的,所以快。

2.基于哈希结构存储,通过key可以快速的在哈希表中找到对应的数据。

3.避免了上下文切换,由于是单线程模式,所以不存在切换的开销。

Redis持久化

        为什么redis要提供持久化机制?

        我们现在除了缓存数据外,还将一些例如点赞等数据也是存储到redis的,这种服务万一断电,那么内存中的数据就丢失了。所以redis提供了持久化功能。

redis提供了两种持久化机制:

RDB

        是redis中默认的持久化机制(默认开启)。

        当满足条件时,会对内存中的数据进行拍照,以快照的方式把数据存储到 .rdb 文件中。

        快照:(把key:value数据直接存储到.rdb文件中),触发持久化规则: 在redis.conf 文件中。

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

 save 300 10

 save 60 10000
 
 save命令用来配置触发 Redis 的 RDB 持久化条件。

    AOF

        也是redis中持久化的一种方式,默认是没有启动的。

        需要在redis.conf文件中配置appendonly no-->yes

        aof方式,以执行日志的方式记录的,将所有写操作的命令按顺序追加记录到"appendonly.aof"文件中,还原数据时,逐行执行这些命令即可。

配置规则:

appendfsync always 每次执行都会记录

appendfsync everysec 每秒执行一次

Redis 事务

redis中的事务相比于mysql事务,简单很多。

        redis中的事务,保证同一个事务在执行时,事务中的多条命令执行时,不会有其他事务插入到中间执行,因为redis是单线程。(不会被其他事务插入)

        redis事务执行时,不保证多条指令执行的原子性,多条指令执行时,中间如果有错误的命令,不会影响其他命令的执行。(一条命令错误,不影响其他命令的执行)

mutil --命令开启事务

set key value --加入事务

exec --执行事务中的命令

加入事务后不会立即提交,而是在执行exec命令后提交事务。

Key 过期策略

redisTemplate.opsForValue().set("k", "v",10,TimeUnit.SECONDS );

        redis中为key维护一个状态,表示是否过期,当定时的时间到期后,将状态改为已过期,并没有立即删除key。(过期但并未删除键)

在redis中有两种策略删除过期的key:

1.惰性删除: 当key过期后,在下次使用此key时,发现key已经过期,然后再删除过期的key,不足之处:浪费内存空间。

优点:不需要有额外的线程定时定点的跟踪删除。

2.定期删除:每隔指定的周期,对redis中过期的key进行清理。

Redis 和 mysql 如何保证数据一致?

        此问题讲的是如何尽可能的保证,redis中和mysql中的数据保持一致(主要是发生修改时)

        采用延时双删策略,在更新mysql之前先删除redis中的数据,在mysql没有完全更新数据完成

时,其他线程可以先读取旧的数据,在mysql数据更新完成后,再次删除redis中的数据,后来的线程确保读到就是最新的mysql中的数据。

缓存穿透

问题:

        key对应的数据在数据库不存在,每次先查询缓存,缓存中没有,然后去查询数据库,数据库中也不存在,返回null,为null,没有往缓存中放,每次都还是直接查询的mysql。

解决方案

        1.当mysql中查询不到时,可以向redis中存储一个key-value,value可以为null/-1,表明mysql中不存在。

        2.对参数进行校验不满足,就不查询。(如请求的id为-1)

        3.使用布隆过滤器。

布隆过滤器

是一个二进制数组,用于判断元素是否存在。

        使用 k 个哈希函数对某个值进行哈希计算,计算出来的哈希值存储到对应数组位置,把数组原来位置的0变为1。

        查询是否存在时,同样用k个哈希函数计算哈希值,如果每个位置上都是1,表明数据可能存在,只要有一个位置是0,那么数据肯定不存在的。

优点:

  1. 时间复杂度低,增加和查询元素的时间复杂为 O(N)。

  2. 保密性强,布隆过滤器不存储元素本身。

  3. 存储空间小,布隆过滤器是非常节省空间的。

缺点:

  1. 误判

  2. 无法删除

缓存击穿

问题:

        数据在数据库是存在的,只是redis中的热点key过期了,这时有大量的请求到来,同时请求到mysql,导致mysql压力过大。一般在秒杀这类场景中会发生的。

解决办法

1.热点数据设置较长过期时间。

2.跑定时任务,在缓存失效前刷新缓存

3.加锁,可以给查询mysql的代码进行加锁,一个线程查询完后,把数据放到redis中,对访问mysql进行控制。(对mysql加锁,对redis不加锁

缓存雪崩

问题:

        大量的热点key过期,或者redis服务出现了问题,大量请求访问到mysql。

解决办法

        1.可以给热点key设置随机过期时间,避免同时过期。

        2.可以使用集群部署,如果有一台redis服务出现问题,其他redis服务仍然可以使用,还可以将热点的key,存储到不同的redis库中。

        3.跑定时任务,在缓存失效前刷新缓存

 感谢你的阅读与关注,如有问题欢迎探讨!💓

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

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

相关文章

EasyExcel 导出合并层级单元格

EasyExcel 导出合并层级单元格 一、案例 案例一 1.相同订单号单元格进行合并 合并结果 案例二 1.相同订单号的单元格进行合并2.相同订单号的总数和总金额进行合并 合并结果 案例三 1.相同订单号的单元格进行合并2.相同订单号的商品分类进行合并3.相同订单号的总数和总金额…

青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要

青少年编程与数学 02-009 Django 5 Web 编程 01课题、概要 一、Django 5Django 5 的主要特性包括: 二、MVT模式三、官方网站四、内置功能数据库 ORM(对象关系映射)用户认证和授权表单处理模板引擎URL 路由缓存框架国际化和本地化安全性功能管…

2.7学习

crypto buu-还原大师 仔细阅读题目,这里有一段字符串,但是其中有四个大写字母被替换成了‘?’,那么我们写脚本:首先将四个问号均换成26个大写字母并且组成不同的组合, 所以有四个循环让四个问号都遍历26个…

oracle ORA-27054报错处理

现象 在oracle执行expdp,rman备份,xtts的时候,由于没有足够的本地空间,只能使用到NFS的文件系统但有时候会出现如下报错 ORA-27054: NFS file system where the file is created or resides is not mounted with correct options根据提示信…

使用LLaMA Factory踩坑记录

前置条件:电脑显卡RTX 4080 问题:LLaMA-Factory在运行的时候,弹出未检测到CUDA的报错信息 结论:出现了以上的报错,主要可以归结于以下两个方面: 1、没有安装GPU版本的pytorch,下载的是CPU版本…

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)

根据合宙的AT研发推荐, AT指令基本上也简单看完了,这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发,将以前复杂的设备通讯方式转换成简单的串口编程, 大大简化了产品的硬件设计和软件开发成本,这使得几乎所…

Reqable使用实践

一、背景 日常开发中,难免要抓取请求数据,查看接口数据,从而更好定位问题,基于这个原因,查找了一些抓包工具,例如: HttpCanary、 Steam 、Fiddler等,不是要钱,就是只对苹…

【蓝桥杯嵌入式】2_LED

全部代码网盘自取 链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码:3ii2 1、电路图 74HC573是八位锁存器,当控制端LE脚为高电平时,芯片“导通”,LE为低电平时芯片“截止”即将输出状态“锁存”…

B树详解及其C语言实现

目录 一、B树的基本原理 二、B树操作过程图形化演示 三、B树的应用场景 四、C语言实现B树及示例 五、代码执行结果说明 六、应用实例:文件系统目录索引 七、总结 一、B树的基本原理 B树(B-Tree) 是一种自平衡的树数据结构,…

ARM64 Linux 内核学习指南:从基础到实践

前言 ARM64 作为当今主流的处理器架构,被广泛应用于移动设备、嵌入式系统和服务器领域。学习 ARM64 在 Linux 内核中的实现,不仅有助于深入理解操作系统底层机制,还能提升在内核开发、驱动编写、虚拟化等领域的专业能力。 本指南面向对 Lin…

零基础都可以本地部署Deepseek R1

文章目录 一、硬件配置需求二、详细部署步骤1. 安装 Ollama 工具2. 部署 DeepSeek-R1 模型3. API使用4. 配置图形化交互界面(可选)5. 使用与注意事项 一、硬件配置需求 不同版本的 DeepSeek-R1 模型参数量不同,对硬件资源的要求也不尽相同。…

掌握Spring @SessionAttribute:跨请求数据共享的艺术

SessionAttribute注解在Spring中的作用,就像是一个“数据中转站”。 在Web应用中,我们经常需要在多个请求之间共享数据。比如,用户登录后,我们需要在多个页面或请求中保持用户的登录状态。这时,SessionAttribute注解就…

视频采集卡接口

采集卡的正面有MIC IN、LINE IN以及AUDIO OUT三个接口, MIC IN为麦克风输入,我们如果要给采集到的视频实时配音或者是在直播的时候进行讲解,就可以在这里插入一个麦克风, LINE IN为音频线路输入,可以外接播放背景音乐…

64【32与64位程序的区别】

很多人可能有一个观念,那就是64位的程序NB,有技术含量,但是要说nb在哪,很多人又说不上来,本节来对这个问题做一个探讨 下图中左边的是加载的64程序,右边的是32位程序, 在上一节课我们已经理解…

ai智能DeepSeek 在 Cursor 中的配置与应用实践

DeepSeek 是一款高效的深度搜索引擎,能够为开发者提供更智能、更精准的搜索体验。在数据量大、查询复杂的场景中,DeepSeek 能够帮助提升查询的响应速度和精确度。本文将介绍 DeepSeek 在 Cursor 中的配置与应用,帮助开发者理解如何在实际开发…

Deepseek的起源与发展

文章目录 前言一、Deepseek的起源二、DeepSeek的发展脉络三、Deepseek的突破与优势(1)功能强大:核心能力与应用场景(2)性能优势:效率与效果的革命性提升四、Deepseek开源引发关注前言 DeepSeek 在网络安全领域带来的新机遇,DeepSeek 从崭露头角到引领 AI 领域的重大变革,已…

【如何掌握CSP-J 信奥赛中的深搜算法】

CSP-J 信奥赛中的深搜(深度优先搜索)算法是一个重要知识点,以下是一些学习深搜算法的建议: 理解基础概念 定义与原理:深度优先搜索是一种用于遍历或搜索图、树等数据结构的算法。它从起始节点开始,沿着一条…

Unity笔试常考

线程同步的几种方式 1.信号量pv操作 2.互斥加锁 3.条件变量 五层网络协议指的是哪五层 1.应用层 2.运输层 3.网络层 4.链路层 5.物理层 TCP和UDP区别 tcp 面向连接,保证发送顺序,速度慢,必须在线,三次握手,4次挥手…

Qt:Qt基础介绍

目录 Qt背景介绍 什么是Qt Qt的发展史 Qt支持的平台 Qt版本 Qt的优点 Qt的应用场景 Qt的成功案例 Qt的发展前景及就业分析 Qt背景介绍 什么是Qt Qt是⼀个跨平台的C图形用户界面应用程序框架。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是完全面向…

【deepSeek R1】Ollama 更改模型安装位置 以及应用安装位置

【deepSeek R1】Ollama 更改模型安装位置 以及应用安装位置 本地版部署deepSeek R1 可以参考文章 3分钟教你搭建属于自己的本地大模型 DeepSeek R1 Ollama 是一个开源工具,旨在帮助用户轻松在本地计算机上运行、部署和管理大型语言模型(LLMs)…