Redis基础知识

目录

一、为什么要用到Redis?

二、Redis 为什么运行比较快?

三、Redis的数据结构

四、Redis可以实现什么功能?

五、Redis 保证数据持久化方式

1、持久化方式主要有2种:RDB 和 AOF

2、RDB和AOF区别?

六、Redis 中的过期删除策略?

七、LRU和LFU有啥区别?

八、缓存

1、缓存雪崩

2、缓存穿透

3、缓存击穿

九、如何保证缓存和数据库数据的一致性


一、为什么要用到Redis?

Redis是非关系型数据库。
我们使用redis主要是为了解决两个问题,性能并发

性能:当我们浏览网页的时候肯定会涉及到查询数据的相关操作,这个时候我们将会访问数据库,但是问题来了,如果我们的某条sql执行起来非常的耗时并且这条sql又不会频繁的变动这个时候我们希望将这条数据放在内存中,这样我们再去拿这个数据要快很多,如此一来我们请求的响应时间也会快很多。

并发:在高并发的情况下,如果我们的多个请求直接访问数据库的话,数据库可能会因为访问量过大直接奔溃显示连接异常,这个时候就需要我们的Redis来作为中间件充当缓冲的作用了。

二、Redis 为什么运行比较快?

  • 数据存储在内存中:Redis 的数据存储在内存中,而内存的读写速度远远快于硬盘。这使得 Redis 能够实现非常快速的读写操作。
  • 单线程处理请求:Redis 是单线程的,因此可以避免线程切换和锁竞争等问题,提高了 CPU 的利用率和性能。
  • 高效的数据结构:Redis 提供了多种高效的数据结构,如哈希表、有序集合等,这些数据结构能够快速地进行插入、删除、查找和排序等操作。
  • 异步 I/O:Redis 使用异步 I/O 技术,可以在等待客户端输入或输出时继续处理其他请求,从而提高了系统的吞吐量。
  • 高效的持久化机制:Redis 提供了多种持久化机制,如 RDB、AOF 和混合持久化机制,这些机制运行都非常高效,可以在不影响性能的情况下保证数据的安全。

三、Redis的数据结构

Redis 常用的数据类型有 5 种:String 字符串类型List 列表类型Hash 哈希表类型Set 集合类型Sorted Set 有序集合类型

这 5 种常用类型的用途如下:

  1. String(字符串类型)常见使用场景是:存储 Session 信息、存储缓存信息(如详情页的缓存)、存储整数信息
  2. List(列表类型)常见使用场景是:实现简单的消息队列、存储某项列表数据;
  3. Hash(哈希表类型)常见使用场景是:存储 Session 信息、存储商品的购物车,购物车非常适合用哈希字典表示,使用人员唯一编号作为字典的 key,value 值可以存储商品的 id 和数量等信息、存储详情页信息;
  4. Set(集合类型)是一个无序并唯一的键值集合,它的常见使用场景是:关注功能,比如关注我的人和我关注的人,使用集合存储,可以保证人员不会重复;
  5. Sorted Set(有序集合类型)相比于 Set 集合类型多了一个排序属性 score(分值),它的常见使用场景是:可以用来存储排名信息、关注列表功能,这样就可以根据关注实现排序展示了。

四、Redis可以实现什么功能?

1、缓存:Redis 可以作为缓存系统,将热点数据存储在内存中,提高读写性能和响应速度,减少对后端数据存储的压力。

2、消息队列:Redis 的发布订阅功能和 List 数据结构可以实现消息队列的功能,实现异步处理任务、解耦系统组件之间的依赖关系等。

3、计数器和排行榜:Redis 的原子操作和 Sorted Set 数据结构可以实现计数器和排行榜的功能,支持快速地增加、减少和排序操作。

4、分布式锁:Redis 的 SETNX 命令可以实现分布式锁,避免多个客户端同时修改同一个数据,保证数据的一致性和正确性。

五、Redis 保证数据持久化方式

1、持久化方式主要有2种:RDBAOF

RDB:快照方式持久化,将某一个时刻的内存数据,以二进制的方式写入磁盘;

AOF:   文件追加持久化,记录所有非查询操作命令,并以文本的形式追加到文件中;

2、RDB和AOF区别?

(1)写入方式:RDB 是通过快照(snapshot)机制,将 Redis 中的数据集以二进制文件的方式写入硬盘;AOF 则是通过将 Redis 服务器执行的所有写命令(例如 set、del、incrby 等)记录在 AOF 文件中,写入方式是追加写入。

(2)数据恢复:当 Redis 重启时,可以根据 RDB 文件或 AOF 文件来恢复数据。恢复 RDB 文件比恢复 AOF 文件快,因为 RDB 文件包含了一个时间点上的快照,可以直接将整个数据集加载到内存中。而恢复 AOF 文件则需要逐条执行文件中记录的命令,需要更长的时间。

(3)数据完整性:RDB 文件保存的是 Redis 在某个时间点的数据快照,如果 Redis 在快照操作之后宕机,可能会丢失最后一次快照后的数据。而 AOF 文件记录了 Redis 所有的写命令,因此即使 Redis 宕机,也可以根据 AOF 文件恢复数据。

(4)文件大小:RDB 文件通常比 AOF 文件小,因为它只保存了一个时间点的数据快照,而 AOF 文件保存了所有的写命令,会比 RDB 文件大。

(5)优先级:AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据,AOF比 RDB 更安全也更大,如果两个都配了优先加载 AOF。

六、Redis 中的过期删除策略?

Redis 中有两种过期删除策略:

1、定期删除策略:Redis 会定期地(默认每秒钟检查 10 次)随机抽取一部分设置了过期时间的键,检查它们是否过期,如果过期则删除。该策略可以通过配置文件中的 hz 参数进行调整。

Redis 定期删除策略并不会遍历删除每个过期键,而是采用随机抽取的方式删除过期键,同时为了保证过期扫描不影响 Redis 主业务,Redis 的定期删除策略中还提供了最大执行时间,以保证 Redis 正常并高效的运行。

2、懒汉式删除策略:当访问一个键时,Redis 先检查该键是否过期,如果过期则删除。这意味着过期键可能会在访问时被删除,而不是在过期时立即删除。

七、LRU和LFU有啥区别?

LRU(最近最少使用)和   LFU(最不常使用)都是常见的缓存淘汰策略,它们在选择淘汰缓存中的键时有不同的侧重点。

1、LRU(最近最少使用)LRU 策略基于时间的概念,它认为最近被访问过的键是最有可能被再次访问的,因此在淘汰时会优先选择最久未被访问的键。

LRU 策略会维护一个访问顺序列表(双向链表+哈希表),每当一个键被访问时,它会被移动到列表的末尾,最近没有被访问的键会位于列表的前面。当需要淘汰键时,LRU 策略会选择列表前面的键进行淘汰。

2、LFU(最不常使用)LFU 策略基于访问频率的概念,它认为被访问次数最少的键是最不常用的,因此在淘汰时会优先选择访问次数最少的键。

LFU 策略会为每个键维护一个访问计数器,每当一个键被访问时,其计数器会增加。当需要淘汰键时,LFU 策略会选择访问计数最低的键进行淘汰。(哈希表)

主要区别:

1、LRU 是基于时间的策略,LFU 是基于访问频率的策略。

2、LRU 策略假设许久长期未使用的键是最不常用的,LFU 策略假设被访问次数最少的键是最不常用的。

3、LRU 维护一个访问顺序列表(双向链表+哈希表)来实现的,LFU 维护一个访问计数器(哈希表)来实现的。

4、LRU 只关注键的访问顺序,而 LFU 关注键的访问频率。

八、缓存

1、缓存雪崩

缓存雪崩:在缓存中大量的键同时过期或失效导致请求直接访问数据库或后端服务,给数据库或后端服务造成巨大压力,导致系统性能下降甚至崩溃的现象。

发生原因:

1、大量缓存键同时过期:当缓存键设置了相同的过期时间,或者由于某种原因导致大量的键同时失效,会导致缓存雪崩。

2、缓存服务器故障:当缓存服务器发生故障,无法提供服务时,请求将直接访问后端服务,导致压力集中在后端服务上。

解决方法:

1、设置随机过期时间:为缓存键设置随机的过期时间,避免大量键同时过期的情况发生,减少缓存雪崩的概率。

2、实现缓存预热:在系统启动或缓存失效前,提前加载热门数据到缓存中,避免在关键时刻大量请求直接访问后端服务。

3、使用分布式缓存:将缓存数据分布在多个缓存节点上,通过分散请求负载来减少单个缓存节点的压力,提高系统的可用性和抗压能力。

2、缓存穿透

缓存穿透是指大量的请求查询不存在于缓存和数据库中的数据,导致这些请求直接访问数据库,占用数据库资源,而缓存无法发挥作用的现象。

发生原因:

1、恶意请求(异常情况):攻击者发送大量恶意请求,故意查询不存在的数据,以触发缓存穿透。

2、高并发请求(正常业务):当有大量的并发请求同时查询不存在的数据时,可能会导致缓存无法命中,从而触发缓存穿透。

解决方法:

1、布隆过滤器:布隆过滤器是一种高效的数据结构,可以用于快速判断一个元素是否存在于集合中。在缓存层引入布隆过滤器,可以在查询请求到达时,首先通过布隆过滤器判断该请求对应的数据是否存在于缓存或数据库中,从而避免无效的查询操作。

2、缓存空值处理:对于查询数据库返回的空结果,也可以将空结果缓存起来,设置一个较短的过期时间,避免频繁查询数据库。这样在下次查询相同的数据时,可以直接从缓存中获取空结果,而不需要再次查询数据库。

3、缓存击穿

缓存击穿是指 某个热点数据过期或失效时,同时有大量的请求访问该数据,导致请求直接访问数据库或后端服务,给数据库或后端服务造成巨大压力,导致系统性能下降甚至崩溃的现象。

发生原因:

1、热点数据失效:当某个热点数据过期时,此时大量请求访问该数据,导致缓存失效,请求直接访问数据库。

2、并发访问热点数据:在高并发环境下,大量的请求同时访问同一个热点数据,导致该热点数据在缓存失效期间被并发地访问,触发缓存击穿。

解决方法:

1、设置热点数据永不过期或过期时间较长:对于一些热点数据,可以将其设置为永不过期,或者设置一个较长的过期时间,确保热点数据在缓存中可用,减少因为过期而触发的缓存击穿。

2、加互斥锁:在访问热点数据时,可以引入互斥锁,保证只有一个线程去访问后端服务或数据库,其他线程等待结果。当第一个线程获取到数据后,其他线程可以直接从缓存获取,避免多个线程同时访问后端服务,减轻压力。

九、如何保证缓存和数据库数据的一致性


1、缓存更新策略:当数据库中的数据发生变化时,需要及时更新缓存,可以采用主动更新和被动更新两种策略。主动更新是在数据库更新后,直接更新缓存中对应的数据;被动更新是在下一次查询缓存时,发现缓存已过期,重新从数据库中读取最新数据,并更新缓存。

2、双写一致性:双写一致性是指在更新数据库数据之前,先更新缓存数据,确保缓存和数据库中的数据保持一致。可以使用事务或者分布式锁来保证缓存和数据库的原子性操作。

3、延迟双删策略:在更新数据库数据前,先删除缓存中的数据,再进行数据库更新操作,这样可以保证在数据库更新期间,缓存中的数据已被删除,下一次查询时会从数据库中读取最新数据,并更新缓存。
 


 

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

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

相关文章

IDA常用操作、快捷键总结以及使用技巧

先贴一张官方的图,然后我再总结一下,用的频率比较高的会做一些简单标注 快捷键 F系列【主要是调试状态的处理】 F2 添加/删除断点F4 运行到光标所在位置F5 反汇编F7 单步步入F8 单步跳过F9 持续运行直到输入/断点/结束 shift系列【主要是调出对应的页…

洛谷 P9389 烂柯杯 C++代码

目录 前言 思路点拨 AC代码 结尾 前言 今天我们来做洛谷上的一道题目。 网址:[THUPC 2023 决赛] 烂柯杯 - 洛谷 题目: 乱七八糟一堆文字,展示不下。 思路点拨 思路1:和围棋有关的人,很容易想到柯洁。 思路2&…

【RotorS仿真系列】Ardrone模型介绍

ardrone是rotors仿真框架提供的一款机型,因为该机型与我们实际使用的机型参数相近,所以这里对它的参数做特别整理和记录。 一、模型参数总结 ardrone的gazebo模型如下图所示: 根据ardrone.yaml,其关键参数如下所示&#xff1a…

Project 1: The Game of Hog(CS61A)

(第一阶段)问题 5a(3 分) 实现该函数,该函数模拟了完整的 Hog 游戏。球员 交替轮流掷骰子,直到其中一名玩家达到分数。playgoal 您现在可以忽略 Feral Hogs 规则和论点; 您将在问题 5b 中实现它。feral_h…

UC++中的头文件和宏的那些事儿

假定有如下继承自AActor类的.h文件: #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MoveRandom.generated.h"UCLASS() class DEMO01_API AMoveRandom : public AActor {GENERATED_BODY()public…

车联网架构设计(一)_消息平台的搭建

车联网是物联网的一个主要应用方向,车辆通过连接车联网平台,实时进行消息的交互,平台可以提供车辆远程控制,故障检测,车路协同等各方面的功能。 我在车联网行业从事了很长时间的技术工作,参与了整个车联网…

树莓派多串口通信

树莓派多串口通信 串口配置串口通信函数分析串口通信示例代码 参考博文1:树莓派 4 UART 多串口配置通信参考博文2:树莓派wiringPi库详解关于树莓派相关其他环境配置可参考:快速上手树莓派关于wiringPi库初始化与IO口开发可参考:树…

深入探索FastAPI单元测试:使用TestClient轻松测试你的API

原文:深入探索FastAPI单元测试:使用TestClient轻松测试你的API-51CTO.COM 当使用FastAPI进行单元测试时,一个重要的工具是TestClient类。TestClient类允许我们模拟对FastAPI应用程序的HTTP请求,并测试应用程序的响应。这使我们能…

调优--学习笔记

1,Presto调优 数据存储格式 1)合理设置分区 与Hive类似,Presto会根据元信息读取分区数据,合理的分区能减少Presto数据读取量,提升查询性能。 2)使用列式存储 Presto对ORC文件读取做了特定优化&#xff0c…

Qt OpenCV 学习(一):环境搭建

对应版本 Qt 5.15.2OpenCV 3.4.9MinGW 8.1.0 32-bit 1. OpenCV 下载 确保安装 Qt 时勾选了 MinGW 编译器 本文使用 MinGW 编译好的 OpenCV 库,无需自行编译 确保下载的 MinGW 和上述安装 Qt 时勾选的 MinGW 编译器位数一致,此处均为 x86/32-bit下载地址…

《微信小程序开发从入门到实战》学习四十

4.2 云开发JSON数据库 4.2.11 更新数据 使用数据库API更新数据有两种方法:一.将记录局部更新的update方法;二.以替换的方式更新记录的set方法 update方法可以局部更新一个记录或一个集合的多个记录,更新时只有指定字段更新,其他…

电脑连不上wifi,适配器Intel(R)WiFi6 AX201 160MHz遇到与驱动程序或硬件相关问题,连不上wifi,电脑WiFi图标没了

电脑WiFi图标没了,电脑连不上wifi 适配器IntelWiFi6 AX201 160MHz遇到与驱动程序或硬件相关问题应该怎么解决? 方法一:电脑冷重启即可 就是长按那个开机键,然后滑动关机,,,重启(我…

智能诊疗体验:整合AI技术的互联网医院小程序开发

在科技化的趋势下,互联网医院小程序的开发变得愈发重要,尤其是通过整合人工智能(AI)技术,进一步提升了就医的效率。 一、引言 互联网医院小程序其开发目标是提高医疗服务的效率,同时也也提升了用户的就医…

Clickhouse在货品标签场景的应用

背景 在电商场景中,我们经常需要对货品进行打标签的操作,简单来说就是对货品进行各种分类,按照价格段进行分组,此时运营人员就可以通过价格段捞取到满足条件的商品了,本文就来简单看下这个场景如何在clickhouse中实现…

23种设计模式之C++实践(一)

23种设计模式之C++实践 1. 简介2. 基础知识3. 设计模式(一)创建型模式1. 单例模式——确保对象的唯一性1.2 饿汉式单例模式1.3 懒汉式单例模式比较IoDH单例模式总结2. 简单工厂模式——集中式工厂的实现简单工厂模式总结3. 工厂方法模式——多态工厂的实现工厂方法模式总结4.…

【像素画板】游戏地图编辑器-uniapp项目开发流程详解

嘿,用过像素画板没有哦,相信喜欢绘画的小朋友会对它感兴趣呢,用来绘制像素画非常好看,有没有发现,它是可以用来绘制游戏地图的,是不是很好奇,来一起看看吧。 像素画板,也叫像素画的绘…

c语言-归并排序

目录 1、归并排序基本思想 2、归并排序的实现(递归法) 2.1 代码实现递归法归并排序 3、归并排序的实现(非递归法) 3.1 修正边界问题 3.2 代码实现非递归法归并排序 结语: 前言: 归并排序是一种把数…

Python---格式化输出与%百分号----涉及转义符 \ 反斜杠的使用

相关链接Python--格式化输出中的转义符号----\t 制表符(空格的)和\n(换行的)_唯元素的博客-CSDN博客 Python---字符串(用单、双引号、 三单/双引号定义。反斜杠 \ 转义,单在双内/双在单内 )-CS…

力扣 --- 最后一个单词的长度

题目描述: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1: 输入:s "Hello World&…

运维02:Linux

Linux安装 VMWare安装:夸克网盘分享(提取码:refg) CentOS安装:Index of /centos/7.9.2009/isos/x86_64/ Xshell安装:百度网盘 请输入提取码(提取码:juau) 环境准备 1、…