当前位置: 首页 > news >正文

Redis深入学习

目录

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 10save 60 10000save命令用来配置触发 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.跑定时任务,在缓存失效前刷新缓存

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

相关文章:

Redis深入学习

目录 Redis是什么? Redis使用场景 Redis线程模型 Redis执行命令是单线程的为什么还这么快? Redis持久化 Redis 事务 Key 过期策略 Redis 和 mysql 如何保证数据一致? 缓存穿透 缓存击穿 缓存雪崩 Redis是什么? redis是一…...

《从入门到精通:蓝桥杯编程大赛知识点全攻略》(十一)-回文日期、移动距离、日期问题

前言 在这篇博客中,我们将通过模拟的方法来解决三道经典的算法题:回文日期、移动距离和日期问题。这些题目不仅考察了我们的基础编程能力,还挑战了我们对日期处理和数学推理的理解。通过模拟算法,我们能够深入探索每个问题的核心…...

在Uniapp中使用阿里云OSS插件实现文件上传

在开发小程序时,文件上传是一个常见的需求。阿里云OSS(Object Storage Service)是一个强大的云存储服务,可以帮助我们高效地存储和管理文件。本文将介绍如何在Uniapp小程序中使用阿里云OSS插件实现文件上传功能。 1. 准备工作 首…...

9 数据流图

9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流...

IDEA查看项目依赖包及其版本

一.IDEA将现有项目转换为Maven项目 在IntelliJ IDEA中,将现有项目转换为Maven项目是一个常见的需求,可以通过几种不同的方法来实现。Maven是一个强大的构建工具,它可以帮助自动化项目的构建过程,管理依赖关系,以及其他许多方面。 添加Maven支持 如果你的项目还没有pom.xm…...

【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现

目录 1. 用队列实现栈 1.1 题目链接及描述 1.2 解题思路 1.3 程序 2. 用栈实现队列 2.1 题目链接及描述 2.2 解题思路 2.3 程序 1. 用队列实现栈 1.1 题目链接及描述 1. 题目链接 : 225. 用队列实现栈 - 力扣(LeetCode) 2. 题目描…...

SAP-ABAP:ROLLBACK WORK使用详解

在SAP ABAP 中,ROLLBACK WORK 语句用于回滚当前事务(LUW,Logical Unit of Work),撤销自上次提交或回滚以来的所有数据库更改。它通常与 COMMIT WORK 配合使用,确保数据一致性。 关键点: 回滚作…...

DeepSeek R1 Distill Llama 70B(免费版)API使用详解

DeepSeek R1 Distill Llama 70B(免费版)API使用详解 在人工智能领域,随着技术的不断进步,各种新的模型和应用如雨后春笋般涌现。今天,我们要为大家介绍的是OpenRouter平台上提供的DeepSeek R1 Distill Llama 70B&…...

如何避免大语言模型中涉及丢番图方程的问题

希尔伯特第十问题是一个著名的数学问题,涉及不定方程(又称为丢番图方程)的可解答性。然而在大模型中,我们希望问题都是确定的可解的,或者说要尽可能的想办法避免不确定的不可解问题。由于丢番图方程问题是不可判定问题(即不存在一个有效的算法能够解决该类问题的所有实例…...

flutter 获取网络图片的尺寸

获取网络图片的尺寸 import dart:async;import package:flutter/widgets.dart;/// Image Util. class ImageUtil {late ImageStreamListener _listener;late ImageStream _imageStream;/// get image width height,load error throw exception.(unit px…...

MySQL主从同步+binlog

一、简介 MySQL内建的复制功能是构建大型,高性能应用程序的基础 通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而…...

实践深度学习:构建一个简单的图像分类器

引言 深度学习在图像识别领域取得了巨大的成功。本文将指导你如何使用深度学习框架来构建一个简单的图像分类器,我们将以Python和TensorFlow为例,展示从数据准备到模型训练的完整流程。 环境准备 在开始之前,请确保你的环境中安装了以下工…...

蔚来C++面试题及参考答案

栈了解吗? 栈在计算机科学中是一种重要的数据结构,在 C++ 编程里有不同层面的体现,分别是数据结构层面和内存管理层面。 从数据结构角度来看,栈遵循后进先出(LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。在 C++ 标准模板库(STL)中,提供了std::stac…...

C# Winform怎么设计串口,客户端和相机控件界面显示

首先我们必须把这个类创建好 INIAPI using System; using System.Text; using System.Runtime.InteropServices;namespace Ini {public class IniAPI{#region INI文件操作/** 针对INI文件的API操作方法,其中的节点(Section)、键(KEY&#x…...

C++字符串相关内容

字符串 字符串,本质上是一个接一个字符的一组字符。字母、数字、符号等。 const char* 字符串名 字符后面会有一个空终止符,为0。 字符串从指针的内存地址开始,然后继续下去,直到它碰到0,然后意识到字符串终止了。 …...

利用二分法进行 SQL 时间盲注

什么是时间盲注? SQL 盲注(Blind SQL Injection)是一种常见的 Web 安全漏洞,其中时间盲注是基于查询延迟的 SQL 注入方式。当服务器不返回可见的错误信息时,我们可以利用 SLEEP() 函数来判断查询结果是否符合预期。 …...

数据库管理-第293期 奇怪的sys.user$授权+(20250210)

数据库管理293期 2025-02-10 数据库管理-第293期 奇怪的sys.user$授权(20250210)1 清空shared pool2 SR反馈总结 数据库管理-第293期 奇怪的sys.user$授权(20250210) 作者:胖头鱼的鱼缸(尹海文&#xff09…...

react实例与总结(一)

目录 一、简单认识 1.1、特点 1.2、JSX语法规则 1.3、函数组件和类式组件 1.4、类组件三大属性state、props、refs 1.4.1、state 1.4.2、props 1.4.3、refs 1.5、事件处理 1.6、收集表单数据—非受控组件和受控组件 1.7、高阶函数—函数柯里化 1.8、生命周期—新旧…...

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

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

Qt 数据库SQLite 使用【01】基本功能

1.开发背景 Qt 开发过程中难免需要存储数据,可以选择保存到本地文件,但是查找比较麻烦,所以就有了数据库,主要是方便查找数据,增删改查等操作,而 SqLite 属于数据库中轻量级的存在,适合本地数据…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...