redis(三)redis持久化和集群(redis版本:5.0.4)

一、持久化

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。

1.AOF持久化

Redis 在执行完一条写操作命令后,就会把该命令以追加的方式写入到一个文件里,然后 Redis 重启时,会读取该文件记录的命令,然后逐一执行命令的方式来进行数据恢复。

可以通过appendonly参数开启:appendonly yes

开启AOF持久化后每执行一条会更改Redis中的数据的命令,Redis就会将该命令写入硬盘中的AOF文件。AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:appendfilename appendonly.aof。

2.RDB快照

因为 AOF 日志记录的是操作命令, 不是实际的数据,所以用 AOF 方法做故障恢复时,需要全 量把日志都执行一遍,一旦 AOF 日志非常多,势必会造成 Redis 的恢复操作缓慢。为了解决这个问题,Redis 增加了 RDB 快照。

所谓的快照,就是记录某一个瞬间东西,比如当我们给风景拍照时,那一个瞬间的画面和信息 就记录到了一张照片。所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据, 而 AOF 文件记录的是命令操作的日志,而不是实际的数据。因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF那样还需要额外执行操作命令的步骤才能恢复数据。

Redis 提供了两个命令来生成 RDB 文件,分别是 save 和 bqsave,他们的区别就在于是否在 「主线程」里执行:

  • 执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以 如果写入 RDB 文件的时间太长,会阻塞主线程;
  • 执行了 bqsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞。

在redis.conf中:

配置dir指定rdb快照文件的位置

配置dbfilenam指定rdb快照文件的名称

3.对比

二、主从复制

1.主redis配置:无需特殊配置

2.从redis配置

修改从redis服务器上的redis.conf文件,添加slaveof 主redisip 主redis 端口

3.配置实例

(1)准备三个redis实例,一个主库,两个从库,主库是6379,从库是6380和6381端口

(2)从库的配置:在redis.conf里面都加上下面的配置

bash 复制代码
slave 云服务器ip 6379(主库ip)

(3)启动三个redis实例,注意需要在云服务器的安全组和防火墙加上6379端口

(4)进入从库的客户端,看一下有没有主库的相关信息

bash 复制代码
./redis-cli -p 6380
127.0.0.1:6380> info replication

三、集群

我使用的是redis5.0.4版本

(一)创建六个redis节点

1.在usr/local目录下新建redis-cluster目录,用于存放集群节点
2.把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下,不用担心这里没有redis01目录,会自动创建的。操作命令如下(注意当前所在路径):
bash 复制代码
cp -r redis/bin/ redis-cluster/redis01
3.删除redis01目录下的快照文件dump.rdb(如果有),修改redis.conf文件

下面的在配置文件里面都有,可以打开注释,进行修改

修改端口号为7001

bash 复制代码
port 7001

开启集群创建模式

bash 复制代码
cluster-enabled yes

开启后台启动

bash 复制代码
daemonize yes

修改集群配置文件:Redis 集群要求每个节点必须使用唯一的集群配置文件

bash 复制代码
cluster-config-file nodes-7001.conf
4.将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006,cluster-config-file也改成7002-7006
bash 复制代码
#示例
cp -r redis01/ redis02
5.接着启动所有redis节点,由于一个一个启动太麻烦了,所以在这里在redis-cluster下面创建一个批量启动redis节点的脚本文件,命令为start-all.sh,文件内容如下:
bash 复制代码
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

并且修改权限:

bash 复制代码
chmod +x start-all.sh
6.在redis-cluster下面运行命令执行start-all.sh脚本,启动6个redis节点
bash 复制代码
./start-all.sh

(二)搭建集群

1.如果你的redis版本在5之下,那么你就需要安装ruby,我的版本是5.0.4,所以不需要这个工具。

2.集群启动

这里的replicas 1表示副本为1个,也就是现在是三主,每个主redis下有一个从redis

bash 复制代码
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1

输入yes确认配置

4.测试集群

-c 表示集群模式 redis-cli表示client模式进入redis,-p表示端口号

也就是进入7001这个redis,使用cluster nodes看看有哪些其他节点信息。

可以看到不同的key值被分配到了不同的机器上,也就是成功部署了redis cluster集群模式

四、使用springboot连接集群

一定要在安全组和防火墙都设置好端口:7001-7006

bash 复制代码
sudo firewall-cmd --zone=public --add-port=7001-7006/tcp --permanent
firewall-cmd --reload

1.pom添加redis starter

XML 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2.添加redistemplate

java 复制代码
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)  {
        Jackson2JsonRedisSerializer serializer=new Jackson2JsonRedisSerializer(Object.class);
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(serializer); //设置key序列化
        template.setValueSerializer(serializer);//设置value序列化
        return template; } }

3.application.properties 文件添加redis集群

java 复制代码
#刷新节点与槽位的映射关系
spring.redis.cluster.expire-seconds=120
#设置redis集群的节点信息,这个ip如果你的代码是在云服务器部署,
那你就写对应的云服务器的内网ip(保证几台云服务器都在同一个账号的同一个地域下面),
如果是代码在本地的话,就写公网ip,当然了我们是一个服务器开了多个redis实例,实际工作肯定是部署在多台服务器的
spring.redis.cluster.nodes=192.168.31.96:7001,192.168.31.96:7002,192.168.31.96:7003,192.168.31.96:7004,192.168.31.96:7005,192.168.31.96:7006
#设置命令的执行时间,如果超过这个时间,则报错
spring.redis.cluster.command-timeout=5000
相关推荐
zzb15801 小时前
RAG from Scratch-优化-query
java·数据库·人工智能·后端·spring·mybatis
一只鹿鹿鹿1 小时前
信息安全等级保护安全建设防护解决方案(总体资料)
运维·开发语言·数据库·面试·职场和发展
堕2741 小时前
MySQL数据库《基础篇--数据库索引(2)》
数据库·mysql
wei_shuo1 小时前
数据库优化器进化论:金仓如何用智能下推把查询时间从秒级打到毫秒级
数据库·kingbase·金仓
雷工笔记1 小时前
Navicat Premium 17 软件安装记录
数据库
wenlonglanying2 小时前
Ubuntu 系统下安装 Nginx
数据库·nginx·ubuntu
数据库小组2 小时前
10 分钟搞定!Docker 一键部署 NineData 社区版
数据库·docker·容器·database·数据库管理工具·ninedata·迁移工具
爬山算法2 小时前
MongoDB(38)如何使用聚合进行投影?
数据库·mongodb
l1t2 小时前
Deep Seek总结的APSW 和 SQLite 的关系
数据库·sqlite
Pocker_Spades_A3 小时前
基于代价模型的连接条件下推:复杂SQL查询的性能优化实践
数据库·sql·性能优化