当前位置: 首页 > 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;对于正则表达式&…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...