【server】springboot 整合 redis

news2025/1/3 0:59:44

1、redis 使用模式

1.1 单机模式

1.1.1 编译安装方式

1.1.1.1 下载

Redis的安装非常简单,到Redis的官网(Downloads - Redis),下载对应的版本,简单几个命令安装即可。

1.1.1.2 编译安装
tar xzf redis-stable.tar.gz
cd redis-stable/
make & make install

安装完成后

cd /usr/local/bin/

1.1.1.3 安装常见问题

如果执行make命令报错:cc 未找到命令,原因是虚拟机系统中缺少gcc,执行下面命令安装gcc:

yum -y install gcc automake autoconf libtool make

 如果执行make命令报错:致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,则需要在make指定分配器为libc。执行下面命令即可正常编译:       

make MALLOC=libc
1.1.1.4 redis单机启动

Redis编译完成后,会生成几个可执行文件,这些文件各有各的作用,我们现在先简单了解下,后面的课程会陆续说到和使用这些可执行文件。

image.png

1.1.1.4.1 默认启动

使用Redis的默认配置来启动,在bin目录下直接输入 ./redis-server         

image.png

可以看到直接使用redis-server启动Redis后,会打印出一些日志,通过日志可以看到一些信息:

当前的Redis版本的是64位的6.2.7,默认端口是6379。Redis建议要使用配置文件来启动。

因为直接启动无法自定义配置,所以这种方式是不会在生产环境中使用的。

1.1.1.4.2 带参启动

redis-server加上要修改配置名和值(可以是多对),没有设置的配置将使用默认配置,例如:如果要用6380作为端口启动Redis,那么可以执行:

./redis-server --port 6380

image.png

这种方式一般我们也用得比较少。

1.1.1.4.3 配置文件启动

配置文件是我们启动的最多的模式,配置文件安装目录中有

一般会采用将redis.conf cp 到一个新文件夹的方式,并使用./redis-server <path>/redis.conf

的形式来开启一台新的redis 服务器

     

1.1.2 docker 安装方式

1.1.2.1 下载
docker pull redis
 1.1.2.2 配置
mkdir -p /mydata/redis/conf
touch /mydata/redis/conf/redis.conf
#bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
#bind 127.0.0.1
#protected-mode no #默认yes,开启保护模式,限制为本地访问
protected-mode no
#daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
daemonize no
#appendonly yes #redis持久化(可选)
appendonly yes

#主从复制,从读
replica-read-only yes

requirepass admin123

# min-replicas-to-write 3
# min-replicas-max-lag 10
1.1.2.3 启动
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data \
-v /mydata/redis/conf/:/etc/redis/ \
--restart=always \
-d redis --appendonly yes

1.2 主从模式

主从模式与哨兵模式的区别为,哨兵模式需要另外启动3个哨兵

1.2.1 配置

daemonize yes
#bind 127.0.0.1
protected-mode no
port 6380
appendonly yes
dir /mydata/redis/6380/dumpfiles
pidfile /var/run/redis_6380.pid
logfile "/mydata/redis-cluster/6380/redis.log"
requirepass 111111
#从机需要配置,主机不用
masterauth "111111"
replicaof 192.168.10.131 6380
#移除高危操作键
rename-command keys ""
rename-command flushdb ""
rename-command flushall ""

1.2.2 启动服务器

#主机先启动, 再启动从机
redis-server /mydata/redis-cluster/6380/redis.conf
redis-server /mydata/redis-cluster/6381/redis.conf
redis-server /mydata/redis-cluster/6382/redis.conf

1.2.3 检查结果

# 进入客户端
redis-cli -h 127.0.0.1 -p 6380 -a 111111
redis-cli -h 127.0.0.1 -p 6381 -a 111111
redis-cli -h 127.0.0.1 -p 6382 -a 111111

1.3 哨兵模式

1.3.1 sentinel 配置

bind 0.0.0.0
#是否以后台daemon方式运行
daemonize yes
#安全保护模式
protected-mode no
# 端口
port 26379
#日志文件
logfile "/mydata/redis-cluster/26379/sentinel.log"
#pid文件路径
pidfile /var/run/redis-sentinel26379.pid
#工作目录
dir /mydata/redis-cluster/26379
# sentinel monitor <master-name> <ip> <redis-port> <quorum> 
#设置要监控的master服务器,quorum 表示最少要有几个哨兵认可下线,同意故障迁移的票数
sentinel monitor mymaster 192.168.10.131 6380 2
#连接master服务的密码
sentinel auth-pass mymaster 111111

1.3.2 启动哨兵

redis-sentinel /mydata/redis-cluster/26379/sentinel.conf  --sentinel
redis-sentinel /mydata/redis-cluster/26380/sentinel.conf  --sentinel
redis-sentinel /mydata/redis-cluster/26381/sentinel.conf  --sentinel

1.3.3 检查状态

#查看进程情况
ps -ef | grep redis
#查看单机情况
#登录客户端
redis-cli -p 6380 -a 111111
#查看详情
info replication

1.4 集群模式

1.4.1 集群模式配置

#87行
#bind 127.0.0.1
#309行
daemonize yes
#111行
protected-mode no
#138行
port 6381
#341行
pidfile /mydata/redis-cluster/6381/redis.pid
#355行
logfile "/mydata/redis-cluster/6381/cluster.log"
#510行
dir /mydata/redis-cluster/6381/dumpfiles
#1387行
appendonly yes
#539 540行
requirepass 111111
masterauth 111111
# 1584 1592 1598 行  
cluster-enabled yes
cluster-config-file /mydata/redis-cluster/6379/nodes.conf
cluster-node-timeout 5000
#移除高危操作键
rename-command keys ""
rename-command flushdb ""
rename-command flushall ""

1.4.2 启动服务器

# 各自启动主机
redis-server /mydata/redis-cluster/6580/redis.conf
...
#构建集群关系
redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.10.131:6580 192.168.10.131:6581 192.168.10.131:6582 192.168.10.131:6583 192.168.10.131:6584 192.168.10.131:6585

 

1.4.3 集群使用

#连接客户端 后面添加 -c 用来自动确认对应slot
#不加 -c 异常
# (error) MOVED 12706 192.168.10.131:6582
redis-cli -h 192.168.10.131 -p 6580 -a 111111 -c 
# 查看某个Key 所在的slot
cluster keyslot k1
#master节点下线后,slave 会切换为master ,原master 会以 slave的方式回归
#手动切换从属关系
cluster failover
# 检查集群状态
redis-cli -a 111111 --cluster check 192.168.10.131:6580

2、整合

2.1 主从模式

与哨兵模式一致

2.2 哨兵模式

2.2.1 POM.XML

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2.2.2 application.yml

spring:
  data:
    redis:
      lettuce:
        pool:
          enabled: true
          max-active: 8
          max-idle: 8
          min-idle: 0
          max-wait: -1ms
      sentinel:
        master: mymaster
        nodes:
          - 192.168.10.131:26379
          - 192.168.10.131:26380
          - 192.168.10.131:26381
      database: 0
      password: 111111

 2.2.3 添加RedisConfig类

@Configuration
public class RedisConfig {
    @Bean
    @ConditionalOnMissingBean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置key序列化方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }

    /**
     * 增加部分
     * 读写分离
     * @return
     */

    @Bean
    public LettuceClientConfigurationBuilderCustomizer clientConfigurationBuilderCustomizer() {
        return clientConfigurationBuilder -> clientConfigurationBuilder.readFrom(ReadFrom.REPLICA);
    }

}

业务类查阅集群模式2.3.4 

2.3 集群模式

2.3.1 POM.XML

<!--redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

2.3.2 application.yml

server:
  port: 7777
spring:
  application:
    name: redis-demo
  data:
    redis:
      cluster:
        nodes:
          - 192.168.10.131:6580
          - 192.168.10.131:6581
          - 192.168.10.131:6582
          - 192.168.10.131:6583
          - 192.168.10.131:6584
          - 192.168.10.131:6585
        max-redirects: 3
      password: 111111
      database: 0
      lettuce:
        pool:
          max-active: 8
          max-wait: -1ms
          max-idle: 8
          min-idle: 0
        cluster:
          refresh:
            #支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭
            adaptive: true
            #定时刷新
            period: 2000ms

2.3.3 添加Redis.config 类

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置key序列化方式string
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}

2.3.4 业务类

2.3.4.1 service
#service
public interface OrderService {
    /**
     *  创建订单 key
     * @param key
     * @return
     */
    void createOrder(String key);

    public String getOrder(String key);
}

#serviceImpl
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {

    public static final String ORDER_KEY = "order:";
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public void createOrder(String key) {
        String orderNo = UUID.randomUUID().toString();
        redisTemplate.opsForValue().set(ORDER_KEY + key, orderNo);
        log.info("=====>编号" + key + "的订单流水生成:{}", orderNo);
    }

    @Override
    public String getOrder(String key) {
        return Objects.requireNonNull(redisTemplate.opsForValue().get(ORDER_KEY + key)).toString();
    }
}
2.3.4.2 controller
@RestController
@RequestMapping("/lettuce")
@Slf4j
public class Demo {

    @Resource
    private OrderService orderService;

    @GetMapping("/create")
    public String createOrder() {
        String key = UUID.randomUUID().toString();
        orderService.createOrder(key);
        return key;
    }

    @GetMapping("/get/{key}")
    public String getOrder(@PathVariable("key") String key) {
        return orderService.getOrder(key);
    }

}

2.3.5故障

Redis Cluster集群部署采用了3主3从拓扑结构,数据读写访问master节点, slave节点负责备份。

当master宕机主从切换成功,redis手动OK,but 2个经典故障

 

 

问题的解决方案为:

添加定时刷新参数

spring:
  data:
    redis:
      lettuce:
        cluster:
          refresh:
            #支持集群拓扑动态感应刷新,自适应拓扑刷新是否使用所有可用的更新,默认false关闭
            adaptive: true
            #定时刷新
            period: 2000ms

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【链表】【双指针】1、环形链表+2、环形链表 II+3、相交链表

2道简单1道中等&#xff0c;链表的双指针相关问题就告一段落&#xff0c;下一步刷新的题目。 1、环形链表&#xff08;难度&#xff1a;简单&#xff09; 该题对应力扣网址 AC代码 常见思路&#xff0c;slow指针每次走一步&#xff0c;fast指针每次走两步&#xff0c;如果fa…

大语言模型基础

大语言基础 GPT : Improving Language Understanding by Generative Pre-Training 提出背景 从原始文本中有效学习的能力对于减轻自然语言处理中对监督学习的依赖至关重要。很多深度学习方法需要大量人工标注的数据&#xff0c;限制了它们在很多领域的应用&#xff0c;收集更…

Learn To Rank

在信息检索中&#xff0c;给定一个query&#xff0c;搜索引擎召回一系列相关的Documents&#xff0c;然后对这些Documents进行排序&#xff0c;最后将Top N的Documents输出。 排序问题最关注的是各Documents之间的相对顺序关系&#xff0c;而不是各个Documents的预测分最准确。…

如何优化 PostgreSQL 中对于自关联表的查询?

文章目录 一、理解自关联表查询二、分析性能问题的可能原因&#xff08;一&#xff09;缺少合适的索引&#xff08;二&#xff09;大量数据的笛卡尔积&#xff08;三&#xff09;复杂的查询逻辑 三、优化策略及解决方案&#xff08;一&#xff09;创建合适的索引&#xff08;二…

Rejetto HFS 服务器存在严重漏洞受到攻击

AhnLab 报告称 &#xff0c;黑客正在针对旧版本的 Rejetto HTTP 文件服务器 (HFS) 注入恶意软件和加密货币挖矿程序。 然而&#xff0c;由于存在错误&#xff0c; Rejetto 警告用户不要使用 2.3 至 2.4 版本。 2.3m 版本在个人、小型团队、教育机构和测试网络文件共享的开发…

7.pwn 工具安装和使用

关闭保护的方法 pie: -no-pie Canary:-fno-stack-protector aslr:查看:cat /proc/sys/kernel/randomize_va_space 2表示打开 关闭:echo 0>/proc/sys/kernel/randomize_va_space NX:-z execstack gdb使用以及插件安装 是GNU软件系统中的标准调试工具&#xff0c;此外GD…

2024/7/7周报

文章目录 摘要Abstract文献阅读题目问题本文贡献问题描述图神经网络Framework实验数据集实验结果 深度学习MAGNN模型相关代码GNN为什么要用GNN&#xff1f;GNN面临挑战 总结 摘要 本周阅读了一篇用于多变量时间序列预测的多尺度自适应图神经网络的文章&#xff0c;多变量时间序…

Windows密码凭证获取

Windows HASH HASH简介 hash &#xff0c;一般翻译做散列&#xff0c;或音译为哈希&#xff0c;所谓哈希&#xff0c;就是使用一种加密函数进行计算后的结果。这个 加密函数对一个任意长度的字符串数据进行一次数学加密函数运算&#xff0c;然后返回一个固定长度的字符串。…

C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用

C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用 一、Invoke Invoke的本质只是一个方法&#xff0c;方法一定是要通过对象来调用的。 一般来说&#xff0c;Invoke其实用法只有两种情况&#xff1a; Control的Invoke Delegate的Invoke 也就是说&#xff0c;Invoke前…

动态规划|剑指 Offer II 093. 最长斐波那契数列

如果数组 arr 中存在三个下标 i、j、k 满足 arr[i]>arr[j]>arr[k] 且 arr[k]arr[j]arr[i]&#xff0c;则 arr[k]、arr[j] 和 arr[i] 三个元素组成一个斐波那契式子序列。由于数组 arr 严格递增&#xff0c;因此 arr[i]>arr[j]>arr[k] 等价于 i>j>k。 把这道题…

7.7作业

搭建一个场景&#xff1a; 将学生的信息&#xff0c;以顺序表的方式存储&#xff08;堆区&#xff09;&#xff0c;并且实现封装函数 &#xff1a; 1】顺序表的创建 2】判满 3】判空 4】往顺序表里增加学生 5】遍历 6】任意位置插入学生 7】任意位置删除学生 8】修改 9】查找&a…

刷题之删除有序数组中的重复项(leetcode)

删除有序数组中的重复项 这题简单题&#xff0c;双指针&#xff0c;一个指针记录未重复的数的个数&#xff0c;另一个记录遍历的位置。 以下是简单模拟&#xff0c;可以优化&#xff1a; class Solution { public:int removeDuplicates(vector<int>& nums) {int l0…

PyTorch中的多进程并行处理

PyTorch是一个流行的深度学习框架&#xff0c;一般情况下使用单个GPU进行计算时是十分方便的。但是当涉及到处理大规模数据和并行处理时&#xff0c;需要利用多个GPU。这时PyTorch就显得不那么方便&#xff0c;所以这篇文章我们将介绍如何利用torch.multiprocessing模块&#x…

含并行连结的网络

一、Inception块 1、白色部分通过降低通道数来控制模型复杂度&#xff0c;蓝色做特征提取工作&#xff0c;每条路上的通道数可能不同&#xff0c;大概我们会把更重要的那部分特征分配更多的通道数 2、Inception只改变高宽&#xff0c;不改变通道数 3、在不同的情况下需要选择…

渐开线花键测量学习笔记分享

大家好&#xff0c;继续渐开线花键的相关内容&#xff0c;本期是渐开线花键测量相关的学习笔记分享&#xff1a; 花键检测项目有花键大径和小径检验&#xff1b;内花键齿槽宽和外花键齿厚&#xff0c;以及渐开线终止圆 和起始圆直径检测&#xff1b;齿距累计误差 、齿形误差 、…

MySQL—统计函数和数学函数以及GROUP BY配合HAVING

合计/统计函数 count -- 演示 mysql 的统计函数的使用 -- 统计一个班级共有多少学生&#xff1f; SELECT COUNT(*) FROM student -- 统计数学成绩大于 90 的学生有多少个&#xff1f; SELECT COUNT(*) FROM student WHERE math > 90 -- 统计总分大于 250 的人数有多少&…

Centos新手问题——yum无法下载软件

起因&#xff1a; 最近在学习centos7&#xff0c;在VM上成功安装后&#xff0c;用Secure进行远程登陆。然后准备下载一个C编译器&#xff0c;看网络上的教程&#xff0c;都是用yum来下载&#xff0c;于是我也输入了命令&#xff1a; yum -y install gcc* 本以为会自动下载&a…

数据统计与数据分组18-25题(30 天 Pandas 挑战)

数据统计与数据分组 1. 知识点1.18 分箱与统计个数1.19 分组与求和统计1.20 分组获取最小值1.21 分组获取值个数1.22 分组与条件查询1.23 分组与条件查询及获取最大值1.24 分组及自定义函数1.25 分组lambda函数统计 2. 题目2.18 按分类统计薪水&#xff08;数据统计&#xff09…

《python程序语言设计》2018版第5章第52题利用turtle绘制sin函数

这道题是送分题。因为循环方式已经写到很清楚&#xff0c;大家照抄就可以了。 但是如果说光照抄可是会有问题。比如我们来演示一下。 import turtleturtle.penup() turtle.goto(-175, 50 * math.sin((-175 / 100 * 2 * math.pi))) turtle.pendown() for x in range(-175, 176…

5款屏幕监控软件精选|电脑屏幕监控软件分享

屏幕监控软件在现代工作环境中扮演着越来越重要的角色&#xff0c;无论是为了提高员工的工作效率&#xff0c;还是为了保障企业数据的安全&#xff0c;它们都成为了不可或缺的工具。 下面&#xff0c;让我们以一种新颖且易于理解的方式&#xff0c;来介绍五款备受好评的屏幕监…