Redis精讲

redis持久化


RDB方式

Redis Database Backup file (redis数据备份文件), 也被叫做redis数据快照. 简单来说就是把内存中的所有数据记录到磁盘中.
快照文件称为RDB文件, 默认是保存在当前运行目录.

[root@centos-zyw ~]# docker exec -it redis redis-cli
127.0.0.1:6379> save  # 由redis主进程来执行RDB, 会阻塞所有命令
OK
127.0.0.1:6379> bgsave 	# 开启子进程执行RDB, 避免主进程受到影响
Background saving started
127.0.0.1:6379> 

bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据. 完成fork后读取内存数据并写入RDB文件.
fork采用的copy-onwrite技术:

  • 当主进程执行读操作时, 访问共享内存
  • 当主进程执行写操作时, 则会拷贝一份数据, 执行写操作.
  • redis.conf文件配置
# 900秒内,如果至少一个key被修改,则执行bgsave, 如果是save "" 则表示禁用RDB
save 900 1
save 300 10
save 60 10000
# 是否压缩
rdbcompression yes
# RDB文件名称
dbfilename dump.rdb
# 文件保存的路径目录
dir ./

AOF方式

AOF全称Append Only File. redis处理的每一个写命令都会记录在AOF文件, 可以看做是命令日志记录文件.

  • redis.conf配置
# 开启AOF功能, 默认no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
appendfsync always
# 写命令执行完先放入AOF缓冲区, 然后表示每嗝1秒将缓冲区写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入AOF缓冲区, 有操作系统决定何时将缓冲区内容写回磁盘
appendfsync no

在这里插入图片描述
bgrewriteaof 可以让AOF文件执行重写功能, 用最少的命令达到相同效果

  • redis.conf配置
# AOF文件比上次文件,增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上触发重写
auto-aof-rewrite-min-size 64mb

RDB和AOF对比

在这里插入图片描述

redis集群


主从集群

在这里插入图片描述
启动三个redis服务

  • 在从节点执行slaveof命令 --5.0后新增replicaof 两命令效果一致
  • 执行命令为临时生效,重启后失效, 永久方式是将命令配置在redis.conf文件
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.150.101 7001

备注: 取消主从关系 slaveof no one

  • 在主节点查看集群信息
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication

优化

  • 在master的redis.conf文件中配置repl-diskless-sync启用无磁盘复制,避免全量同步时的磁盘IO
  • redis单节点上的内存占用不要太大, 减少RDB导致的过多磁盘IO
  • 适当提高repl_baklog的大小,发现slave宕机尽快实现故障恢复,尽可能避免全量同步
  • 限制一个master上的slave节点数量,如果实在是太多slave,则可以采用主-从-从链式结构,减少master压力
repl-diskless-sync yes

哨兵集群

在这里插入图片描述

创建sentinel.conf文件

port 27001
sentinel announce-ip 192.168.150.101
sentinel monitor mymaster 192.168.150.101 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/tmp/s1"

sentinel monitor mymaster 192.168.150.101 7001 2中mymaster为主节点名字, 2为选举master时的quorum值,当主节点挂了,2个sentinel认为你挂了,就选新的主节点,一般为sentinel的一半
dir为sentinel.conf所在的目录

运行sentinel

复制三份sentinel.conf,修改相应配置,启动三个sentinel服务

redis-sentinel s1/sentinel.conf

RestTemplate的哨兵模式

Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换

  • 引入依赖
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
  • 配置application.yml
spring:
  data:
    redis:
      sentinel:
        master: mymaster # 指定master名称
        nodes: # 指定redis-sentinel集群信息
          - 127.0.0.1:27001
          - 127.0.0.1:27002
          - 127.0.0.1:27003
  • 配置读写分离
	@Bean
    public LettuceClientConfigurationBuilderCustomizer customizer(){
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA_PREFERRED);
    }

在这里插入图片描述

分片集群

分片集群结构

可以解决的问题

  • 海量数据存储问题
  • 高并发写的问题

特点:

  • 集群中有多个master,每个master保存不同数据
  • 每个master都可以有多个slave节点
  • master之间通过ping检测彼此健康状态
  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点

搭建

  • 创建redis.conf
port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址 0.0.0.0 -> 任何人可访问
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 192.168.150.101
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log
  • 启动
redis-server redis.conf
  • 建立节点关系
redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

说明:

--cluster-replicas 1:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

  • 查看集群状态
redis-cli -p 7001 cluster nodes
  • 操作集群需要加-c参数
redis-cli -c -p 7001

散列插槽

redis会把每一个master节点映射到0~16383共16384个插槽上
在这里插入图片描述

数据key不是与节点绑定,而是与插槽绑定. redis会根据key的有效部分计算插槽值

  • key中包含{}{}中至少包含1个字符,{}中的部分是有效部分
  • key中不包含{},整个key都是有效部分
    例如{apper}num,则根据apper计算. 计算方式是利用CRC16算法得到一个hash值, 对16384取余,得到的结果就是slot值.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab阶段学习笔记小节2

syms定义符号变量 求极限 第二题 第三题 limit(y,n,inf);求的的函数y关于自变量n在无穷处&#xff08;inf&#xff09;的极限 exp(2)即指数为2&#xff0c;底为e,也就是e^2 求导数 第一题 log(x)默认是以e为底的指数函数&#xff0c;也就是ln(x). 使用diff(f)对函数进行求…

机器视觉学习(一)—— 认识OpenCV、安装OpenCV

目录 一、认识OpenCV 二、通过pip工具安装OpenCV 三、PyCharm安装OpenCV 一、认识OpenCV OpenCV&#xff08;Open Source Computer Vision Library&#xff0c;开源计算机视觉库&#xff09;是一个跨平台的计算机视觉库&#xff0c;最初由威尔斯理工学院的Gary Bradski于199…

什么是序列化?序列化的作用是什么?Java 中如何实现序列化和反序列化?

一、序列化简述 序列化是指将结构化的数据( 例如对象 )转化成一个字符串 / 字节数组。转化过程中&#xff0c;不会造成数据信息部分丢失。 反序列化则为反向操作&#xff0c;将已经进行过序列化之后的数据还原回原本的结构化数据。正是序列化中需要保证转化之后的数据信息不会…

游戏 AI 在体育竞技游戏中的应用实践,通过 PVE 对抗规则AI+自博弈的方式,训练出了高强度、多风格策略的足球 SPG 对战 AI | 附方案详情及资料

AI 在体育竞技游戏&#xff08;SPG&#xff0c;Sports Game&#xff09;中的应用已经成为游戏厂商持续探索的领域之一。随 着人工智能技术的不断发展&#xff0c;越来越多的游戏开发商开始使用 AI 来提升游戏的真实感和沉浸感。 例如&#xff0c;在足球模拟游戏中&#xff0c…

SpringMVC10、拦截器

10、拦截器 10.1、概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。 过滤器与拦截器的区别&#xff1a;拦截器是AOP思想的具体应用。 过滤器 servlet规范中的一部分&…

力扣每日一题 猜数字游戏 阅读理解

Problem: 299. 猜数字游戏 思路 &#x1f468;‍&#x1f3eb; 灵神 复杂度 Code class Solution {public String getHint(String secret, String guess) {int a 0;int[] cntS new int[10];int[] cntG new int[10];for(int i 0; i < secret.length(); i){if(secre…

小迪安全34WEB 攻防-通用漏洞文件上传黑白盒审计逻辑中间件外部引用

#知识点&#xff1a; 1、白盒审计三要素 2、黑盒审计四要素 3、白黑测试流程思路 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&#xff0c;二次渲染等 3、检测后缀&#xff1a;黑名单&…

http升级https需要做什么

背景&#xff1a;随着现代网络时代的高速发展&#xff0c;网络安全方面的日益更新&#xff0c;实现网站https协议的数量也在不断增多&#xff0c;完善安全方面的因素也在逐步增加。 下面从最基础的网站http协议全面升级为https协议的流程做出说明。 目录 首先带大家一起先了解…

打包paddle 运行时出现RuntimeError: (PreconditionNotMet) 错误的解决

一、问题描述 一个自动化操作的项目&#xff0c;使用了paddle&#xff0c;由于第一次用pyinstaller打包paddle项目(为什么不用nuitka?打包时间太长啦&#xff0c;遇到问题解决一次&#xff0c;时间都非常的长&#xff0c;无奈只把自己开发的模块用nuitka进行了打包&#xff0…

SSM整合项目(Vue3 + Element - Plus 创建项目基础页面)

文章目录 1.配置Vue启动端口1.修改vue.config.js2.启动 2.安装Element Plus命令行输入 npm install element-plus --save 3.修改Vue3默认样式并自定义一个组件1.修改App.vue1.删除原有结构2.启动项目查看 2.修改HomeView.vue3.删除HelloWorld.vue组件4.创建一个组件 src/compon…

介绍Kanzi

Linux开发过程中使用的Kanzi 是一个由 Rightware&#xff08;现为 Thundersoft 的一部分&#xff09;开发的跨平台图形用户界面&#xff08;GUI&#xff09;框架。它主要用于设计、开发和部署在计算机、移动设备和嵌入式设备上的2D和3D用户界面。Kanzi 提供了一个现代化的内容创…

GO语言-切片底层探索(上)

1.前言 今天在力扣上写算法&#xff0c;遇到了一个比较"奇怪"的错误。由于自己使用了递归切片&#xff0c;导致一开始没有看明白&#xff0c;直到在自己电脑上进行debug的时候才反应过来&#xff0c;原因出在了哪里&#xff1f;下面会先进行错误的分析和纠正&#x…

物理机win10怎么与虚拟机win10共享文件

打开win10虚拟机点击虚拟机选项安装vmTools 安装完成后系统会重启重启后关机 点击编辑虚拟机设置 选项、共享文件夹、总是启用 接下来点击添加选择你要共享的文件点击确定 打开虚拟机点击此电脑 就会看到共享的文件夹啦

python 导入excel空间三维坐标 生成三维曲面地形图 5-3、线条平滑曲面且可通过面观察柱体变化(三)

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata from matplotlib.c…

基于微信小程序的校园跑腿小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

SSM整合项目(添加家居)

文章目录 1.需求分析2.设计结构3.编写Service层1.创建文件夹2.FurnService.java3.FurnServiceImpl.java4.单元测试 FurnServiceTest.java5.指定默认图片位置1.Furn.java 为imgPath设置默认值2.Furn.java 的全参构造器内判断imgPath是否为空 4.返回json数据的通用类com/sun/furn…

【QT+QGIS跨平台编译】之七十:【QGIS_Analysis跨平台编译】—【qgsrastercalcparser.cpp生成】

文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…

C语言内存管理-数据段与代码段

数据段细分成如下几个区域&#xff1a; .bss 段&#xff1a;存放未初始化的静态数据&#xff0c;它们将被系统自动初始化为0.data段&#xff1a;存放已初始化的静态数据.rodata段&#xff1a;存放常量数据代码段细分成如下几个区域&#xff1a; .text段&#xff1a;存放用户代码…

南洋理工发布多模态金融交易Agent,平均利润提高36%!

金融市场是经济稳定的基石&#xff0c;它不仅促进了资本的分配&#xff0c;还提供了风险管理的机制。随着市场的不断演变&#xff0c;传统的基于规则的交易系统由于缺乏适应市场波动的能力而表现不佳。尽管基于强化学习的系统显示出更好的适应性&#xff0c;但它们在处理多模态…

LVGL:渐变方案

仿照qt的QGradient::Preset渐变类型写的&#xff0c;因为lvgl只支持水平/垂直渐变&#xff0c;且只支持两种颜色的渐变&#xff0c;所以有些类型的渐变未能实现&#xff0c;有些则缺少中间颜色。 代码&#xff1a; namespace Gradient { enum Preset {WarmFlame 1,NightFade…