一.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表示消息内容。 **文章来源:https://www.toymoban.com/news/detail-497916.html
//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
文章来源地址https://www.toymoban.com/news/detail-497916.html
到了这里,关于Redis持久化说明及其单台Linux服务器搭建Redis集群架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!