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

Redis入门到精通(二):入门Redis看这一篇就够了

文章目录

  • 一、Redis的双写一致性
    • 1.延迟双删
    • 2.添加分布式锁
    • 3.异步监听+可靠消息
      • 基于MQ消息队列的异步监听
      • 基于Canal的异步通知
  • 二、Redis的持久化
    • 持久化流程
    • 1.RDB机制
      • 1.1save
      • 1.2bgsave
      • 1.3自动触发
    • 2.AOF机制
      • 三种触发机制
      • 3.RDB和AOF的对比
  • 三、Redis的数据删除策略
    • 1.惰性删除
    • 2.定期删除
  • 四、Redis的淘汰策略

一、Redis的双写一致性

当修改了数据库的内容,同时也要更新缓存的数据,缓存和数据库的数据要保持一致

1.延迟双删

  • 读操作:缓存命中,直接返回;缓存未命中,查询数据库并写入缓存,设置超时时间
  • 写操作:延迟双删
  • 特点:
    在这里插入图片描述
  1. 为什么是要删除缓存而不是更新缓存呢?
    1.1 更新缓存的优缺点:更新缓存的优点是每次数据变化都能够及时地更新缓存,这样不容易出现查询未命中的情况,但这种情况的消耗很大,如果数据需要经过复杂的计算再写入缓存的话,频繁的更新会影响到服务器的性能。如果是写入数据比较频繁的场景,可能会导致频繁的更新缓存而没有业务读取该数据
    1.2 删除缓存的优缺点: 删除缓存的优点是操作简单,缺点是删除了缓存,下一次操作容易出现未命中的情况,此时就需要读取数据库
    对比而言,删除缓存是更优选

  2. 是先删除缓存还是先删除数据库呢?
    无论先后顺序,都会有脏数据的风险

  3. 为什么要删除两次缓存?
    因为删除缓存,修改数据库后,会造成脏数据的风险,所以还需要再次删除缓存

  4. 为什么要延迟删除?
    因为数据库是主从模式,是读写分离的,我们需要等待一会数据库将数据从主节点同步到从节点,所以需要延迟删除

  5. 那么这样的设定是否一致能保证一致性呢?
    不能保证,因为时间无法控制,不能保证数据库”从库“更新后删除缓存。如果在”从库“更新前删除,用户再在更新前查”从库“又把脏数据写在缓存中了。

2.添加分布式锁

这里有一种添加分布式锁的方案来保证数据的强一致性
我们存入缓存中的数据,一般都是读多写少的数据,那么我们可以添加读写锁的方式来保证数据的强一致性。在读数据时,添加共享锁readLock,加锁之后m,其他线程可以共享读操作。在写数据时,添加排他锁writeLock,加锁之后,阻塞其他线程写的写操作。这样做可以保证数据强一致性,但是性能较低。

3.异步监听+可靠消息

基于MQ消息队列的异步监听

在这里插入图片描述

基于Canal的异步通知

在这里插入图片描述
什么是binlog?

Binlog(Binary Log) 是MySQL数据库中的二进制日志文件,用于记录数据库的所有更改操作。它以二进制的形式存储,包含了对数据库执行的所有修改操作的详细信息,如插入、更新、删除等。Binlog是MySQL事务日志的一部分,与Redo Log(重做日志)一起,确保数据库的一致性、持久性,以及提供一些关键的数据库管理功能。

二、Redis的持久化

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

持久化流程

  1. 客户端向服务端发送写操作(数据在客户端的内存中)
  2. 数据库服务端接收到客户端的写数据的请求(数据在服务端的内存中)
  3. 服务端调用write这个系统调用,将数据向磁盘上写(数据在系统内存的缓存区中)
  4. 操作系统将缓存区中的数据转移到磁盘控制器上(数据在磁盘缓存中)
  5. 磁盘控制器将数据写到磁盘的物理介质上(数据真正写在磁盘上)

1.RDB机制

RDB其实就是把数据以快照的形式保存在磁盘上

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

RDB机制是通过把某个时刻的所有数据生成一个快照来保存,颞部有一种触发机制,是实现这个过程。对于RDB来说,提供了三种机制:save、bgsave、自动化

1.1save

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止

1.2bgsave

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:
在这里插入图片描述

具体操作是Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短。基本上 Redis 内部所有的RDB操作都是采用 bgsave 命令。

1.3自动触发

除了通过客户端发送命令外,还有一种方式,就是在Redis配置文件中的save指定到达触发RDB持久化的条件,比如【多少秒内至少达到多少写操作】就开启RDB数据同步。

例如我们可以在配置文件redis.conf指定如下的选项:

# 900s内至少达到一条写命令
save 900 1
# 300s内至少达至10条写命令
save 300 10
# 60s内至少达到10000条写命令
save 60 10000

之后在启动服务器时加载配置文件。

# 启动服务器加载配置文件
redis-server redis.conf

这种通过服务器配置文件触发RDB的方式,与bgsave命令类似,达到触发条件时,会forks一个子进程进行数据同步,不过最好不要通过这方式来触发RDB持久化,因为设置触发的时间太短,则容易频繁写入rdb文件,影响服务器性能,时间设置太长则会造成数据丢失。

RDB默认生成的文件名为dump.rdb,当然,我可以通过配置文件进行更加详细配置,比如在单机下启动多个redis服务器进程时,可以通过端口号配置不同的rdb名称,如下所示:

# 是否压缩rdb文件
rdbcompression yes# rdb文件的名称
dbfilename redis-6379.rdb# rdb文件保存目录
dir ~/redis/

save和bgsave的对比

命令savebgsave
IO类型同步异步
阻塞?是(阻塞发生在fork)
复杂度O(N)O(N)
优点不会消耗额外内存不阻塞客户端命令
缺点阻塞客户端命令想要fork消耗内存

2.AOF机制

量备份总是耗时的,有时候我们提供一种更加高效的方式AOF,工作机制很简单,redis会将每一个收到的写命令都通过write函数追加到文件中。通俗的理解就是日志记录。


持久化原理

在这里插入图片描述


文件重写原理
AOF的方式也同时带来了另一个问题。持久化文件会变的越来越大。为了压缩aof的持久化文件。redis提供了bgrewriteaof命令。将内存中的数据以命令的方式保存到临时文件中,同时会fork出一条新进程来将文件重写。
在这里插入图片描述
Redis默认不开启AOF持久化方式,我们可以在配置文件中开启并进行更加详细的配置,如下面的redis.conf文件:

# 开启aof机制
appendonly yes# aof文件名
appendfilename "appendonly.aof"# 写入策略,always表示每个写操作都保存到aof文件中,也可以是everysec或no
appendfsync always# 默认不重写aof文件
no-appendfsync-on-rewrite no# 保存目录
dir ~/redis/

三种触发机制

(1)每修改同步always:同步持久化 每次发生数据变更会被立即记录到磁盘 性能较差但数据完整性比较好

(2)每秒同步everysec:异步操作,每秒记录 如果一秒内宕机,有数据丢失

(3)不同no:从不同步

配置项刷盘时机优点缺点
always同步刷盘可靠性高,几乎不丢失数据性能影响大
everysec每秒刷盘性能适中最多丢失1s数据
no操作系统控制性能最好可靠性较差,可能丢失大量数据

3.RDB和AOF的对比

在实际开发中,往往会结合二者使用

目录RDBAOF
持久化方式定时对整个内存做快照记录每一次执行的命令
数据完整性不完整,两次备份之间会丢失性相对完整,取决于刷盘策略
文件大小会有压缩,文件体积小记录命令,文件体积很大
宕机恢复速度很快
数据恢复优先级低,因为数据完整性不如AOF
系统资源占用高,大量cpu消耗和内存消耗低,主要是磁盘IO资源但AOF重写时会占用大量CPU和内存资源
使用场景可以容忍数分钟的数据丢失,追求更快的启动速度对数据安全性要求较高

三、Redis的数据删除策略

1.惰性删除

惰性删除:设置该key的过期后,我们不去管它,当下次需要该key时,我们检查其是否过期,如果过期,我们就删除该key,反之则返回key

  • 优点: 对CPU友好
  • 缺点:对内存不友好,可能会有大量的过期key存在于内存中

2.定期删除

定期删除:每隔一段时间,我们就对一些key进行检查,过期就删除
定期删除有两种模式: SLOW 和 FAST
SLOW:SLOW模式是定时任务,执行频率默认为10HZ(每秒执行10次),每次不超过25ms,可以通过修改配置文件redis.conf的hz选项来调整次数
FAST:FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

优点:可以通过限制执行删除操作的时常和频率来减少CPU的消耗,同时定期删除也能释放内存
缺点:难以确定执行操作的时常和频率

四、Redis的淘汰策略

我们设置完redis内存之后,我们就像里面放数据,但是内存总有满的时候,满的时候redis又是怎么处理的呢?

每进行一次redis操作的时候,redis都会检测可用内存,判断是否要进行内存淘汰,当超过可用内存的时候,redids 就会使用对应淘汰策略。

redis内存淘汰策略,具体如下:

  1. no-envicition:该策略对于写请求不再提供服务,会直接返回错误,当然排除del等特殊操作,redis默认是no-envicition策略。

  2. allkeys-random: 从redis中随机选取key进行淘汰

  3. allkeys-lru: 使用LRU(Least Recently Used,最近最少使用)算法,从redis中选取使用最少的key进行淘汰

  4. volatile-random: 从redis中设置过过期时间的key,进行随机淘汰

  5. volatile-ttl: 从redis中选取即将过期的key,进行淘汰

  6. volatile-lru: 使用LRU(Least Recently Used,最近最少使用)算法,从redis中设置过过期时间的key中,选取最少使用的进行淘汰

  7. volatile-lfu: 使用LFU(Least Frequently Used,最不经常使用),从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉

  8. allkeys-lfu: 使用LFU(Least Frequently Used,最不经常使用),从所有的键中选择某段时间之内使用频次最少的键值对清除


那么有这么多的淘汰策略,我们应该选取哪一种呢?

  • 优先使用allkeys-lru策略。充分利用LRU算法的优势。 将最常访问的数据(热数据)留在缓存中
  • 如果业务中数据访问频率差别不大,没有明显的冷热数据之分,建议使用allkeys-random,随机进行淘汰
  • 如果业务有置顶的需求,可以使用volatile-lru策略,同时设置置顶数据不设置过期时间,这些数据就一直不会被删除,会淘汰其他设置了过期时间的数据
  • 如果业务中有短时高频访问的数据,则推荐使用allkeys-lfu或者volatile-lfu策略

相关文章:

Redis入门到精通(二):入门Redis看这一篇就够了

文章目录 一、Redis的双写一致性1.延迟双删2.添加分布式锁3.异步监听可靠消息基于MQ消息队列的异步监听基于Canal的异步通知 二、Redis的持久化持久化流程1.RDB机制1.1save1.2bgsave1.3自动触发 2.AOF机制三种触发机制3.RDB和AOF的对比 三、Redis的数据删除策略1.惰性删除2.定期…...

荒岛逃生游戏

题目描述 一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。 假定每个人移动的速度一样,且只可选择向左或向右逃生。 若两个人相遇,则进行决斗,战斗力强的能够活下来&#xff…...

玫瑰花HTML源码

HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…...

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时&#xff0c;从后端获取数据需要用到 Authorization 授权的Bearer令牌&#xff0c;而这个令牌的获取需要登录后台进行获取&#xff0c;这里登录时还涉及到的验证码的操作&#xff0c;所以在获取过程中&#xff0c;需要对后台系统进行登录并拿到这个Be…...

学习中,师傅b站泷羽sec——xss挖掘过程

某职业技术学院网站xss挖掘&#xff1a; 资产归纳 例如&#xff1a;先把功能点都看一遍&#xff0c;大部分都是文章 根据信息搜集第一课学习到一般主站的防御力是比较强的&#xff0c;出现漏洞的点不是对新手不友好。 在资产验证过程中还是把主站看了一遍 没有发现有攻击的机会…...

什么是双因素身份验证?双因素身份验证的凭据类型有哪些?

w微服务在数字化的时代&#xff0c;保护个人和企业的敏感信息至关重要。双因素身份验证&#xff08;Two-Factor Authentication&#xff0c;简称 2FA&#xff09;作为一种增强安全性的方法&#xff0c;越来越受到广泛关注。那么&#xff0c;什么是双因素身份验证呢&#xff1f;…...

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…...

利用移动式三维扫描技术创建考古文物的彩色纹理网格【上海沪敖3D】

文章来源于蔡司工业质量解决方案&#xff0c;作者蔡司工业质量 在考古环境中&#xff0c;三维扫描技术应用广泛&#xff0c;如存档、保存、复制和分享&#xff08;包括实体和虚拟形式&#xff09;。 文中&#xff0c;通过真实的扫描案例&#xff0c;您将了解到三维光学解决方案…...

Spring AI Java程序员的AI之Spring AI(四)

Spring AI之Java经典面试题智能小助手 前言一、准备面试题二、搭建工程三、文件读取与解析四、Markdown文件解析五、问题搜索六、自定义EmbeddingClient七、定义请求Controller 前言 通过Ollama在本地部署了Llama3大模型&#xff0c;这篇来基于Llama3和Spring AI&#xff0c;以…...

精选20个爆火的Python实战项目(含源码),直接拿走不谢!

今天给大家介绍20个非常实用的Python项目&#xff0c;帮助大家更好的学习Python。 完整版Python项目源码&#xff0c;【点击这里】领取&#xff01; ① 猜字游戏 import random def guess_word_game(): words ["apple", "banana", "cherry&quo…...

Rocky Linux 9安装Asterisk 20和freepbx 17脚本——筑梦之路

脚本搜集来自Rocky Linux 9安装Asterisk 20和freepbx 17脚本 #!/bin/bash#Preparacion de ambiente de RockyLinuxecho "Deshabilitar SELINUX /etc/selinux/config "sed -i s/^SELINUX.*$/SELINUXdisabled/ /etc/selinux/configecho "Establecer nombre de maq…...

PSPICE FOR TI笔记记录1

快捷放置器件 R旋转 连线 w,单击器件引脚方块部分 电压探测笔 创建仿真文件 Analysis Type 分析模式&#xff1a;比如时域分析&#xff0c;频域分析 Run To Time 仿真时长 Skip intial transient bias point calculation (跳过初始瞬态偏置点计算(SKIPBP))一定要勾选 编辑…...

Java集合剖析4】LinkedList

目录 一、LinkedList的特有方法 二、LinkedList的底层数据结构 三、插入方法的具体实现 一、LinkedList的特有方法 LinkedList的底层是双向链表&#xff0c;它提供了操作首尾结点的方法 二、LinkedList的底层数据结构 LinkedList的底层是一个双向链表&#xff0c;有一个结点内部…...

基于MATLAB/octave的容积卡尔曼滤波(CKF)【带逐行注释】

介绍 CKF的三维滤波程序例程 产品概述 我们的 MATLAB 数据处理工具是专为科研人员、工程师和数据分析师设计的高效解决方案。该工具提供了一系列强大的功能&#xff0c;能够快速处理和分析大规模数据集&#xff0c;适用于各种科学和工程应用&#xff0c;包括信号处理、图像分…...

Python编程探索:从基础语法到循环结构实践(下)

文章目录 前言&#x1f377;四、 字符串拼接&#xff1a;连接多个字符串&#x1f378;4.1 使用 操作符进行字符串拼接&#x1f378;4.2 使用 join() 方法进行字符串拼接&#x1f378;4.3 使用 format() 方法进行格式化拼接&#x1f378;4.4 使用 f-string&#xff08;格式化字…...

简介openwrt系统下/etc/config/network文件生成过程

openwrt的network文件&#xff0c;或者说在/etc/config下的文件&#xff0c;都是动态生成的。 脚本的函数定义在package/base-files/files/lib/functions中&#xff0c;有以下几个文件&#xff1a; libraSVN:~/Wang_SP4/openwrt-d03dc49/package/base-files/files/lib/functi…...

javaWeb项目-Springboot+vue-XX图书馆管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-springbootvue阿博图书馆管理系统源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&…...

华为ENSP用户权限深度解析:构建安全高效的网络管理

在华为ENSP&#xff08;Enterprise Network Simulation Platform&#xff09;用户界面中&#xff0c;用户权限级别是一个重要的概念&#xff0c;它用于限制不同用户访问设备的权限&#xff0c;从而增加设备管理的安全性。以下是对华为ENSP用户界面用户权限级别的详细解释&#…...

NFC之NDEF

NDEF的通用格式 MB标志是一个1位字段&#xff0c;当其被设置时&#xff0c;表示NDEF消息的开始。 ME标志是一个1位字段&#xff0c;当其被设置时&#xff0c;表示NDEF消息的结束。 CF标志是一个1位字段&#xff0c;指示这是分块有效载荷的第一个记录块或中间记录块。 SR标志是…...

学习第三十六行

QValidator::State里面state为0&#xff0c;完全不匹配&#xff0c;1&#xff0c;部分匹配&#xff0c;2&#xff0c;完全匹配,对于label或者textedit里面的字符均为QString类型&#xff0c;特别是遇到数字&#xff0c;需要QString::number转化&#xff0c;对于正则表达式&…...

停车场问题

实验内容 1.问题描述&#xff1a; 设停车场是一个可停放n辆汽车的狭长通道&#xff0c;且只有一个大门可供汽车进出。汽车在停车场内按车辆达到时间的先后顺序&#xff0c;依次由北向南排列(大门在最南端&#xff0c;最先达到的第一辆车停放在车场的最北端)&#xff0c;若车场…...

海康相 机

海康机器人-机器视觉-下载中心 海康威视MVS客户端及虚拟相机c开发案例-CSDN博客 相机驱动下载&#xff1a; 下载中心 VisionMaster 视频教程_哔哩哔哩_bilibili 【VisionMaster】试用版安装说明_visionmaster试用版-CSDN博客 海康视觉算法平台VisionMaster 4.3.0 C# 二次…...

用map实现el-table全选

<el-button size"small" type"primary" click"searchProxy">查询</el-button><el-checkbox v-model"selectAll" change"changeSelectAll" >全选</el-checkbox><el-table:data"taskList&…...

【开源免费】基于SpringBoot+Vue.JS社区团购系统(JAVA毕业设计)

本文项目编号 T 024 &#xff0c;文末自助获取源码 \color{red}{T024&#xff0c;文末自助获取源码} T024&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…...

Java进阶之路:构造方法

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;小菜元 &#x1f35f;博客主页…...

2025秋招八股文--网络原理篇

前言 1.本系列面试八股文的题目及答案均来自于网络平台的内容整理&#xff0c;对其进行了归类整理&#xff0c;在格式和内容上或许会存在一定错误&#xff0c;大家自行理解。内容涵盖部分若有侵权部分&#xff0c;请后台联系&#xff0c;及时删除。 2.本系列发布内容分为12篇…...

C#基础-面向对象的七大设计原则

目录 1.开放封闭原则&#xff08;OCP&#xff09; 2.单一职责原则&#xff08;SRP&#xff09; 3.依赖倒置原则&#xff08;DIP&#xff09; 4.里氏替换原则&#xff08;LSP&#xff09; 5.接口隔离原则&#xff08;ISP&#xff09; 6.合成复用原则&#xff08;CRP&#…...

CSS 容器查询一探究竟

引言 在 《请列举四种「等比例自适应矩形」实现方案&#xff1f;》 一文中我曾使用到容器查询单位 cqw, 当时在使用 cqw 过程中只是简单过了一下容器查询相关的内容!! 所以这次专门出一篇文章, 对容器查询做一个梳理… 一、是什么 在实际开发中您是否遇到过需要根据父容器的…...

AI论文写作:如何轻松实现高原创度大揭秘

随着人工智能技术的迅猛进步&#xff0c;AI论文写作工具在学术界开始崭露头角&#xff0c;作为一种辅助手段。这些工具不仅能高效地生成论文的初步版本或部分章节&#xff0c;而且其产出的内容往往展现出高度的创新性。本文将探讨AI论文写作工具为何能产出如此高原创度的内容&a…...

AtCoder Beginner Contest 375 A-E 题解

我的老师让我先做最后再交&#xff0c;看正确率&#xff08;即以OI赛制打abc&#xff09; 所以我用的小号&#xff08;… …&#xff09; C 卡了老半天才出来&#xff0c;我把题读错了 难度&#xff1a; A. Seats 题意 给你一个字符串 S S S&#xff0c;仅包含 . 和 #&…...