Redis持久化说明及其单台Linux服务器搭建Redis集群架构

一.Redis持久化方式

1.1 RDB快照

说明:RDB快照主要以二进制文件的形式进行存储数据,主要以文件名dump.rdb进行存储,主要设置redis.conf里面设置’save 60 1000’命令可以开启, 表示在60秒内操作1000次进行一次备份数据。在客户端执行save(同步)和bgsave(异步操作)。
在这里插入图片描述

redis.conf

#修改持久化文件存放的位置
dir /usr/local/redis-5.0.3/data/
#开启RDB快照存储
save 900 1  #表示在900秒中操作1次
save 30 10   #表示在30秒中操作10次
save 60 1000   #表示在60秒中操作100次

在这里插入图片描述
启动redis相关命令

#RDB存放的文件名修改
dbfilename dump.db

#启动redis服务
src/redis-server  redis.conf

#查看redis服务进程号id
ps  -ef | grep redis

#结束redis服务
kill 2889(进程号id)

#启动redis编辑命令
src/redis-cli  -p 6379

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 AOF重写

说明:主要把文件生成为.aof文件,里面主要是<key,value>形式存储。
开启AOF在redis.conf配置

#开启AOF
appendonly yes
#下面三项开启一项
appendfsync always:每次有新命令追加到 AOF 文件时就执行一次 fsync ,非常慢,也非常安全。
appendfsync everysec:每秒 fsync 一次,足够快,并且在故障时只会丢失 1 秒钟的数据。
appendfsync no:从不 fsync ,将数据交给操作系统来处理。更快,也更不安全的选择。

#满足60m后进行从写,下一次是这一次的一倍
auto‐aof‐rewrite‐min‐size 64mb 
auto‐aof‐rewrite‐percentage 100

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 Redis 4.0混合持久化

说明:在AOF文件开启的情况下,当文件开始备份的时候将会在AOF备份文件中以二进制文件形式进行备份,当时备份之后的值,还是以AOF<key,value>形式进行备份。
开启AOF在redis.conf配置

aof‐use‐rdb‐preamble yes

启动redis混合模式重写

#开启混合模式存储
bgrewriteaof

在这里插入图片描述
在这里插入图片描述

二.Redis搭建主从与哨兵架构

在这里插入图片描述

2.配置主从架构

在这里插入图片描述

1、复制一份redis.conf文件

2、将相关配置修改为如下值:
port 6380
pidfile /var/run/redis_6380.pid  # 把pid进程号写入pidfile配置的文件
logfile "6380.log"
dir /usr/local/redis-5.0.3/data/6380  # 指定数据存放目录
# 需要注释掉bind
# bind 127.0.0.1(bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可)

3、配置主从复制
replicaof 192.168.0.60 6379   # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica-read-only yes  # 配置从节点只读

4、启动从节点
redis-server redis.conf

5、连接从节点
redis-cli -p 6380

6、测试在6379实例上写数据,6380实例是否能及时同步新修改数据

7、可以自己再配置一个6381的从节点

注意:在相关redis文件夹启动,查看配置的文件夹是否存在,不存在,需要手工建立相关的文件夹

2.1 配置6380redis从服务器

1.在conf下复制redis6379改名为redis6380.conf
在这里插入图片描述
2.修改redis6380.conf配置文件

port 6380
pidfile /var/run/redis_6380.pid  # 把pid进程号写入pidfile配置的文件
logfile "6380.log"
dir /usr/local/redis-5.0.3/data/6380  # 指定数据存放目录
# 需要注释掉bind
# bind 127.0.0.1

replicaof 192.168.2.66 6379   # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica-read-only yes  # 配置从节点只读

2.2 配置6381redis从服务器

1.在conf下复制redis6379改名为redis6381.conf
在这里插入图片描述
2.修改redis6381.conf配置文件

port 6381
pidfile /var/run/redis_6381.pid  # 把pid进程号写入pidfile配置的文件
logfile "6381.log"
dir /usr/local/redis-5.0.3/data/6381  # 指定数据存放目录
# 需要注释掉bind
# bind 127.0.0.1

replicaof 192.168.2.66 6379   # 从本机6379的redis实例复制数据,Redis 5.0之前使用slaveof
replica-read-only yes  # 配置从节点只读

2.3 启动6379、6380、6381服务,看看是否配置成功

src/redis-service conf/redis6379.conf

src/redis-service conf/redis6380.conf

src/redis-service conf/redis6380.conf

src/redis-cli  -p 6379

info

在这里插入图片描述

2.4 java代码连接redis

2.4.1 关闭linux防火墙(在linux环境进行操作)

systemctl stop firewalld # 临时关闭防火墙
systemctl disable firewalld # 禁止开机启动

2.4.2 导入相关的redis pomjar包

  <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
</dependency>

2.4.3 建立jave连接

package com.tuling.jedis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.Pipeline;

import java.util.List;

public class redisTest {

    public static void main(String[] args) {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(20);
        jedisPoolConfig.setMaxIdle(10);
        jedisPoolConfig.setMinIdle(5);

        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.1.66", 6379, 10000, null);

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();

            //单挑数据导入
            System.out.println(jedis.set("single","Nickel"));
            System.out.println(jedis.get("single"));

            //******* 管道示例 ********
            Pipeline pl = jedis.pipelined();
            for(int i=0;i<10;i++){
                pl.incr("pipeline");
                pl.set("n"+i,"nickel");
                //模拟管道报错
                //pl.setbit("nickel", -1, true);
            }
            List<Object> results=pl.syncAndReturnAll();
            System.out.println(results);

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (jedis != null)
                jedis.close();
        }
    }
}

在这里插入图片描述

2.4 配置哨兵

2.4.1复制sentinel.conf到config下,分别名字叫sentinel-26379.conf、sentinel-26380.conf、sentinel-26381.conf

2.4.2配置26379哨兵

port 26379
daemonize yes
pidfile "/var/run/redis-sentinel-26379.pid"
logfile "26379.log"
dir "/usr/local/redis-5.0.3/data"
# sentinel monitor <master-redis-name> <master-redis-ip> <master-redis-port> <quorum>
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 + 1),master才算真正失效
sentinel monitor mymaster 192.168.0.60 6379 2   # mymaster这个名字随便取,客户端访问时会用到

2.4.3配置26380哨兵

port 26380

daemonize yes

pidfile /var/run/redis-sentinel-26380.pid

logfile "log/26380.log"

dir /usr/local/redis-5.0.3/data/26380

sentinel monitor mymaster 192.168.1.66 6379 2   # mymaster这个名字随便取,客户端访问时会用到

2.4.4配置26381哨兵

port 26381

daemonize yes

pidfile /var/run/redis-sentinel-26381.pid

logfile "log/26381.log"

dir /usr/local/redis-5.0.3/data/26381

sentinel monitor mymaster 192.168.1.66 6379 2   # mymaster这个名字随便取,客户端访问时会用到

在这里插入图片描述

2.4.5启动哨兵

src/redis-sentinel   conf/company/sentinel-26379.conf 
src/redis-sentinel   conf/company/sentinel-26380.conf 
src/redis-sentinel   conf/company/sentinel-26381.conf 

src/redis‐cli ‐p 26379

在这里插入图片描述
在这里插入图片描述

2.4.5启动哨兵

在这里插入图片描述

2.4.6 java代码连接哨兵

package com.tuling.jedis;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

import java.util.HashSet;
import java.util.Set;

public class SentinelTest {
    public static void main(String[] args) {

        JedisPoolConfig config=new JedisPoolConfig();
        config.setMaxTotal(20);
        config.setMaxIdle(10);
        config.setMinIdle(5);

        String masterName="mymaster";
        Set<String> sentinels=new HashSet<String>();
        sentinels.add(new HostAndPort("192.168.1.66",26379).toString());
        sentinels.add(new HostAndPort("192.168.1.66",26380).toString());
        sentinels.add(new HostAndPort("192.168.1.66",26381).toString());

        JedisSentinelPool jedisSentinelPool=new JedisSentinelPool(masterName,sentinels,config,3000,null);
        Jedis jedis=null;
        try{
            jedis=jedisSentinelPool.getResource();
            System.out.println(jedis.set("age","18"));
            System.out.println(jedis.get("age"));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
           if(jedis!=null){
               jedis.close();
           }
        }
    }
}

在这里插入图片描述
在这里插入图片描述

2.5 Spring Boot整合哨兵

2.5.1引入jar

      <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.5.2配置application.yml文件

server:
  port: 8080

spring:
  redis:
    sentinel:
      master: mymaster
      nodes: 192.168.1.66:26379,192.168.1.66:26380,192.168.1.66:26381
    jedis:
      pool:
        max-idle: 50
        min-idle: 10
        max-active: 100
        max-wait: 1000
  datasource: 0
  timeout: 3000

2.5.3启动java代码访问

package com.redis;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class IndexController {

    private static final Logger logger = LoggerFactory.getLogger(IndexController.class);

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 测试节点挂了哨兵重新选举新的master节点,客户端是否能动态感知到
     *
     * @throws InterruptedException
     */
    @RequestMapping("/test_sentinel")
    public void testSentinel() throws InterruptedException {
        int i = 1;
        while (true){
            try {
                stringRedisTemplate.opsForValue().set("zhuge"+i, i+""); //jedis.set(key,value);
                System.out.println("设置key:"+ "zhuge" + i);
                i++;
                Thread.sleep(1000);
            }catch (Exception e){
                logger.error("错误:", e);
            }
        }
    }

}

在这里插入图片描述

2.5.4 StringRedisTemplate与RedisTemplate详解

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。在RedisTemplate中提供了几个常用的接口方法的使用,分别是:

  • private ValueOperations<K, V> valueOps;
  • private HashOperations<K, V> hashOps;
  • private ListOperations<K, V> listOps;
  • private SetOperations<K, V> setOps;
  • private ZSetOperations<K, V> zSetOps;

RedisTemplate中定义了对5种数据结构操作

  • redisTemplate.opsForValue();//操作字符串
  • redisTemplate.opsForHash();//操作hash
  • redisTemplate.opsForList();//操作list
  • redisTemplate.opsForSet();//操作set
  • redisTemplate.opsForZSet();//操作有序set
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

三.Redis队列与stream、Redis 6多线程

1.stream流程图

在这里插入图片描述

2.redis中stream相关命令

1.生产端命令

xadd 追加消息
xdel 删除消息
xrange 获取消息列表,会自动过滤已经删除的消息
xlen 消息长度
//消息格式为
xadd streamtest * name mark age 18

**xadd表示stream流中的命令,streamtest表示流的名字,*表示自动生成唯一的ID号,name mark age 18表示消息内容。 **

//streamtest 流中增加三条数据
xadd streamtest * name mark age 18
xadd streamtest * name james age 23
xadd streamtest * name king age 19

//获取streamtest 流中数据的长度
xlen streamtest

//获取streamtest 流中所有的数据
xrange streamtest - +

//获取streamtest 流中获取从开始到流ID的数据
xrange streamtest - 1700726396835-0

//获取streamtest 流中数据从某个位置到某个位置
xrange streamtest 1700726302998-0 1700726396835-0


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值