redis学习总结(二)

redis 持久化 交换

什么是持久化: 将数据从掉电易失的内存存放到能够永久存储的设备上

redis持久化方式:RDB(Redis DB) hdfs:fsimage(产生持久化镜像文件,以二进制格式文件的形式存储,对应reids的RDB文件)

AOF(AppendOnlyFile)  hdfs: edit logs 关闭   (以客户端向redis发送指令的形式来存储文件 ,对应redis的AOF文件)

RDB: 在默认情况下,redis将数据库快照保存在名字为dump.rdb的二进制文件中

方式: 1、阻塞方式  客户端执行save命令  2、非阻塞方式  bgsave

策略: 自动:按照配置文件中的条件满足就执行BGSAVE

save 60 1000,redis要满足在60秒内至少有1000个键被改动,会自动保存一次

手动:客户端发起save,bgsave

BGSAVE命令:

redis> bgsave

非阻塞,redis服务正常接收处理客户端请求

redis会 fork() 一个新的子进程来创建RDB文件,子进程处理完后,会像父进程发送一个信号,通知它处理完毕

父进程用新的dump.rdb替代旧文件

持久化默认配置:

save 9001

save 300 10

save 10 10000

只要上面三个条件满足一个就会自动执行备份

创建RDB文件之后,时间计数器和次数计数器会清零,所以多个条件的效果不是叠加的

redis持久化的优点和缺点:

优点 1、完全备份,不同时间的数据集备份可以做到多版本恢复

2、紧凑的单一文件,方便网络传输,适合灾难恢复

3、恢复大数据集速度较AOF快

缺点:

1、会丢失最近写入、修改的而未能持久化的数据

2、fork过程非常耗时,会造成毫秒级不能响应客户端请求

AOF写入机制:

AOF不能保证绝对不丢失数据

目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,系统通常不会将内容直接写入到硬盘里面。而是现将内容放入一个内存缓冲区中,等到缓冲区被填满,或者用户执行fsync调用和fdatasync调用时才将存储在缓冲区的内容真正写入到硬盘里面,未写入磁盘之前,数据可能会丢失

写入磁盘的策略:

appendfsync选项,这个选项的值可以是always,everysec或者no

always: 服务器没写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘。这种模式下,服务器出现故障,也不会丢失任何已经成功执行的命令 数据

Everysec(默认): 服务器每一秒重调用一次fdatasync,将缓冲区里面的数据写入到硬盘,这种模式下,服务器出现故障,最多只丢失一秒钟内执行的命令数据

NO: 服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到磁盘。这种模式下,服务器遭遇意外停机时,丢失命令的数量是不确定的

运行速度:always运行速度慢,everysec和no都很快

AOF重写过程:

fork一个子进程负责重写AOF文件

子进程会创建一个临时文件写入AOF信息

父进程会开辟一个内存缓冲区接受新的命令

子进程重写完成之后,父进程会获得一个信号,将进程收到的新的写操作由子进程写入到临时文件之中,新文件替代旧的文件

注:如果写入操作的时候出现故障导致命令写半截,可以使用redis-check-aof工具修复

reids持久化 -AOF 操作

优点:  写入机制,默认fysec每秒执行,性能很好不阻塞服务,最多丢失一秒的数据

重写机制,优化AOF文件

如果误操作了,只要AOF未重写,停止服务移除AOF文件尾部FLUSHALL命令,重启redis,可以将数据集恢复到FLUSHALL执行之前的状态

缺点:

相同的数据集,AOF文件体积较RDB大了很多

恢复数据库速度较RDB慢

开启AOF操作之后,默认不在使用RDB作为备选,但二者任然可以同时开启

搭建集群时需要遵循的原则: CAP原则,指的是在一个分布式系统之中,Consistency(一致性),Availability(可用性),partitiontolerance(分区容错性),三者不可兼得

redis主从复制

一个redis服务可以有多个该服务的复制品,这个redis服务称为master,其他复制品称为slaves

只要网络连接正常,master会一直将自己的数据同步更新给slaves,保持主从同步

只有master可以执行写命令,slaves才可以执行读命令

主从复制创建:

redis-server-slaveof<master-ip> <master-port> ,配置当前服务称为某redis服务的slave

example:   #redis-server--port 6308 --slaveof 127.0.0.1 6379

SLAVEOF  host port 命令,将当前服务器状态从master修改为别的服务器的slave

redis > SLAVEOF 192.168.1.1. 6379, 将服务器转换为slave

redis > SLAVEOF NO ONE ,将服务器重新恢复到master,不会丢弃已同步数据

配置方式,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器

、slaveof <masterip> <masterport>

slaveof 127.0.0.1 6379

单节点模拟主从架构模式:

手动实现主从模式

1、创建redis 文件夹  在该文件夹下面创建三个子文件夹

2、分别进入这三个文件夹,并在着三个文件夹之中分别启动redis 服务

3、启动redis服务 : redis-server --port 6380 (在第一个文件夹中创建,相当于创建了一个redis实例 )

reids-server --port 6381 --slaveof 127.0.0.1 6380  (在第二个文件夹中创建一个redis实例)

reids-server --port 6382 --slaveof 127.0.0.1 6380  (在第三个文件夹中创建一个redis实例)

启动一个客户端实例: redis-cli -p 6380

插入一条数据验证之前插入的数据,与其他节点的数据是同步的

当主节点初夏故障之后,手动切换主从节点: 在6381客户端输入 SLAVEOF no one 就实现了将6381节点命名为新的注节点

在6382的节点将6382节点切换为6381的从节点: SLAVEOF 127.0.0.1 6381

实现自动切换主从架构:

redis哨兵paxos

监控 monitoring

sentinel会不断检查master和slaves是否正常

每一个sentinel可以同步监控任意多个master和该master 下的slaves

sentinel网络:

监控同一个master的sentinel会自动连接,组成一个分布式sentinel网络,互相通信并交换彼此关于被监控服务器的信息

哨兵一般也以集群的方式来运行

redis哨兵 senlinel配置文件

至少包含一个监控配置选项,用于监控被指定master的相关信息

sentinel monitor<name><ip><port><quorum>,l例如 sentinel monitor mymaster 127.0.0.1 6379 2

监视master的主服务器,服务器ip和端口,将这个主服务器下线失效至少需要2个sentinel同意,如果多数sentinel同意才会执行故障转移

sentinel会根据master的配置自动发现master的slaves

sentiNel默认端口是26279

哨兵的使用方法:(所有的操作都在模拟的单节点上运行)

1、mkdir sent

2、在新建文件夹下创建三个哨兵启动时的启动目录

3、启动文件的名称是固定的 vi s1.conf

在新建文件夹中分别设置哨兵的启动条件:

port 26380 (设置哨兵的启动节点端口号)

sentinel monitor xxx 127.0.0.1 6380 2  (设置哨兵监控的端口号以及某个节点提升为主节点需要的投票数)

cp s1.conf s2.conf    cp s1.conf s3.conf

修改每个配置文件中哨兵的端口号

需要将哨兵的启动目录放置到bin目录之下,目的是可以在任意的目录都可以进行启动

4、启动哨兵: 首先进入到节点sent目录下

redis-sentinel s1.conf

redis-sentinel s2.conf

redis-sentinel s3.conf

当主节点当掉之后,会自动选举一个节点作为主节点

redis集群分片

集群将整个数据库分为16384个槽位slot,所有key的数据都是这些slot中的一个,key的槽位计算公式为slot_number = crc16(key)%16384,其中crc16位的循环冗余校验和函数

集群中每个节点都可以处理0个至16383个槽,当16383个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求

每个节点拥有的槽位数量是可以进行自由分配的

用这种方式可以解决数据迁移以及数据倾斜的问题

搭建redis集群:

上传redis 3.0.0.4 版本的安装目录 ,并进行解压

2、对redis安装文件进行编译  make && make PREFIX= /opt/wcg/redis/ install

3、3.0版本和2.8版本的区别在于 服务器启动时即是服务器有事哨兵

4、搭建一个完整的redis集群至少需要六个节点 ,启动之后需要进行区分主从,同时要进行一个槽位的认领

5、安装ruby (脚本)环境,该环境的作用是支持槽位分发  安装ruby环境的命令: yum -y install ruby rubtgems

6、安装gcc 以及tcl 环境

7、redis-cluster 目录下安装 redis gem 模块:  # gem install --local redis-3.3.0.gem
8、创建文件夹 redis-test 并创建6个启动文件
9、分别在每个文件下启动redis服务器 (共六个)

10、 完成之后用ruby进行分槽  # ./redis-trib.rb create --replicas 1 127.0.0.1:7000 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

11、槽位分发完成之后,服务器才算是真正的运作了起来

12、启动客户端集群的命令: redis-cli -p 7000 -c

原文地址:https://www.cnblogs.com/wcgstudy/p/11143716.html

时间: 2024-10-12 13:16:37

redis学习总结(二)的相关文章

Redis学习(二)、JAVA操作Redis

Redis学习(二).JAVA操作Redis 一.测试连接Redis是否连通 1.导包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 2.写一个RedisJava类测试 package cn.qiuuuu.redis; impo

【Redis】Redis学习(二) master/slave、sentinal、Cluster简单总结

项目中用到Redis,所以准备学习一下,感觉Redis的概念还是很多的,什么主从模式.Sentinal模式.集群模式的,一下子都晕了,我觉得还是有必要先理清这些基本概念再说. 一.单节点实例 单节点实例还是比较简单的,平时做个测试,写个小程序如果需要用到缓存的话,启动一个Redis还是很轻松的,做为一个key/value数据库也是可以胜任的.单节点部署参照:http://www.cnblogs.com/yiwangzhibujian/p/7053840.html 中的初级教程. 二.主从模式(m

Redis学习笔记二

一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示例: 首先,使用multi命令告诉Redis:下面我给你的命令属于同一个事务,你先不要执行,而是暂时存起来. 然后,我们发送两个set命令来实现赋值,可以看到redis没有执行这些命令,而是返回queued表示这两条命令已经进入等待执行的事务队列中. 当所有要在同一事务中执行的命令都发给Redis后

redis学习之二from github

大概敲了一遍基本命令,熟悉了redis的存储方式.现在开始进一步系统的学习.学习教程目前计划有三个,一个是github上的https://github.com/JasonLai256/the-little-redis-book/blob/master/cn/redis.md,一个是中文官方网站http://www.redis.cn/documentation.html,还有一个看起来像w3c风格的简单教程http://www.runoob.com/redis/redis-commands.htm

redis学习(二)——String数据类型

一.概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的Value最多可以容纳的数据长度是512M. 二.相关命令 1.赋值命令 命令原型:SET key value 时间复杂度:O(1) 命令描述:设定该Key持有指定的字符串Value,如果该Key已经存在,则覆盖其原有值. 返回值:总是返回"OK". 2.取值命令 命令原型:GET key

redis 学习笔记二 (简单动态字符串)

redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势: 1.不需要初始化,数组名直接就是所在的偏移   2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间.  这个数组不占用任何内存,意味着这样的结构节省空间: 该数组的内存地址就和他后面的元素的地址相同,意味着无需初始化,数组名就是后面元素的地

分布式缓存技术redis学习(二)——详细讲解redis数据结构(内存模型)以及常用命令

Redis数据类型 与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多,常用的数据类型主要有五种:String.List.Hash.Set和Sorted Set. Redis数据类型内存结构分析 Redis内部使用一个redisObject对象来表示所有的key和value.redisObject主要的信息包括数据类型(type).编码方式(encoding).数据指针(ptr).虚拟内存(vm)等.type代表一个value对象具体是何种数

redis学习(二)

集合 添加/删除元素 SADD key member1 member2 ... SREM key member1 member2 ... 获得集合中的所有元素 SMEMBERS key 127.0.0.1:6380> sadd car benz baoma xiandai (integer) 3 127.0.0.1:6380> smembers car 1) "baoma" 2) "xiandai" 3) "benz" 127.0.0

redis学习(二)redis.conf文件配置

取自: https://www.cnblogs.com/pqchao/p/6558688.html 为了更好的使用redis,我们需要详细的了解redis配置文件及相关参数作用. bind 127.0.0.1 bind 192.168.1.100 绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址.这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接.如果bind选项为空的话,那会接受所有来自于可用网络接口的连接.如上配置,绑定一个127.0.0.1的本机

Redis学习基础二

回顾:上一基础中已了解 ( 什么是redis .redis 的三大特点.安装,和数据配置) 接下来浅尝Redis的数据类型,时间煮雨...... 一.Redis数据类型 redis支持五中数据类型(string字符串.hash哈希.list列表.set集合.zset有序集合) (一)String 字符串 1.string 是redis 中最基本的类型,可以理解成与memcached一模一样的类型,一个key对应一个value 2.string 类型是二进制安全的,意思是redis 的string