关于redis

2023-10-31

1.事务机制

1.1 事务介绍

redis是支持事务的。
举一个经典的例子:转账。

  • A向B汇款,那么A账户会扣钱
  • B账户会加钱

这两个步骤一定是在一个事务中的,要么都成功,要么都失败。

redis事务是基于队列实现的,创建一个事务队列,然后将事务操作都放入到对列中,最后依次执行。
在这里插入图片描述

在这里插入图片描述

#开启事务
multi
#添加命令
set age 10
# 执行事务
exec
#取消事务
discard

1.2 事务的处理机制

在redis中,如果开启了事务,某一条命令执行出错了,此时事务会怎么处理呢?你可能会说了,要么都成功,要么都失败,有一个失败,那就全失败了呗。

这么想不能算错,但是redis对于命令执行错误有两种解决方式:

  • 语法错误(编译)
  • 执行错误(运行)
1.2.1 语法错误

也就是执行命令的语法不对:

#开启事务
multi
#命令
set name zhangsan
set age 
seterror sex 1
#执行事务
exec

在这里插入图片描述
整个事务中,只有一条指令是正确的,当执行exec后,会直接返回错误,正确的命令也不会执行。

1.2.2 执行错误

命令在执行的发生错误

#开启事务
multi
#命令
set lesson java
rpush lesson eureka feign nacos
set lesson redis
#执行事务
exec
#获取数据
get lesson

在这里插入图片描述
上面的事务中,语法是没有问题的,所以在运行之前redis是无法发现错误的,但是在执行的时候出现了错误,因此只会错误的命令不执行,而正确的命令会执行。

1.3 springboot整合事务操作

1)修改redisconfig配置类,开启事务控制

//开启redis事务控制
redisTemplate.setEnableTransactionSupport(true);

2)自定义方法,测试事务效果

@Test
@Transactional(rollbackFor = Exception.class)
public void multiTest(){
    //开启事务
    redisTemplate.multi();
    try{
        redisTemplate.opsForValue().set("lesson","java");
        redisTemplate.opsForSet().add("lesson","eureka","feign","gateway");
        redisTemplate.opsForValue().set("lesson","redis");
        System.out.println(redisTemplate.opsForValue().get("lesson"));
    }catch (Exception e){
        //回滚
        System.out.println("出现异常");
        redisTemplate.discard();
    }finally {
        redisTemplate.exec();
    }
}

2. 持久化机制

2.1 场景分析

redis是将数据存放到内存中的,一旦服务器宕机重启,内存中的数据就会消失,为了避免这种事情发生,redis提供了持久化机制,将内存中的数据存放到磁盘上,避免数据意外丢失。

redis提供了两种持久化机制,AOF和RDB。

2.2.RDB快照
2.2.1 概述

RDB是redis默认的持久化机制,基于快照的思想,当符合一定条件(自动或者手动)时,redis就会将这一刻的内存数据进行快照并保存到磁盘上,产生一个经过压缩的二进制文件,后缀名.rdb的文件

在这里插入图片描述

在这里插入图片描述
因为RDB文件是保存在磁盘上的,因此即使Redis进程退出,甚至服务器宕机重启。只要RDB文件存在,就可以利用它来还原Redis数据。

2.2.2 RDB触发条件

在redis.conf文件中配置一些默认的触发机制

save ""  # 不使用RDB存储  不能主从
save 3600 1 #表示一个小时内至少一个键被更改则进行快照
save 300  100 #表示5分钟(300秒)内至少100个键被更改则进行快照。
save 60 10000  #表示1分钟内至少10000个键被更改则进行快照。

在这里插入图片描述

手动执行save或者bgsave命令

在redis客户端手动执行save或者bgsave命令,手动触发RDB快照

#执行save命令(同步执行)
save

#执行bgsave命令(异步子线程执行)
bgsave

在这里插入图片描述
这两个命令都可以触发快照,那么他们两个的区别是什么呢?

  • save:同步处理,阻塞redis服务进程,服务器不会执行任何命令,直到RDB文件保存完毕。
  • bgsave:会fork一个和主线程一致的子线程复制操作RDB文件,不会阻塞redis服务进程。

redis默认使用的是bgsave来保存快照数据

2.2.3 优缺点

优点:

  • 基于二进制文件完成数据备份,占用空间少,便于文件传输
  • 能够自定义规则,根据redis繁忙状态进行数据备份

缺点:

  • 无法保证数据的完整性,会丢失最后一次快照后的所有数据
  • bgsave每次执行都会阻塞redis服务进程创建子线程,频繁执行影响系统的吞吐率

2.3.AOF

2.3.1 概述

RDB方式会出现数据丢失的问题,对于这个问题,可以通过Redis中另外一种持久化方式解决:AOF

AOF 是reids提供的另外一种持久化方式,与RDB快照记录数据不同的是,当开启AOF持久化后,redis会将客户端发送的所有更改数据的命令记录到磁盘的AOF文件中,这样的话,当redis重启后,通过读取AOF文件,按顺序获取记录的数据修改命令,即可完成数据的恢复。

在这里插入图片描述

举个例子,对Redis执行三条写命令:

set name czy

hset cart shop nike

sadd lesson java python hadoop

RDB会将name,cart,lesson三个键值对数据进行保存,而AOF会将set,hset,sadd三个命令保存到AOF文件中。

2.3.2 基础使用

AOF方式需要手动开启,修改redis.conf

# 是否开启AOF,默认为no
appendonly yes

#设置AOF文件名称
appendfilename  appendonly.aof

当开启了AOF机制之后,Redis何时向AOF文件中记录内容呢?

对于AOF的触发方式有三种:always,everysec,no。默认使用everysec,可以通过redis.conf中的appendfsync属性进行配置。

开启AOF后,重启redis,进入redis客户端执行多条写命令,这些命令会被保存到appendonly.aof文件中。

set name zhangsan
set age 18
set sex male
get name
get age
get sex

此时查看redis/data目录,会新产生一个appendonly.aof文件。 查看文件内容

*2
$6
SELECT
$1
0
*3
$3
set
$4
name
$8
zhangsan
*3
$3
set
$3
age
$2
18
*3
$3
set
$3
sex
$4
male

通过文件查看,可以看到,在aof文件中,记录了对redis操作的所有写命令,读命令并不会记录。

2.3.3 执行原理

AOF功能实现的真个执行过程可以分为三个部分:命令追加,文件写入,文件同步。

在这里插入图片描述

  1. 客户端向redis发送写命令。
  2. Redis将接收到的写命令保存到缓冲文件中的末尾,这个过程是命令追加。
  3. redis将缓冲区文件内容写入到AOF文件中,这个过程叫文件写入。
  4. redis根据策略将AOF文件保存到磁盘,这个过程叫文件同步。
  5. 何时将AOF文件同步到磁盘的策略依据就是redis.conf文件中appendfsync属性值:always,everysec,no
    • always:每次执行写命令都会将缓冲区文件的内容写入到AOF文件中,并将AOF文件同步到磁盘。该效率最低,安全性最高。
    • ererysec:每次执行写命令都会将缓冲区文件的内容写入到AOF文件中,并且每隔一秒会有子线程将AOF文件同步到磁盘,该方式兼备了效率与安全,即使出现宕机重启,也只是丢失不超过两秒的数据。
    • no:每次执行写命令都会将缓冲区文件的内容写入到AOF文件中,但并不会将AOF文件进行同步磁盘,同步操作交由操作系统完成(每30秒一次),该方式最快,但是最不安全。
模式 aof_buf写入到AOF是否阻塞 AOF文件写入磁盘是否阻塞 宕机重启时丢失的数据量 效率 安全
always 阻塞 阻塞 最多只丢失一个命令的数据
everysec 阻塞 不阻塞 不超过两秒的数据
no 阻塞 阻塞 操作系统最后一次对AOF写入磁盘的数据
2.3.4 AOF重写优化
2.3.4.1 概述

AOF会将对redis操作的所有写命令都记录下来,随着服务器的运行,AOF文件内保存的内容会越来越多,这样就会造成两个比较严重的问题:占用大量内存空间,数据还原花费的时间多。

举个栗子:

sadd lessons java
sadd lessons python go
sadd lessons hive
sadd lessons hadoop rocketmq
sadd lessons redis

当这些命令执行玩,AOF文件中记录5条命令。但是实际生产环境下,写命令会出现非常多,文件的体积会非常大。

为了解决AOF文件巨大的问题,Redis提供了AOF重写机制,当AOF文件体积超过阈值,就会触发AOF重写机制,Redis开启子线程创建一个新的AOF文件替代原来的AOF文件,新的AOF文件不会包含任何浪费空间的冗余命令,只存在恢复当前redis状态的最小命令集合。

2.3.4.2 触发配置

那么AOF文件达到多大时,会将其进行重写呢?对于重写阈值的配置,可以通过修改redis.conf进行配置。

#当前aof文件大小超过上一次aof文件大小的百分之多少时进行重写。如果之前没有重写过,以
启动时aof文件大小为准
auto-aof-rewrite-percentage 100

#限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
auto-aof-rewrite-min-size 64mb

除了让redis自动执行重写外,也可以手动让其进行执行:bgrewriteaof

2.4.RDB与AOF对比
  1. RDB是默认开启的,AOF需要手动开启。
  2. RDB性能优于AOF。
  3. AOF安全性由于RDB。
  4. AOF优先级高于RDB.
  5. RDB存储某个时刻的数据快照,AOF存储写命令。
  6. RDB在配置触发状态会丢失最后一次快照以后更改的所有数据;AOF默认使用everysec,每秒保存一次,最多丢失两秒以内的数据。

3.高可用-主从复制

3.1.问题概述

通过持久化机制的学习,可以发现,不管是RDB还是AOF,都不能百分百的避免数据的丢失。关键是现在只有一台服务器,持久化数据都是保存在这台服务器上,假设这台服务器的磁盘损坏,数据仍然会全部丢失。 那这个问题该怎么解决呢?

那我们想一下,现在所有持久化数据只是保存在一台服务器上,能不能让它们同时保存在多台服务器上,这样即使一台服务器出现问题,仍然可以从其他服务器同步数据。

这样就需要当一台服务器中数据更新后,可以自动的将更新的数据同步到其他服务器上, 这就是所谓的复制。

在这里插入图片描述

3.2.复制搭建&使用

在这里插入图片描述

关键步骤:
(1)安装依赖环境及安装Redis

tar -zxvf  redis压缩包

#安装gcc
yum install -y gcc-c++ autoconf automake

#centos7 默认的 gcc 默认是4.8.5,版本小于 5.3 无法编译,需要先安装gcc新版才能编译
gcc -v

#升级新版gcc,配置永久生效
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile 




#将Redis的源码包上传  解压  并且  编译redis
cd redis-6.2.4
make

#安装到指定目录
mkdir -p /usr/local/redis

make PREFIX=/usr/local/redis install

sysctl vm.overcommit_memory=1

(2)创建目录

#日志 /usr/local/redis/log
#数据 /usr/local/redis/data
#配置文件 /usr/local/redis/conf
mkdir /usr/local/redis/logs -p
mkdir /usr/local/redis/data -p
mkdir /usr/local/redis/conf -p

将资料中配置文件复制到 conf 文件夹下

(3)启动Redis master节点

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于redis 的相关文章

  • 如何在itext中设置自定义颜色?

    感谢您花时间回答我的问题 我正在使用 Java 中的 iText 生成 PDF 文档 我需要将表的列标题设置为与值列中的颜色不同的颜色 我有来自 Photoshop 的颜色十六进制值 我正在使用带有块和段落的 PdfPTable 除了 Ba
  • 如果我在 JSP 中有 html 元素,那么执行顺序是什么?

    什么将执行第一个 body 元素或 head 元素 Head Body scriplet 如果我明白您的要求 JSP 文件中的每个元素都会按照代码从上到下出现的顺序进行处理
  • 具有“繁忙”线程的 threadPoolExecutor 如何被终止?

    我的问题有点复杂 让我尝试彻底解释一下 但如果您需要更多详细信息 请随时询问我 我会添加它们 我最近 通过实验 了解到 如果线程连续工作 例如 while true 循环中的整数运算 则中断线程对其没有影响 话题继续进行 就像什么都没发生一
  • 删除 PriorityQueue 的顶部?

    假设我使用 Java util 中的 PriorityQueue 类 我想从 PriorityQueue pq 中删除最大的数字 我们假设它位于队列的头部 下面的工作会起作用吗 1 int head pq peek pq dequeue h
  • Java程序验证signtool签名的数字签名

    我已经使用 SignTool 对文件 exe 或 dll 不是 jar 文件 进行了数字签名 Signtool还可以验证数字签名 但我的要求是使用java程序检查由signtool签名的文件的数字签名 我在互联网上搜索但没有找到任何信息 您
  • jUnit 中每个 @Test 的不同拆卸

    有没有办法为 jUnit 中的每个 Test 定义不同的拆卸 Use the After注释来指示每个之后要运行的方法 Test 像这样的全套注释是 BeforeClass 首先 Tests are run Before 在每个之前 Tes
  • CXF 客户端异常:{XXX} 的拦截器已引发异常,现在展开

    我遇到以下 CXF 异常 warning Interceptor for http example com wsdl esc 2011 12 12 AmazonEC2 http example com wsdl esc 2011 12 12
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa
  • 如何在Intellij IDEA中复制maven依赖项到输出工件WEB-INF/lib?

    我知道在 eclipse maven 中可以将依赖项复制到 WEB INF lib 目录setting Deployment Assembly and Build Path 但是我怎样才能用 Intellij IDEA 实现这一点呢 好的
  • Hazelcast Jet 变更数据捕获

    我在我的应用程序中使用 Hazelcast 更改数据捕获 CDC 我使用 CDC 的原因是 如果使用 jdbc 或其他替代功能将数据加载到缓存中 会花费大量时间 所以CDC将在数据库和 Hazelcast Jet 之间进行数据同步 Stre
  • Mac OSX 上使用 Java 7 的透明 JFrame/JWindow

    我们有一个屏幕共享小程序 它打开 Swing JFrame 并使用 Robot 类捕获空框架后面的屏幕 用户可以单击框架并与小程序后面的任何内容进行交互 这在 Windows 上运行良好 并且用于 Apple 的 Java 版本 但对于 M
  • 如何知道 Solr Optimize 何时完成?

    我正在使用 Solr php client 通过 php 与 Solr 进行通信 这段代码触发solr优化命令 solr gt optimize 请问有没有什么方法可以确定优化完成了 这都是因为我的网站上有一个管理页面 我每天必须手动优化
  • 为什么ArrayList没有getSize()而不是size()?

    我在一些 JSP 页面中大量使用 ArrayList 我想像这样访问 ArrayList myArrayList size 但由于对象必须符合 JavaBean 标准 其中myArrayList getMyPropertyName is m
  • 使用 Gradle 构建 Kotlin + Java 9 项目

    我对 Gradle 老实说 还有 Java 9 相当陌生 我正在尝试使用 Gradle 构建一个混合了 Java 9 和 Kotlin 的简单库项目 更详细地说 Java中有一个接口 Kotlin中有一个实现 我会用 Kotlin 做所有事
  • Maven 依赖冲突:org.w3c.dom.ElementTraversal

    我有一个 Java 代码库 它使用 Maven 进行依赖项解析并在 CI 上运行测试 经过最近的一批开发 大到足以很难识别重大更改 我的一些测试现在在通过 Maven 运行时失败了NoClassDefFoundError for org w
  • 公交车公共交通算法

    我正在开发一个可以查找公交路线的离线 C 应用程序 我可以提取时间表 巴士 路线数据 我正在寻找适用于基本数据的最简单的解决方案 可以使用什么算法来查找从巴士站 A 到巴士站 B 的路线 是否有适用于 C Java 的开源解决方案 数据库的
  • 如何删除 Spring 的 RestTemplate 添加的某些 HTTP 标头?

    我在远程服务方面遇到问题 我无法控制对使用 Spring 的 RestTemplate 发送的请求进行 HTTP 400 响应 使用发送的请求curl但被接受了 所以我将它们与通过 RestTemplate 发送的内容进行了比较 特别是 S
  • 访问 JAR 资源

    我有一个jar包含我想要分发的资源 主要是缓存 日志记录等配置 的文件 我对这些资源的相对路径有问题 所以我做了我在另一个 stackoverflow 问题中发现的问题 该问题说这是一种有效的方法 ClassInTheSamePackage
  • 为什么我得到:没有有效的 JFX 运行时

    我有一个使用 java 1 6 编译并使用 jnlp webstart 运行的现有应用程序 如果我使用 JRE 1 6 从客户端运行此应用程序 一切都会很好 但是 当我使用 java JDK 7 编译代码并使用 JRE 1 7 67 运行客
  • 是否可以从外部闪存驱动器运行 java (jdk-windows)、Eclipse (indigo) 和 Android-sdk 进行 Android 应用程序开发

    我想知道我们是否可以通过在外部闪存驱动器上保存所需的软件来在我们使用的任何计算机上开发我们的android应用程序 我的意思是在闪存驱动器上安装java eclipse和android sdk 所以最后我们可以将闪存带到任何地方计算机并在任

随机推荐

  • 第5讲:业务扩展模型图

    业务扩展模型图主要是将雨雾流程相关的重要人 事 物及这个业务流程所要达成的目标做一个链接 不过有关业务流程的内部细节 通常不会在这张图中介绍 一 元素 1 1 流程 Process 代表一连串有意义的工作流程 在一个 流程 中通常要达成一个
  • myeclipse出现Could not find the main class原因分析

    昨天晚上像往常一样打开myeclipse 随便运行一个类 run as java application 居然弹出Could not find the main class Program will exit 按照以往的经验 做如下检查 编
  • 【Unity】ShaderToys——将大神们写的shader搬到unity中来吧

    这篇文章翻译自国外的一篇文章 这里是原文链接 正在使用unity的你是否在shader toy上发现很多牛逼哄哄的shader却不知道如何使用 那么这篇文章就是帮助你来进行转换的 本文只是基础文章 那些对HLSL CG GLSL都很熟悉的大
  • 后台权限管理系统(2)——系统基础数据的展示

    目录 1 页面效果展示 2 具体实现 2 1 订单管理模块 2 1 1 订单展示页面 2 1 2 订单详情页面 1 页面效果展示 实现效果如下 订单管理页面 产品管理页面 2 具体实现 2 1 订单管理模块 2 1 1 订单展示页面 点击订
  • opencv imread图像读取不成功

    不论是imread读取相对路径还是绝对路径 如果imread读取不成功 显示Nnoe 很有可能是你的路径名字中含有中文 检查你的路径中是否含有中文 有的话将其改为英文 1 相对路径示例 import cv2 假如图像文件位于当前工作目录下的
  • 对 TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)函数在PWM应用中的理解

    注意 以下为本人理解 并非权威 仅做参考 虚心接受指正 首先看原函数如下 void TIM SetCompare1 TIM TypeDef TIMx uint16 t Compare1 Check the parameters assert
  • JSONP解决跨域数据访问问题

    介绍 JSONP JSON with Padding 是JSON 的一种 使用模式 可用于解决主流浏览器的跨域数据访问的问题 还是那句话 JSONP虽然用不到 但是要了解 后续要用CORS JSONP实现原理 由于浏览器同源策略的限制 网页
  • 001 linux 导学

    前言 本文建立在您已经安装好linux环境后 本文会向您介绍Shell的一些常用指令 什么是linux Linux是一种自由和开放源代码的类UNIX操作系统 该操作系统的内核由林纳斯托瓦兹在1991年首次发 布 之后 在加上用户空间的应用程
  • Linux中的火墙策略优化

    目录 一 火墙介绍 二 火墙管理工具切换 三 iptables的使用及火墙默认策略 1 默认策略中的5条链 2 默认的3张表 3 iptables命令 4 数据包状态 5 iptables中的NAT 四 firewalld 1 firewa
  • JavaWeb学习笔记

    JavaWeb 1 开发环境搭建 new gt other gt Server gt Server new gt other gt web gt Dynamic web Project 动态web项目 2 Dao回顾 DAO 工具类 异常类
  • 主线剧情03-NXP-i.MX系列的u-boot移植基础详解

    u boot 移植基础详解 本文系广泛撷取 借鉴和整理 相关的内容在网络上有很多 但很多相互抄 或者是版本太老 或者就是不通用的非常有平台针对性的步骤 碎片化泛滥 甚至就是有待分拣的垃圾厂 当然也有一些好的文章 都会看 经过了细心 耐心 小
  • 微信小程序开发笔记⑬——窗口监控、动态设置导航栏、动态设置tabBar、动态设定背景颜色、页面滚动和动画制作

    窗口监听 官方描述 https developers weixin qq com miniprogram dev api ui window wx onWindowResize html 监控窗口的大小时候发生了变化
  • 先进规划与生产排程系统 (Advanced Planning and Scheduling,APS)

    什么是先进规划与排程系统 先进规划排程系统 APS Advanced Planning Scheduling System 是一种以系统模拟或数理规划等方式填写甘特图 先进规划与排程系统是利用许多进步的管理规划技术 包括限制理论 Theor
  • Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)

    漏洞简介 CVE 2020 14882允许未授权的用户绕过管理控制台的权限验证访问后台 CVE 2020 14883允许后台任意用户通过HTTP协议执行任意命令 使用这两个漏洞组成的利用链 可通过一个GET请求在远程Weblogic服务器上
  • android添加自定义字体样式,android – 具有自定义字体和粗体样式的文本

    使用SpannableString 另请看这个教程 http blog stylingandroid com archives 177 String tempString Copyright TextView text TextView f
  • C语言中winmain是什么错误,WinMain,应用程序入口点

    每个 Windows 程序都有一个类似 main 函数的入口函数 名字叫做 WinMain 或者 wWinMain 其声明如下 int WINAPI wWinMain HINSTANCE hInstance HINSTANCE hPrevI
  • Python可以开发软件吗?Python入门学习!

    大家应该都知道 Python是一门全栈编程语言 应用范围十分广泛 包含网络爬虫 人工智能 机器学习 游戏开发 自动化运维 自动化测试等领域 那么问题来了 Python可以开发软件吗 这是很多Python爱好者都比较疑惑的问题 我们一起来看看
  • Python中的视频处理库:MoviePy

    Python中的视频处理库 MoviePy MoviePy是一款基于Python的视频处理库 它能够让用户轻松对视频 图像和音频进行剪辑 合成和转换处理 MoviePy结合了多个底层的可视化库 包括FFmpeg ImageMagick和Nu
  • 信息技术导论 第三章 移动互联网技术 笔记

    第三章 移动互联网技术 3 1 移动互联网概述 3 1 1 移动互联网的基本概念 移动互联网是PC互联网发展的必然产物 将移动通信和互联网二者结合起来 成为一体 它是互联网的技术 平台 商业模式和应用与移动通信技术结合并实践的活动的总称 移
  • 关于redis

    1 事务机制 1 1 事务介绍 redis是支持事务的 举一个经典的例子 转账 A向B汇款 那么A账户会扣钱 B账户会加钱 这两个步骤一定是在一个事务中的 要么都成功 要么都失败 redis事务是基于队列实现的 创建一个事务队列 然后将事务