Redis学习
1.Redis简介
1.1数据库分类
1.1.1关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
1.1.1.1优点
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
1.1.1.2缺点
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
1.1.2非关系型数据库(NoSql)
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
1.1.2.1优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。
1.1.2.2缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;(Redis支持批量处理,但严格意义上不能算事务, 不具备事务ACID特性)
3、数据结构相对复杂,复杂查询方面稍欠。
1.1.2.3非关系型数据库的分类和比较:
1、文档型(MongoDB)
2、key-value型(Redis,Memcached)
3、列式数据库(HBase)
4、图形数据库
2.Redis的用武之地
2.1历史与发展
2.2功能丰富
https://blog.youkuaiyun.com/ligupeng7929/article/details/79603060
2.3性能优越
3.Redis的安装
3.1Windows系统安装(了解)
3.1.1下载Redis的windows版本
https://github.com/microsoftarchive/redis/releases
目前最新版本是Redis-3.2.100
3.1.2解压文件到目录中
3.1.3执行文件说明
3.1.4启动Redis服务
redis-server.exe redis.windows.conf
3.1.5启动自带客户端连接
1.REM 默认是连127.0.0.1,端口6379
2.redis-cli.exe
1.REM 如果连接其他服务器或者端口改变,可以使用参数控制
2.redis-cli.exe -h 127.0.0.1 -p 6379
3.1.6安装Windows环境的Redis服务(可自启动)
执行如下命令可以安装一个Redis服务
redis-server --service-install redis.windows-service.conf --loglevel verbose
只需启动服务即可连接。
如果想要移除Redis服务,可以使用如下命令:
redis-server --service-uninstall
3.2Linux安装(CentOS为例,重点)
3.2.1下载Redis的Linux版本
官网地址:https://redis.io/
3.2.2在Linux系统中下载安装
1.# 1、检查是否已经安装了redis,返回 redis: ,说明没有安装
2.whereis redis
3.# 2、wget获取Redis的tar.gz包,并安装
4.# 获取tar.gz包,若未安装wget,使用yum -y install wget命令安装
5.yum -y install wget
6.# 需要安装gcc编译器
7.yum -y install gcc gcc-c++ automake autoconf libtool make
8.# 安装tcl
9.yum -y install tcl
10.# 安装vim
11.yum -y install vim
12.
13.cd /usr/local/
14.wget http://download.redis.io/releases/redis-5.0.5.tar.gz
15.
16.# 解压文件
17.tar -zxvf redis-5.0.5.tar.gz
18.# 删除压缩文件
19.rm redis-5.0.5.tar.gz -rf
20.# 进入redis目录
21.cd redis-5.0.5/
22.# 避免出现【zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录】
23.make MALLOC=libc
24.# 编译并安装
25.make & make PREFIX=/usr/local/redis install
3.2.3修改配置文件
1.# -------------------------- 修改配置文件 ----------------------------
2.cd /usr/local/redis-5.0.5
3.# 复制配置文件到安装目录
4.cp /usr/local/redis-5.0.5/redis.conf /usr/local/redis/bin/redis_6379.conf
5.# 进入安装目录
6.cd /usr/local/redis/bin/
7.# 替换内容sed命令,-i表示直接替换文件, 表达式:'s/查找正则/替换正则/' , \1 代表捕获第一组,
8.# 0,/^$/ 表示只替换第一次找到的内容
9.# 替换配置后台启动(daemonize no 改为 daemonize yes)
10.sed -i '0,/^\s*daemonize\s*no\s*$/s/^\s*daemonize\s*no\s*$/daemonize yes/' redis_6379.conf
11.# 替换配置允许其他ip访问(bind 127.0.0.1 改为 #bind 127.0.0.1)
12.sed -i '0,/^\s*bind.*$/s/^\s*bind.*$/#bind 127.0.0.1/' redis_6379.conf
13.# 替换配置关闭保护模式(protected-mode yes 改为 protected-mode no)
14.# 保护模式开启时必须bind ip或者设置密码,否则远程无法连接,设置密码后可以不改
15.# sed -i '0,/^\s*protected-mode.*yes.*$/s/^\s*protected-mode.*yes.*$/protected-mode no/' redis_6379.conf
16.# 替换配置设置密码(protected-mode yes 改为 protected-mode no)
17.sed -i '0,/^#*\s*requirepass.*$/s/^#*\s*requirepass.*$/requirepass 654321/' redis_6379.conf
18.# 显示简化配置文件,只显示非注释内容
19.egrep -v "#|^$" redis_6379.conf
20.
3.2.4配置Redis自启动
1.# 3、编写自启动脚本
2.# 编写自启动脚本
3.vim /etc/init.d/redis_6379
4.' # 写入如下内容
5.#!/bin/sh
6.### BEGIN INIT INFO
7.# Provides: redis
8.# Required-Start: $remote_fs $network
9.# Required-Stop: $remote_fs $network
10.# Default-Start: 2 3 4 5
11.# Default-Stop: 0 1 6
12.# Short-Description: starts redis
13.# Description: starts the redis FastCGI Process Manager daemon
14.### END INIT INFO
14.
15.
17.REDISPORT=6379
18.EXEC=/usr/local/redis/bin/redis-server
19.REDIS_CLI=/usr/local/redis/bin/redis-cli
16.
21.PIDFILE=/var/run/redis_6379.pid
22.CONF="/usr/local/redis/bin/redis_6379.conf"
17.
24.case "$1" in
18. start)
19. if [ -f $PIDFILE ]
20. then
21. echo "$PIDFILE exists, process is already running or crashed."
22. else
23. echo "Starting Redis server..."
24. $EXEC $CONF
25. fi
26. if [ "$?"="0" ]
27. then
28. echo "Redis is running..."
29. fi
30. ;;
31. stop)
32. if [ ! -f $PIDFILE ]
33. then
34. echo "$PIDFILE exists, process is not running."
35. else
36. PID=$(cat $PIDFILE)
37. echo "Stopping..."
38. RP=$(grep '^requirepass' $CONF)
39. if [ "$?"="0" ]
40. then
41. PWD=$(echo $RP|cut -d " " -f2)
42. $REDIS_CLI -p $REDISPORT -a $PWD SHUTDOWN
43. else
44. $REDIS_CLI -p $REDISPORT SHUTDOWN
45. fi
46.
47. sleep 2
48. while [ -x $PIDFILE ]
49. do
50. echo "Waiting for Redis to shutdown..."
51. sleep 1
52. done
53. echo "Redis stopped"
54. fi
55. ;;
56. restart|force-reload)
57. ${0} stop
58. ${0} start
59. ;;
60. *)
61. ${0} start
62. # echo "Usage: /etc/init.d/redis_6379 {start|stop|restart|force-reload}" >&2
63. exit 1
71.esac
72.'
73.# 给权限,否则不能启动
74.chmod 755 /etc/init.d/redis_6379
75.# 加入自启动列表
76.chkconfig redis_6379 on
77.chkconfig --list|grep redis_6379
78.
3.2.5开启外网防火墙
1.# 开启外网6379端口访问
2.firewall-cmd --zone=public --add-port=6379/tcp --permanent
3.# 重启防火墙生效
4.firewall-cmd --reload
5.
脚本文件:
3.3前端启动和后台启动
3.3.1前端启动
daemonize设置为no(默认值)的时候,运行redis-server会使用前端启动,即占用当前终端窗口。
3.3.2后端启动(重点)
daemonize设置为yes的时候,运行redis-server会使用进入后台启动模式。
3.4停止Redis服务
3.4.1正常关闭Redis服务
使用客户端工具关闭
1./usr/local/redis/bin/redis-cli shutdown
注意如果存在密码,则会出现如下错误
需使用 –a 密码来授权关闭,当然这样不安全,建议登录后执行shutdown命令
1./usr/local/redis/bin/redis-cli -a 654321 shutdown
3.4.2强行杀死进程关闭
1.pkill redis-server
不推荐的方式,可能会导致Redis丢失数据。
4.Redis的使用
4.1自带客户端连接(与Windows类似,略)
4.2Redis可视化工具连接
4.2.1redis-desktop-manager
4.2.1.1下载redis-desktop-manager工具
https://github.com/uglide/RedisDesktopManager/releases/download/0.9.3/redis-desktop-manager-0.9.3.817.exe
4.2.1.2安装(过程简单,略过)
4.2.1.3创建连接
4.2.2Redis-Studio
Redis-Studio
5.Redis的数据结构(重点)
5.1Redis数据结构介绍
5.1.1redis实例中默认包含16个数据库,编号从0开始,可以修改配置文件的databases来修改,客户端连接后默认选择0号数据库。
可以通过select命令切换数据库编号。
5.1.2redis是使用键值对去保存数据的,类似于java中的map集合。(redis中是没有表概念)
5.1.3这个map集合是有key和value,key全部都是字符串,value有多中数据类型。
5.2基本key命令
keys * 获取所有的key
select 0 选择第一个库
move key 1 将当前的数据库key移动到某个数据库,目标库有,则不能移动
flushdb 清除指定库
randomkey 随机取一个存在的key
type key 获取key类型
del key 删除key
exists key 判断是否存在key
expire key 10 10秒过期
pexpire key 1000 毫秒过期
persist key 删除过期时间
5.3存储string(字符串)
5.3.1概述
字符串类型是Redis中最为基础的、常用的数据存储类型,字符串在Redis中是二进制安全的,这便意味着该类型存入和获取的数据相同。在Redis中字符串类型的value最多可容纳的数据长度512M
5.3.2常用命令
1)赋值(相当于map.put)
set key value:设定key特有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”。
演示:1、先登录redis服务器端。2、使用redis客户端去连接服务器,在客户端中进行操作。
上述操作中,username这个key重复了,那么会进行覆盖操作。
2)取值(相当于map.get)
get key:获取key的value,如果与该key关联的value不是String类型,redis将返回错误信息,因为get命令只能用于获取String value。如果该key不存在,则会返回nil。
3)删除(相当于map.remove)
del key,删除成功后返回1,否则返回0。
4)keys * 将所有的key都查询出来。
5)expire key 60 (重点)
redis是一个缓存数据库,缓存数据库最大的特点:它有一个临时性,体现在key 的有效时间上 面。默认情况下,如果不对key设置有效期,那么key会永久保存到redis 缓存数据库中, expire key 60 即设置key的有效时间为60秒,60秒后将这个key自 动从数据库中进行删除。
6)ttl key 可查看key还有多长时间过期。 -1表示永久有效。
7)exists key 判断key在redis数据库中是否存在, 0表示不存在,1表示存在。
5.3.3扩展命令(了解)
1)incr key 全称是:increment
将指定key的value原子性递增1,就相当于java中的++i。 如果该key不存在,其 初始值为0,在incr之后其值为1。如果value的值不能转成整型,如helllo,该操作将 执行失败并返回相应的错误信息。
上述的num2是不存在,如果key不存在,其初始值为0,在incr之后其值为1。
2)decr key
将指定key的value原子性递减1,就相当于java中的–i。 如果该key不存在,其 初始值为0,在decr之后其值为-1。如果value的值不能转成整型,如helllo,该操作将 执行失败并返回相应的错误信息。
5.4存储hash(哈希)
5.4.1概述
Redis中的Hash类型可以看成具有String Key和String Value的map容器,所以该类型非常适合于存储键值对的信息。如username、password和Age等。如果Hash中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个Hash可以存储4294967295个键值对。
5.4.2常用命令
1)赋值
hset key field value:为指定的key设定field/value对(键值对)。
hmset key field value [field2 value2 …] :设置key中的多个field/value。
注:如果key重复了,那key的值是不会被覆盖。
2)取值
hget key field:返回指定的key中的field的值。
hmget key field:获取key中的多个field的值。
hgetall key:获取key中所有的field-value。
3)删除
hdel key field [field …] :可以删除一个或多个字段,返回值是被删除的字段个数。
del key :删除整个hash。
通过keys命令,查看当前 redis中所有的key
\
5.4.3扩展命令
hincrby key field increment:增加数字
hkeys key:获取所有的字段。
hvals key:获得所有的value
5.5存储list(列表)
5.5.1概述
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
5.5.2常用命令
1)添加元素
lpush key value1 [value2…] :将元素添加到列表的头部
rpush key value1 [value2…] :将元素添加到列表的尾部
linsert key before|after 参考value 新value:在参考值前面或后面添加元素
2)访问元素
lrange key start stop :获取指定下标范围的元素
lindex key index:通过下标获取元素
llen key:获取列表长度
3)修改元素
lset key index value:将元素设置到列表指定位置
4)删除元素
lpop key :移除列表中的第一个元素(头部),并返回
rpop key :移除列表中的最后一个元素(尾部),并返回
lrem key count value : 移除列表元素,指定个数和值
COUNT 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
5)清空元素
ltrim key start end :作用是只保留一个范围的元素,从start到end,但是start>end,则清空
清空:
5.6存储set(集合)
5.6.1概述
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
5.6.2常用命令
1)添加元素
sadd key member1 [member2…]:将元素添加到集合中
2)查看集合信息
scard key :查看当前集合中元素数量
smembers key:查看当前集合中所有元素
3)判断元素是否存在
sismember key member:判断元素是否在集合中
4)移除元素
srem key member1 [member2…]:删除多个指定元素
5.7存储sorted set(有序集合)
5.7.1概述
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
5.7.2常用命令
1)添加元素
zadd key score1 member1 [score2 member2…]:将元素添加到集合中,并记录分数
2)查看集合信息
zcard key :查看当前集合中元素数量
zrange key start end [withscores]:升序查看当前集合索引范围的元素(可以指定是否返回分数)
zrevrange key start end [withscores]:降序查看当前集合索引范围的元素
3)移除元素
zrem key member1 [member2…]:删除多个指定元素
5.8更多命令
参考网站:
https://www.redis.net.cn/order/
或参考PDF文档
6.使用Jedis操作Redis
6.1Jedis简介
Redis 不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、PHP、Node.js、GO等。
在官方网站里列一些java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推荐使用Jedis和Redisson。在企业中用的最多的就是Jedis,下面我们重点就学习一下Jedis。Jedis同样也是托管在github上,地址:https://github.com/xetorthio/jedis。
6.2使用Maven项目添加Jedis
6.2.1 创建maven项目,在pom.xml添加jedis引用。
1.<!--START ==== Jedis所需要的依赖 ==== START-->
2.<dependency>
3. <groupId>org.apache.commons</groupId>
4. <artifactId>commons-pool2</artifactId>
5. <version>2.3</version>
6.</dependency>
7.
8.<dependency>
9. <groupId>redis.clients</groupId>
10. <artifactId>jedis</artifactId>
11. <version>2.7.2</version>
12.</dependency>
13.<!--END ==== Jedis所需要的依赖 ==== END-->
6.2.2创建junit测试
1.public class JedisDemo01 {
2.
3. @Test
4. public void testJedis() {
5. Jedis jedis = new Jedis("192.168.10.131", 6379);
6. jedis.auth("654321"); //密码
7. jedis.set("uname", "zhangsan"); //将kye为uname值为zhangsan存入redis数据库中。
8. String value = jedis.get("uname"); //取出key为uname的值
9. System.out.println("uanme的值为:"+ value);
10. jedis.del("uname");
11. jedis.expire("uname", 6);
12. long seconds = jedis.ttl("uname");
13. boolean isfalg = jedis.exists("uname");
14. jedis.close();
15. }
16.}
6.2.3常见错误
原因是服务器要求密码,但是客户端没有提供,解决方法是添加jedis.auth(“密码”);
原因是服务器不需要密码,但是设置了密码,删除jedis.auth(“密码”);即可
6.3Jedis连接池
Jedis连接池
7.Redis持久化
7.1概念
Redis强劲的性能主要由于所有数据都在内存中,但内存有一个特性,进程关闭或突然断电就会丢失数据,可能会影响我们的业务正常进行。所以在部分情况下,我们希望既能保证数据读写速度,又不会因为突然断电丢失重要数据。
于是Redis提供了将数据从内存中同步到硬盘中的方式,让我们在重启Redis服务时能恢复数据到内存中。这一过程我们称为持久化,Redis持久化的方式分为两种,RDB和AOF。
7.2RDB方式
7.2.1RDB原理说明
RDB方式是通过快照(snapshotting)完成的。当符合一定条件的时候Redis会将内存中的数据生成一份副本保存在硬盘上(默认文件名为dump.rdb,可在配置文件中修改),这个过程称为快照。
快照文件配置:
Redis会在以下几种情况下生成快照:
根据配置规则进行自动快照。
用户执行SAVE和BGSAVE命令时。
执行FLUSHALL时。
执行复制(replication)时。
7.2.2根据配置规则进行自动快照(重点)
Redis在配置文件中可以配置自动快照,预设的条件如下:
每条快照条件占一行,并以save命令开头,可以同时存在多个条件,条件直接是“或”的关系,也就是只要有一个满足就立刻执行快照。
语法:
save 秒 更新数
解释:save 900 1表示当在900秒(15分钟)之内有一个或以上的键更新了则进行快照。save 300 10表示当在300秒(5分钟)之内有10个或以上的键更新则进行快照。
7.2.3用户执行SAVE和BGSAVE命令
7.2.3.1SAVE命令 (了解)
同步进行快照操作,快照过程中会堵塞其他客户端请求,直到快照操作完成,当内存数据量较多时,会导致Redis长时间不响应,应避免在生产环境中使用此命令。
7.2.3.2BGSAVE命令(重点)
BG代表Background,也是就后台异步进行快照,快照过程中还能继续响应客户端的请求。执行BGSAVE后Redis会立刻返回OK,如果想要知道是否执行完成,可以执行LASTSAVE命令获取上一次保存的时间戳。
注意自动快照使用的就是后台异步模式。
7.2.4执行FLUSHALL(危险操作)
该命令清空整个Redis数据库键值对,而且只要配置了自动快照并且执行命令时内存数据库中存在有数据,立刻会触发自动快照将硬盘上的数据也清除。所以这是个十分危险的操作,谨慎使用!
对应的还有一个FLUSHDB命令,只清除当前数据库存放的数据,且不会触发快照,相对安全。
7.2.5执行复制
当设置了主从模式(集群),Redis会在复制初始化时自动快照,即使没有设置自动快照条件。
7.2.6快照原理
7.3AOF方式
7.3.1AOF概念
AOF(Append Only File), AOF可以将Redis执行的每一条写命令追加到硬盘文件中。会降低Redis的性能,但是降低了突然中止程序造成的数据丢失。
7.3.2开启AOF
默认情况下AOF是关闭的,通过配置文件appendonly启用,appendfilename配置写入文件名。
7.3.3AOF原理
AOF是以纯文本的形式记录了Redis执行的写命令(读取命令不记录,因为没必要),例如如下命令:
生成aof文件内容如下:
其实前两条命令会被第三条命令覆盖掉,所以是多余的,可以通过配置重写去掉:
也可以使用bgRewriteAOF命令主动重写AOF文件。
重写后文件如下:
8.Redis集群
8.1为什么需要Redis集群
8.1.1高可用
随着互联网的发展,并发量越来越大,Redis缓存可以作为数据库的查询屏障,减少数据库的查询。但是单机Redis服务器容易发生故障导致服务中断,一旦缓存服务中断,原本极少的数据库查询,将变成所有的数据查询都从数据库的直接查询,数据库也会立刻崩溃,最终导致系统拒绝服务,对公司造成严重损失。
8.1.1.1什么是高可用?
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。
假设系统一直能够提供服务,我们说系统的可用性是100%。
如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。
很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。
8.1.1.2如何实现高可用?
单点是系统高可用的大敌,单点往往是系统高可用最大的风险和敌人,应该尽量在系统设计的过程中避免单点。方法论上,高可用保证的原则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其他备份能够顶上。
所以保证系统高可用,架构设计的核心准则是:冗余。
8.1.2读写分离
单机Redis服务既要执行读操作,又要执行写操作,随着并发数量逐步提升,原本可以10w读写的Redis可能变成读5w+写5w,制约了单机的性能,如果能够将读操作和写操作分开,那么就可以提升单机Redis的性能。
8.1.3故障转移
仅仅冗余是不够的,假如某个Redis主机发生了故障,每次出现故障需要人工介入恢复(重启Redis)势必会增加系统的不可服务时间。所以,又往往是通过“自动故障转移”来实现系统的高可用。
8.1.4突破容量瓶颈
单机Redis受内存限制,容量会遇到瓶颈,比如一台机器最多16G内存,放不下就会拒绝写入命令或者丢弃数据。如果系统有40G左右的数据要放入缓存如何处理呢?那么Redis支持的Cluster集群就能够解决这个问题。
8.2主从复制
8.2.1概念
复制概念中分为两类数据库,一类是主数据库(master),一类是从数据库(slave),主数据库可以进行读写操作,并把写的操作同步给从数据库,一般从数据库是只读的。(读写分离)一个主数据库可以有多个从数据库,而一个从数据库只能属于一个主数据库。
8.2.2特点
主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
从数据库一般都是只读的,并且接收主数据库同步过来的数据
一个master可以拥有多个slave,但是一个slave只能对应一个master
slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
master挂了以后,不会在slave节点中重新选一个master
8.2.3复制原理
slave启动成功连接到master后会主动发送一个sync(同步)命令
Master接到命令启动后台的存盘进程(RDB持久化),同时收集持久化期间所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步(初始化,全量)
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
8.2.4配置一主二从
8.2.4.1为了快速搭建,可以编写一个创建配置文件的shell批处理文件。
8.2.4.2执行文件创建从数据库
1.# -------------------------- 主从复制模式配置 ----------------------------
2.# 执行批处理创建从库
3.sh ~/redis-new.sh 7001 123456 654321
4.
5.
6.# 启动主从复制
7./etc/init.d/redis_6379 restart
8.
9.# 可以参考redis_6379文件编写自启动
10./usr/local/redis/bin/redis-server /usr/local/redis/bin/redis_7001.conf --slaveof 127.0.0.1 6379
8.3哨兵模式
8.3.1什么是哨兵
顾名思义,哨兵就是放哨的兵,为了保证系统的高可用性,时刻监控着Redis的运行状况,功能主要包含两个:
1、监控主数据库和从数据库是否正常工作。
2、主数据库出现故障时自动将从数据库转换为主数据库。(故障转移)
哨兵是一个独立的进程。
8.3.2单机哨兵部署
8.3.2.1为了快速搭建,编写一个shell批处理文件用于创建哨兵
8.3.2.2搭建图示
8.3.2.3配置单机版哨兵
核心配置文件:redis.conf配置主从, sentinel.conf配置哨兵
8.3.2.4测试哨兵
1、查看哨兵日志
tail -100f /usr/local/redis/log/sentinel/sentinel.log
2、下线主机,模拟宕机
redis-cli.exe -h 192.168.160.141 -p 6379 -a 123456 shutdown
3、观察哨兵日志
1.主观下线(sdown)
当某个哨兵心跳检测master超时后,则认定其sdown
+sdown master mymaster 127.0.0.1 6379
2.客观下线(odown)
当认定sdown的哨兵数>=quorum时,则master下线事实最终成立,即odown
+odown master mymaster 127.0.0.1 6379 #quorum 1/1
3.选举哨兵leader
各哨兵协商,选举出一个leader,由其进行故障转移操作
+vote-for-leader fa115db8b28cb9437d1327fed1a5f1322e2bb5df 1
- 故障转移
选择一个slave作为新的master, 并将其他节点设置为新master的slave (刚才已下线的老master的配置文件也会被设置slaveof…)
+switch-master mymaster 127.0.0.1 6379 127.0.0.1 7004
5.重启故障机,自动变为从机
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis_6379.conf
查看哨兵日志,增加如下一条:
*
+convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster
127.0.0.1 7004
8.3.3经典模式(一主二从三哨兵)
8.3.3.1搭建图示
8.3.3.2配置脚本
8.4高可用cluster集群