【Redis学习】Redis Docker安装,自定义config文件(包括RDB\AOF setup)以及与Spring Boot项目集成

【本文内容】

  • 第1章:通过Docker安装Redis,并自定义config文件以及mount data目录。
  • 第2章:介绍Redis持久化到磁盘,有4种方式:RDB / AOF / NONE / RDB + AOF
  • 第3章:使用Server自带的redis-cli工具连接。
  • 第4章:创建Spring Boot项目,通过spring-boot-starter-data-redis进行连接。
  • 第5章:把Spring Boot部署到docker中,测试docker network是否通畅。
  • 第6章:修改redis.conf,RDB持久化以及AOF持久化测试。

Redis全称:Remote Dictionary Server。是一款开源的Key-Value数据库,运行在内存中,由C语言编写。

官网:https://redis.com/
文档:https://redis.io/docs/getting-started/

Redis还有很多module:
image.png

很多公司用它用为缓存,也有用作database的,还有作为pub/sub(message broker)来使用。

1. Docker安装

关于Redis的安装,首先的还是Docker,这样可以和本机环境解耦,无论本机是windows, macos, linux,操作都会一样了。

【资源】

  • Redis Docker Image官网:https://hub.docker.com/_/redis

【参考】

  • https://www.youtube.com/watch?v=L3zp347cWNw
  • https://github.com/marcel-dempers/docker-development-youtube-series/tree/master/storage/redis

如果到时候有app运行在docker中并要连接redis,那么可以先创建网络:

docker network create redis

1.1 简单的singleton模式

运行Docker:

docker run -it --rm --name redis --net redis -p 6379:6379 redis:latest

-it 表示run interactively,即通过/bin/bash与容器与行交互。
--rm 表示让容器在退出时,自动清除挂在的卷,以便清除数据。
-net 即运行在上述docker network create创建出来的网络中。
-p 端口,6379为默认端口,如果在远程服务器中,建议不要使用默认端口,主要原因是redis默认是不需要密码的。
redis:latest表示我们要运行的image=redis,版本为latest(最新版本)

可以看到下载的最新版本为7.0.2,单机版的redis已经运行了:
image.png
1.2 自定义config

Redis的核心配置是一个config文件,每个版本可能会不一样,可以从官网上查看:https://redis.io/docs/manual/config/

  • The self documented redis.conf for Redis 7.0.
  • The self documented redis.conf for Redis 6.2.
  • The self documented redis.conf for Redis 6.0.
  • ...

我们创建一个文件夹叫redis,在redis文件夹下创建文件夹config,在config中创建一个redis.conf文件,把7.0的config内容放进去:

image.png

在redis文件夹下,再次运行Docker,这次使用的是自定义的config

docker run -it --rm --name redis --net redis -v ${PWD}/config:/etc/redis/ redis:latest redis-server /etc/redis/redis.conf

${PWD}表示当前目录
这里做的是把我们刚刚创建的config目录,mount到docker容器中的/etc/redis/中,config file为/etc/redis/redis.conf,/etc/redis即刚刚mount的文件夹,即运行的redis使用的是我们上述自定义的redis.conf。

1.3 在redis.conf中启动security

我们上述说过不要在远程服务器中使用redis的默认端口的主要原因是redis默认是不需要密码登陆的,想要启用密码,可以在#1.2中创建的redis.conf中enable。

搜索关键字requirepass

image.png

可以看到默认情况下是不开启的:
image.png

启用需要密码并且把密码设为superpassword

image.png

安装redis的时候,可以考虑只在服务器集群内暴露,不要把它暴露到公网中,毕竟一般情况下只有集群内的app需要连接redis。

2. 持久化

持久化也是非常重要的一块内容,原因是上述的docker redis如果销毁了,存放在redis server上的数据也就没有了。

当然生产环境中一般不止一台redis server,假如有3台server,如果其中1台挂了,那么数据还是安全的,但如果3台server都挂了,存放在redis server内存中的数据也就没有了。

官网:https://redis.io/docs/manual/persistence/

Redis把数据写到磁盘的方式有:

  • RDB(Redis Database):RDB是以snapshot的方式记录当前的redis server的数据。比如每5分钟dump一个snapshot,存储到磁盘,文件为:dump.rdb。缺点是从最近一次dump到server挂了这段时间的数据会丢失。
  • AOF(Append Only File),将每次server接收的命令append到文件中,文件名叫appendonly.aof,这种方式在同步起来比较快(因为只要append最近的命令即可),但如果真的需要靠它来恢复数据,那么恢复起来就会比较慢一些。

官网详细的介绍了两者的优缺点:

  • https://redis.io/docs/manual/persistence/#rdb-advantages
  • https://redis.io/docs/manual/persistence/#aof-advantages

除了可以单独选择使用其中的一种持久化方式,还可以选择不持久化,或是两者结合的方式

【以下是示例】

2.1 使用RDB的方式进行持久化

进入我们之前创建的redis.conf文件中,搜索关键字dump

image.png

可以看到redis默认支持的持久化就是RDB方式,除了可以修改dump后的文件名,我们还可以修改另的关于RDB的参数,如隔多久进行一次snapshot dump等等:
image.png
2.2 使用AOF的方式进行持久化

搜索关键字append

image.png

如果想要打开AOF持久化,可以把no改为yes

image.png

aof的文件名也可以修改:
image.png
2.3 如何选择?

参考官网:https://redis.io/docs/manual/persistence/#ok-so-what-should-i-use

  • The general indication you should use both persistence methods is if you want a degree of data safety comparable to what PostgreSQL can provide you.
  • If you care a lot about your data, but still can live with a few minutes of data loss in case of disasters, you can simply use RDB alone.
  • There are many users using AOF alone, but we discourage it since to have an RDB snapshot from time to time is a great idea for doing database backups, for faster restarts, and in the event of bugs in the AOF engine.

官网上说:

  • 如果想要保证数据的安全性,那么就可以同时打开RDB, AOF,即两者相结合的方式。
  • 如果可以容忍一小段时间的数据丢失,那么可以只开RDB(这里的一小段时间指的是RDB的snapshot dump到server down掉的时间)。
  • 有一些用户会只开启AOF,但不建议这样做,因为RDB是backup非常好的一种方式,它恢复数据会非常快,而AOF是基于事件的(即恢复数据靠的是重新run每个event/command),比较慢,而且中间万一哪个事件有点问题,就比较麻烦。
2.4 创建volumn开始做持久化测试

首先先创建一个volume叫redis:

docker volume create redis

在redis目录下创建data目录:
image.png

在redis目录下运行:

docker run -it --rm --name redis --net redis -p 6379:6379 -v {PWD}/config:/etc/redis/ -v{PWD}/data:/data/ redis:latest redis-server /etc/redis/redis.conf

这里我们看到除了mount 当前目录下的config文件夹至docker容器中外,还加了另一个文件夹,即/data。

以这样方式启动的docker redis,在重启后,里面的数据依然会在。

3. 使用Server自带的redis-cli工具连接

使用客户端连接,这里有很多可以选择:

  • server自带的cli命令可以操作数据
  • Java语言的话,可以使用Spring Boot框架可以很方便的连接到客户端
  • 当然别的语言也可以,python, go等

如果是使用客户端自带的cli工具,可以通过docker exec进入terminal页面,然后输入redis-cli即可,如果有设置过密码的,需要额外输入auth <password>

image.png

通过cli存放数据以及取出数据:
image.png

4. 使用Spring Boot项目进行连接

创建一个Spring Boot项目,依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.7</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies>
</project>

创建Main方法:

@SpringBootApplication
public class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}
}

在application.yaml加上:

spring:redis:host: localhostport: 6379password: superpassword

创建一个Controller:

@RestController
public class RedisTestController {@Autowiredprivate RedisTemplate redisTemplate;@GetMapping("put")public boolean put(@RequestParam String key, @RequestParam String value) {ValueOperations<String, String> stringRedis = redisTemplate.opsForValue();stringRedis.set(key, value);return true;}@GetMapping("get")public String get(@RequestParam String key) {ValueOperations<String, String> stringRedis = redisTemplate.opsForValue();return stringRedis.get(key);}
}

启动后发现报错:

org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379
at org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory$ExceptionTranslatingConnectionProvider.translateException(LettuceConnectionFactory.java:1689)

Caused by: io.lettuce.core.RedisConnectionException: Connection closed prematurely
at io.lettuce.core.protocol.RedisHandshakeHandler.channelInactive(RedisHandshakeHandler.java:86)

【需要修改redis.conf】
protected-mode yes:把yes改为no

image.png

还需要改下bind:
image.png

重启Redis和Spring Boot App后测试:
调用put:http://localhost:8080/put?key=testVersion&value=v1.0.0

image.png

get方法:
image.png

5. 把Spring Boot部署到docker中

5.1 Spring Boot相应改动

我们打算把Spring Boot项目和Redis放在同一个docker networ中,即在#1创建的redis中。
所以在application.yaml可以直接用redis来指代host:

spring:redis:host: redisport: 6379password: superpassword

Spring Boot本身package出来的jar需要是可执行的fat jar,所以需要在pom.xml中加上:

    <build><finalName>RedisTest</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

mvn clean package打包,打出来的包在项目根目录/target/下。

5.2 再创建Docker file:
FROM openjdk:8-jdk-alpine
COPY target/RedisTest.jar RedisTest.jar
expose 8080
ENTRYPOINT ["java","-jar","RedisTest.jar"]
5.3 Docker build image

DockerFile在项目根目录下:

docker build -f DockerFile -t localhost/redis-test .

5.4 运行Docker

这里8081指的是在docker外部即localhost的端口,8080指的是docker容器的端口:

docker run -p 8081:8080 --net redis --name redis-spring-test localhost/redis-test:latest

image.png

测试,没有问题:
image.png
5.5 Docker debug

如果出现connection refused的一些问题,可以进入Spring Boot的终端,然后ping下,看看是否通:

docker exec -it redis-spring-test /bin/sh

image.png

还可以查看#1中通过docker network create redis创建的network是否存在:

image.png

6. 测试持久化到磁盘

6.1 只开启RDB

我们在#2.1中介绍过,redis默认就是开启RDB的,只是dump的时间需要确定下,从redis.conf中可以看到,如不额外设置时间,默认情况下:

  • 只修改了1个key,1小时同步一次。
  • 修改了100个key,5分钟同步一次。
  • 修改了10000个key,那么1分钟同步一次。
image.png

为了测试我们可以把同步间隔设短的些,我们把修改1个key后就同步的时间从3600秒改成60秒:
image.png

用#3.4的命令重启Redis(即需要-v mount一个data的目录)后put一个key/value,过60s后check当前redis的data目录:

可以看到/data下有了dump.rdb文件了:
image.png

Redis控制台也会打印日志:
image.png

那么这时候如果我们把Docker Redis stop了再重启,可以看到会把从dump.rdb中恢复数据,然后这时候运行Spring Boot项目,依旧可以拿到key=testVersion的数据
image.png
6.2 只开启AOF

首先是关闭RDB:需要声明save ""

image.png

再开启AOF,如同#2.2说的,按append关键字搜索,然后把no改为yes:
image.png

可以看到对于AOF的同步,有三种方式,第1种是每一次修改,都会调用fsync()。第2种是每隔1秒调用fsync(),第3种是不调用fsync(),由系统控制数据的同步到磁盘。默认是每1各种调用fsync():
image.png

重启Redis后发现持久化已经由之前的RDB改成了AOF:
image.png

尝试set一个key/value后:
image.png

这时候关闭Redis再重启,可以看到数据会从AOF中恢复,直接get,数据依旧在:
image.png
最后编辑于:2025-02-24 20:46:46


喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

【3天快速入门WPF】13-MVVM进阶

目录 1. 窗体设置2. 字体图标3. 控件模板4. 页面逻辑4.1. 不使用MVVM4.2. MVVM模式实现本篇我们开发一个基于MVVM的登录页面,用来回顾下之前学习的内容 登录页面如下: 窗体取消了默认的标题栏,调整为带阴影的圆角窗体,左侧放一张登录背景图,右边自绘了一个关闭按钮,文本框…

PHP实现登录和注册(附源码)

前言 本博客主要讲述利用php环境实现一个简单的前后端结合的用户登录和注册功能。phpstudy是PHP调试环境的集成包&#xff0c;该程序包集成了 ApachePHPMySQLphpMyAdmin 等多个工具&#xff0c;是很好用的调试环境的程序集成包。 目录 前言 1. 准备工作 1.1 工具 1.2 php…

Redis数据结构-List列表

1.List列表 列表类型适用于存储多个有序的字符串&#xff08;这里的有序指的是强调数据排列顺序的重要&#xff0c;不是升序降序的意思&#xff09;&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;一个列表最多可以存储2^32-1个元素。在R…

Redis 实战篇 ——《黑马点评》(下)

《引言》 &#xff08;下&#xff09;篇将记录 Redis 实战篇 最后的一些学习内容&#xff0c;希望大家能够点赞、收藏支持一下 Thanks♪ (&#xff65;ω&#xff65;)&#xff89;&#xff0c;谢谢大家。 传送门&#xff08;上&#xff09;&#xff1a;Redis 实战篇 ——《黑马…

WordPress二次开发实现用户注册审核功能

WordPress默认直接注册登录了&#xff0c;不需要任何验证&#xff0c;如果被批量注册就麻烦了&#xff0c;所以添加一个审核功能比较好。 注册用户默认需要手动审核&#xff0c;审核以后才能登陆&#xff0c;开启审核&#xff0c;可以有效防止用户批量注册。 这儿讲解一下如何…

基于SpringBoot的“青少年心理健康教育网站”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“青少年心理健康教育网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统总体结构图 实体属性图 系统首页界…

湖仓一体概述

湖仓一体之前&#xff0c;数据分析经历了数据库、数据仓库和数据湖分析三个时代。 首先是数据库&#xff0c;它是一个最基础的概念&#xff0c;主要负责联机事务处理&#xff0c;也提供基本的数据分析能力。 随着数据量的增长&#xff0c;出现了数据仓库&#xff0c;它存储的是…

React:B站评论demo,实现列表渲染、删除按钮显示和功能实现、导航栏渲染切换及高亮显示、评论区的排序

功能要求&#xff1a; 1、渲染评论列表 2、删除评论功能&#xff1a;只显示自己评论的删除按钮&#xff1b;点击删除按钮&#xff0c;删除当前评论&#xff0c;列表中不再显示。 3、渲染导航Tab&#xff08;最新 | 最热&#xff09;和其 高亮实现 4、评论排序功能实现&…

springboot系列教程(三十一):springboot整合Nacos组件,环境搭建和入门案例详解

一、Nacos基础简介 1、概念简介 Nacos 是构建以“服务”为中心的现代应用架构&#xff0c;如微服务范式、云原生范式等服务基础设施。聚焦于发现、配置和管理微服务。Nacos提供一组简单易用的特性集&#xff0c;帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管…

python爬虫报错信息解决方法

今天遇到了这样一条报错&#xff1a; opt/conda/envs/python35-paddle120-env/bin/python /home/aistudio/work/main.py aistudiojupyter-10415006-8838159:~$ /opt/conda/envs/python35-paddle120-env/bin/python /home/aistudio/work/main.py Traceback (most recent call la…

如何快速的解除oracle dataguard

有些时候&#xff0c;我们为了使oracle dg的standby库另做他用&#xff0c;需要解除oracle dataguard数据同步。我本地因为standby库存储出现故障&#xff0c;导致dg存在问题&#xff0c;故需要解除。今天&#xff0c;我们通过使用部分命令&#xff0c;实现dg的快速解除。 1&a…

【告别双日期面板!一招实现el-date-picker智能联动日期选择】

告别双日期面板&#xff01;一招实现el-date-picker智能联动日期选择 1.需求背景2.DateTimePicker 现状图3.日期选择器实现代码4.日期选择器实现效果图5.日期时间选择器实现代码6.日期时间选择器实现效果图 1.需求背景 在用户使用时间查询时&#xff0c;我们经常需要按月份筛选…

Git GitHub基础

git是什么&#xff1f; Git是一个分布式版本控制系统&#xff0c;用于管理源代码的变更。它允许多个开发者在同一个项目上协作&#xff0c;同时跟踪每个修改的历史记录。 关键词&#xff1a; 分布式版本控制软件 软件 安装到我们电脑上的一个工具 版本控制 例如论文&…

汽车无人驾驶系统中的防撞设计

一、系统方案介绍 无人驾驶汽车的防撞系统是保障行车安全的核心模块&#xff0c;本文设计的系统以STM32F103C8T6单片机为主控制器&#xff0c;结合超声波测距、WiFi通信、人机交互等模块&#xff0c;实现障碍物实时检测、动态阈值设置、多级报警和数据可视化功能。系统通过软…

深度学习笔记——线性回归的从0开始实现

记录学习到的知识&#xff1a; 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程&#xff0c;它将数字图像分成多个片段&#xff0c;并对每个区域中包含的信息进行分类。三种图像分割…

神经网络 - 激活函数(ReLU 函数)

一、ReLU函数&#xff1a; ReLU(Rectified Linear Unit&#xff0c;修正线性单元)&#xff0c;也叫 Rectifier 函数 &#xff0c;是目前深度神经网络中经常使用的激活函数&#xff0c;ReLU 实际上是一个斜坡(ramp)函数&#xff0c;其定义为&#xff1a; 也即&#xff1a; Re…

(十 一)趣学设计模式 之 组合模式!

目录 一、 啥是组合模式&#xff1f;二、 为什么要用组合模式&#xff1f;三、 组合模式的实现方式四、 组合模式的优缺点五、 组合模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支…

【MySQL】事务二

事务二 1.数据库并发的场景2.读-写 2.1 3个记录隐藏字段2.2 undo日志2.3 模拟 MVCC2.4 Read View2.5 RR 与 RC的本质区别 3.读-读4.写-写 点赞???收藏???关注??? 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧??? 关于事务的所有知识上篇博客我们都说过了&…

面向AI 的前端发展及初识大模型

AI带来的开发范式迁移 随着AI的涌现&#xff0c;对前端的发展也有着非常大的影响&#xff0c;总结过去前端的发展路径&#xff0c;目前应该属于又一次的大规模的开发范式迁移阶段。上一个阶段是从jquery到React/Vue/Angular迁移&#xff08;jquery之前的就不讨论了&#xff09…

本地部署大语言模型-DeepSeek

DeepSeek 是国内顶尖 AI 团队「深度求索」开发的多模态大模型&#xff0c;具备数学推理、代码生成等深度能力&#xff0c;堪称"AI界的六边形战士"。 Hostease AMD 9950X/96G/3.84T NVMe/1G/5IP/RTX4090 GPU服务器提供多种计费模式。 DeepSeek-R1-32B配置 配置项 规…