一.数据库的分类
1.关系型数据库:Oracle,MySQL,SqlServer,DB2
2.NoSql数据库:
(1)key-value存储数据库:这一类的数据库主要会使用一个哈希表.这个表中有一个特定的健和一个指针指向特定的数据.如Redis
(2)列存储数据库:这部分数据库通常是用来应付分布式存储的海量数据.键仍然存在.但是它们的特点是指向多个列.如HBase
(3)文档性数据库:该类型的数据模型是版本化的文档.半结构化的文档以特定的格式存储.比如JSON.而且文档型数据库比键值数据库的查询效率高.如CouchDB,MngoDB
(4)图形数据库:图形结构的数据库通其他行列以及刚性结构的SQL数据库不同.它是使用灵活的图形模型.并且能拓展到多个服务器上
3.非关系型数据库特点:
(1).数据模型比较简单.(主要)
(2).需要灵活性更强的应用系统
(3).对数据库性能要求较高(主要)
(4).不需要高度的数据一致性(主要)
(5).对于给定key,比较容易映射复杂值的环境.
二.redis的概述
1.什么是redis:
Redis简介:
是以key-value形式存储,和传统的关系型数据库不一样.不一定遵循传统数据库的一些基本要求.(非关系型的,分布式的,开源的,水平可拓展的)
优点:
对数据高并发读写(直接是内存中进行读写的)
对海量数据的高效率存储和访问
对数据的可拓展性和高可用性.
缺点:
redis(ACID处理非常简单)
无法做太复杂的关系数据库模型
Redis是以key-value store存储.
键可以包含:(string)字符串,哈希,(list)链表,(set)集合,(zset)有序集合.这些数据集合都指出push/pop,add/remove及取交集和并集以及更丰富的操作.redis支持各种不同方式排序,为了保证效率,数据都是缓存在内存中.它可以从周期性的把更新的数据写入到磁盘或者把修改操作写入追加的文件中.
2.redis的优势
性能极高 – Redis能支持超过 10W次每秒的读写频率。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe(发布/订阅), 通知, key 过期等等特性。
3.redis在线入门 : http://try.redis.io/
redis 中文资料站: http://www.redis.cn/
二.redis的安装(linux下)
- 下载所需的 redis 安装包,并上传至服务器(当前 Redis 的最新稳定版为 4.0.11,可前往 https://www.redis.cn 进行下载)
- 解压安装包 tar -zxvf redis.x.tar.gz
- 将解压后的文件夹移动至 /usr/local 中 mv redis.x /usr/local/redis
- 进入 redis 根目录 cd /usr/local/redis.x
5.安装gcc,yum install gcc - 执行编译与安装
进入到redis目录,执行make
进入到src目录,执行make install
7.建立两个文件夹存放redis命令和配置文件
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/bin
8.进入到安装目录中的redis目录下
cp redis.conf /usr/local/redis/etc/
9.把redis目录/src里的mkreleasehdr.sh、redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-server文件移动到bin下,命令:
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-server /usr/local/redis/bin
10.启动Redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
11.启动时可以指定配置文件,然后修改redis.conf里的daemonize改为yes
12.验证启动是否成功:
ps -ef | grep redis 查看是否有redis服务或者查看端口:netstat -tunpl | grep 6379
redis的常用配置:
port:服务的端口号,默认为6379
daemonize:后台运行,值为yes | no 默认为no
requirepass:密码,默认是没有密码
protected-mode:保护模式,值为yes | no默认是yes,不能远程访问该redis服务,如果需要远程访问,则该为no。
bind:绑定的IP地址,默认是绑定本机地址127.0.0.1,如果需要其他IP能访问到该redis服务,则在这个属性添加IP地址,或者直接把该属性注释掉,这样所有的IP地址都可以访问。
如何开启远程连接?
1、把redis.conf配置文件的protected-mode属性修改为no,关闭redis的保护模式。
2、把redis.conf配置文件的bind属性注释掉,让所有远程的IP都可以访问到该redis的服务。
3、由于开启了远程连接,所以有必要设置redis的访问密码,不然的话安全性太低,在redis.conf配置文件中模式是没有密码这行配置的,需要添加密码的话则新增该属性:requirepass,属性值为密码字符串。
4、开启6379网络端口,并重新加载防火墙规则。
三.redis的数据类型
(一).String
String类型包含多种类型的特殊类型,并且是二进制安全的.比如序列化的对象进行存储,比如一张图片进行二进制存储.,比如一个简单的字符串,数值等等.
set和get方法:
设置值:set name haha
取值:get name(设置name多次会覆盖)
删除值:del name
使用setnx(not exist)
name如果不存在进行设置,存在就不进行设置了.返回0
使用setex(expired)
setex color 10 red 这是color的有效时间为10秒,10秒后返回nil(在redis里nil表示空)
使用setrange替换字符串
set email 1234567@qq.com
setrange email 8 yy(8表示从第几位开始替换,后面跟上替换的字符串)
使用一次性设置多个和获取多个值mset,mget方法
mset key1 haha key2 heihei key3 male
mget key1,key2,key3
对应也有msetnx和mget方法
一次性设置和取值的getset
set key4 cc
getset key4 xx 返回旧值和设置新值的方法
incr和decr方法:对于某一值进行递增和递减(原子性的,安全)
incrby和decrby 对某个值进行制定长度的递增和递减
append[name]方法:字符串追加方法
strlen[name]方法:获取字符串的长度
应用场景
缓存功能:字符串最经典的使用场景,redis作为缓存层,Mysql作为储存层,绝大部分请求数据都是
redis中获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。
计数器:许多运用都会使用redis作为计数的基础工具,他可以实现快速计数、查询缓存的功能,
同时数据可以一步落地到其他的数据源。
如:视频播放数系统就是使用redis作为视频播放数计数的基础组件。
共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,
用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,
在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息
都直接从redis中集中获取。
限速:处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问,
会限制用户每分钟获取验证码的频率。
二.Hash
Hash类型是String类型的field和value的映射表.或者说是一个String集合.它特别适合存储对象,相比较而言,讲一个对象存储在Hash类型里要比存储在String类型里占用更少的内存空间,并方便存储整个对象
例如: hset myhash field1 hello(含义是hset是hash集合,myhash是集合名字 field1是字段名 hello为其值) 使用hget myhash field1或者内容.也可以存储多个值.
hmset 可以进行批量存储多个键值对,hmset myhash sex nan addr guanzhou ,也可以使用hmget进行批量获取多个键值对.
同样也有hsetnx和setnx相同方法
hincrby集合递增
hexists是否存在key,如果存在返回1 ,不存在返回0
hlen返回hash集合里面所有的键数值
hdel删除指定hash的field
hkeys 返回hash所有的字段
hvals返回hash的所有value
hgetall 返回hash里所有的key 和 value
应用情景
哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。
所以常常用于**用户信息**等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,
而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而redis去模拟关系型复杂查询
开发困难,维护成本高
三.List
Redis中的List类似Java中的queue,也可以当做List来用.
List类型是一个链表结构的集合,其主要功能有push,pop,获取元素等.更详细的说,List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,list的设计非常简单精巧,即可以作为栈,又可以作为队列.满足绝大多数需求.
lpush方法:从头部加入元素(栈) 先进后出
例如: lpush list1 “hello” lpush list1 “world”
Lrange list1 0 -1(表示从头取到末尾)
rpush方法:从尾部加进入元素(队列) 先进先出
例如: rpush list2 “guagnzhou” rpush list2 “wolfcode”
lrange list2 0 -1
linsert方法:插入元素
例如:linsert list3 before [集合的元素] [插入的元素]
lset方法:讲指定下标的元素替换掉
lset list4 0 “b”
lrem方法:删除元素,返回删除的个数
ltrim方法:保留指定key的值范围内的数据
lpop方法:从list的头部删除元素,并返回删除元素
rpop方法:从list的尾部删除元素,并返回删除元素
rpoplpush方法:第一步从尾部删除元素,然后第二步从头部加入元素
lindex方法:返回名称为key的list中index位置的元素
llen方法:返回元素的个数
应用情景
1.消息队列: redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端是用lupsh从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性.
2.文章列表:每个用户都有属于自己的文章列表,现在需要分页展示文章列表,此时可以考虑使用列表,列表不但有序,同时支持按照索引范围获取元素。
3.朋友圈点赞;
规定:朋友圈内容的格式:
1,内容: user:x:post:x content来存储;
2,点赞: post:x:good list来存储;
1,创建一条朋友圈内容:set user:1:post:91 'hello redis';
2,点赞:
lpush post:91:good '{id:1,name:yaya,img:xxx.jpg}'
lpush post:91:good '{id:2,name:yiyi,img:xxx.jpg}'
lpush post:91:good '{id:3,name:fly,img:xxx.jpg}'
3,查看有多少人点赞: llen post:91:good
4,查看哪些人点赞:lrange post:91:good 0 -1
4.回帖
1,创建一个帖子:set user:1:post:90 'wohenshuai'
2,创建一个回帖:set postreply:1 'nonono'
3,把回帖和帖子关联:lpush post:90:replies 1
4,再来一条回帖:set postreply:2 'hehe'
lpush post:90:replies 2
5,查询帖子的回帖:lrange post:90:replies 0 -1
get postreply:2
四.Set
Set集合是string类型的无序集合,set是通过hashtable实现的,对集合我们可以取交集,并集,差集.
sadd方法:向名称为key的set中添加元素
小结:set集合不允许重复元素 smembers查看set集合的元素
srem方法:删除set集合元素
spop方法:随机返回删除的key
sdiff方法:返回两个集合中不同的元素(哪个集合在前面就以哪个集合为标准)
sdiffstore方法:将返回的不同元素存储到另外一个集合里
小结:这里是把set1和set2的不同元素(以set1为准),存储到set3集合里
sinter方法:返回集合的交集
sinterstore方法,返回交集结果存入set3中
sunion方法:取并集
sunionstore方法,取得并集,存入set3
smove方法:从一个set集合移动到另外一个set集合里.相当于剪切复制
scard方法:查看集合里元素个数
sismember方法:判断某元素是否集合中的元素
srandmember方法:随机返回一个元素
应用场景
1,去重;
2,抽奖;
1,准备一个抽奖池:sadd luckydraw 1 2 3 4 5 6 7 8 9 10 11 12 13
2,抽3个三等奖:spop luckydraw 3
3,抽2个二等奖:spop luckydraw 2
4,抽1个二等奖:spop luckydraw 1
3,做set运算(好友推荐)
1,初始化好友圈 sadd user:1:friends 'user:2' 'user:3' 'user:5'
sadd user:2:friends 'user:1' 'user:3' 'user:6'
sadd user:3:friends 'user:1' 'user:7' 'user:8'
2,把user:1的好友的好友集合做并集;
user:1 user:3 user:6 user:7 user:8
3,让这个并集和user:1的好友集合做差集;
user:1 user:6 user:7 user:8
4,从差集中去掉自己
user:6 user:7 user:8
5,随机选取推荐好友
五.ZSet
zadd 向有序集合中添加一个元素,该元素如果存在,则更新顺序.
在重复插入的时候,会根据顺序属性更新.
zrange zset1 [start] [stop] 根据分数从小到大排序
zrevrange zset1 [start] [stop] 根据分数从大到小排序
zrem 删除名称为key的zset中的元素member
zincrby 以指定值去自动递增或者减少,用法和之前的incryby类型
zrangebyscore指定区间范围的数据进行返回
zremrangebyrank zset1 [start] [stop] 删除指定位置的元素.
zremrangebysocre zset1 [min] [max] 删除指定分数范围的数据
zrank zet1 [member] 返回排序索引从小到大排序(索引排序之后再找索引)
注意:一个顺序号 一个是所有 zrank返回的是索引
zrevrank zet1 [member] 返回排序索引 从大到小(降序之后再找索引)
zcard zset1 返回集合里所有元素的个数
zcount 返回集合中score在给定区间中的数量
应用情景
排行榜:有序集合经典使用场景。如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:
按照时间、按照播放量、按照获得的赞数等。
四.redis 进阶
(1).redis高级命令
返回满足的所有键 keys * (可以模糊查询)
exists 是否存在指定key
expire 设置某个key的过期时间.使用ttl查看剩余时间
persist 取消过期时间
select 选择数据库 数据库为0到15(一共16个数据库) 默认进入的是0数据库
move [key] [数据库下标] 讲当前数据中的key转移到其他数据库中
randomkey 随机返回数据库里的一个key
rename重命名key
echo 打印名
dbsize 查看数据库的key数量
info 获取数据库信息
config get 实时传储收到的请求(返回相关的配置信息)
config get * 返回所有配置
flushdb 清空当前数据库,flushall清空所有数据库
(2).redis安全性
因为redis速度非常快,所以在一台比较好的服务器下,一个外部用户在一秒内可以进行15w次的密码尝试,这意味你需要设定非常强大的密码来方式暴力破解.
vi编辑redis.conf文件,找到下面进行保存修改
requiredpass [密码]
重启服务器 pkill redis-server
再次进入127.0.01:6379>keys *
(error)NOAUTH Authentication required.
会发现没有权限进行查询auth [密码]
输入密码则成功进入
每次进入的时候都需要输入免密,还有种简单的方式:
直接登录授权/usr/local/redis/bin/redis-cli -a [密码]
(3).redis事务
Redis的事务非常简单,使用方法如下:
首先是使用multi方法打开事务,
然后进行设置,这时设置的数据会放到队列里进行保存.
最后使用exec执行.把数据依次存储到redis中.
使用discard方法取消事务.
(4).redis持久化机制
Redis是一个支持持久化的内存数据库,也就是说redis需要经常讲非常中的数据同步到硬盘来保证持久化.
Redis持久化的两种方式:
1.RDB方式
1.snapshotting(快照)默认方式.将内存中以快照的方式写入到二进制文件中.默认为dump.rdb.可以配置设置自动做快照持久化方式.我们可以配置redis在n秒内如果超过m个key就修改自动做快照.
Snapshotting设置:
save 900 1 #900秒内如何超过1个Key被修改则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
save 60 10000
2.AOF方式
2.append-only file (缩写aof)的方式,由于快照方式是在一定时间间隔做一次,所以可能发生reids意外down的情况就会丢失最后一次快照后的所有修改的数据.aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到命令中,当redis重新启动时会重新执行文件中保存的写命令来在内存中重建这个数据库的内容.这个文件在bin目录下:appendonly.aof
aof不是立即写到硬盘中,可以通过配置文件修改强制写到硬盘中.
aof设置:
appnedonly yes //启动aof持久化方式有三种修改方式
#appendfsync always//收到命令就立即写到磁盘,效率最慢.但是能保证完全的持久化
#appendfsync everysec//每秒写入磁盘一次,在性能和持久化方面做了很好的折中
#appendfsync no //完全以依赖os 性能最好,持久化没保证
(5).redis发布与订阅模式
Redis提供了简单的发布订阅功能
使用subscribe [频道] 进行订阅监听
使用publish [频道] [发布内容进行发布消息广播]
(6).redis主从复制
主从复制(Redis2.0就有的功能,主要实现读写分离的):
1.master可以拥有多个slave
2.多个slave可以连接同一个master外,还可以连接其他的slave
3.主从复制不会阻塞master,在同步数据时master可以继续处理client请求
4.提供系统的伸缩性
主从复制过程
1.slave与master建立连接,发送sync同步命令
2.Master会开启一个后台进程,将数据库快照保存到文件中.同时master主进程会收集新的写命令并缓存
3.后台完成保存后,就将文件发给slave
4.Slave将此文件保存到硬盘上
主从复制配置:
1.clone服务器之后修改slave的ip地址
2.修改配置文件/usr/local/redis/etc/redis.conf
3.第一步 slaveof <masterip><mastport>
4.第二步: masterauth <master-password>
使用Info查看role角色即可知道是主服务或从服务
(需要修改一下bind 0.0.0.0 和 protected-mode no)
五.redis 实际运用
(1).Jedis基本使用
1.导入Jedis相关的依赖:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2,普通API
@Test
public void testTool(){
GenericObjectPoolConfig config = new GenericObjectPoolConfig();
最大连接数, 默认8个
config.setMaxTotal(100);
最大空闲连接数, 默认8个
config.setMaxIdle(20);
//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
config.setMaxWaitMillis(-1);
//在获取连接的时候检查有效性, 默认false
config.setTestOnBorrow(true);
JedisPool pool = new JedisPool(config,"192.168.133.128",6379,5000);
Jedis j = pool.getResource();
String name = j.get("name");
System.out.println(name);
j.close();
pool.close();
pool.destroy();
}
3.集成SpringBoot
导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
通过redisTemplete来操作
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
(2).集群环境搭建
Redis3.0之前,提供了Sentinel工具来监控各Master的状态.如果Master异常,会做主从切换.
将slave作为master,将master作为slave.其配置也是稍微得复杂.
并且各方面表现一般.现在redis3.0已经支持集群的容错功能,而且非常简单.下面我们来进行学习下redis3.0如何搭建集群.
1.搭建步骤
集群搭建:至少要三个master
第一步:创建一个文件夹redis-cluster,然后在其下面分别创建6个文件夹如下:
1.mkdir -p /usr/local/redis-cluster
2.mkdir 7001,mkdir 7002,mkdir 7003,mkdir 7004,mkdir 7005,mkdir 7006
第二步:把之前的redis.config配置文件分别copy到700*下,进行修改各个文件内容,修改如下:
daemonize yes
port 700*
bind 192.168.122.128(必须要绑定当前机器)
dir /usr/local/redis-cluster/700*/(指定数据存放文章,必须要指定不同的目录位置,不然会丢失数据)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes700*.conf
(每一个节点都对应一个文件,整个集群是一个整理,一个机器应该知道另外五台机器的存在)
cluster-node-timeout 5000
appendonly yes
第三步:把修改后的配置文件,分别copy到各个文件夹下,注意每个文件都需要修改端口,并且nodes文件也要不相同.
第四步:由于redis集群需要使用ruby命令,所以我们需要安装ruby
1.yum install ruby
2.yum install rubygems
3.gem install redis(安装redis和ruby的接口
第五步:分别启动6个redis实例.然后检查是否启动成功
1./usr/local/redis/bin/redis-server /usr/local/redis-cluster/700*/redis.conf
第六步:首先到redis3.2.9的安装目录下,然后执行redis-trib.rb命令
1) cd /usr/local/redis-3.2.9/src
2) ./redis-trib.rb create --replicas 1 192.168.122.128:7001 192.168.122.128:7002 192.168.122.128:7003 192.168.122.128:7004 192.168.122.128:7005 192.168.122.128:7006
(这里面的1 表示的是主从的比值.)
第七步:到此为止我们集群搭建成功,进行认证:
1.连接任意一个客户端即可:.redis-cli -c -h -p(-c表示集群模式,指定ip和端口)如 /usr/local/redis/bin/redis-cli -c -h 192.168.122.128 -p 700*
2.进行认证 cluster info(查看集群信息),cluster nodes(查看节点列表)
3.进行数据操作认证
4.关闭集群则需要逐个进行关闭,使用命令:
/usr/local/redis/bin/redis-cli -c -h 192.168.122.128 -p 700* shutdown
2.安装RVM
yum install centos-release-scl-rh //会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源
yum install rh-ruby23 -y //直接yum安装即可
scl enable rh-ruby23 bash //必要一步
ruby -v //查看安装版本
3.集群命令
create:创建一个机器的环境host1:port1,....,hostN:portN
call:可以执行redis名
add-node:讲一个节点添加到集群中,第一个参数为新节点的ip:port,第二个参数为集群中的任意一个已经存在的及节点ip:pot
del-node:移除一个节点
reshard:重新分片
check:检查集群状态
4.客户端命令
//集群(cluster)
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
//节点(node)
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
//槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
//键 (key)
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
5.水平扩展
添加节点
我们新建两个服务,按照之前搭建的集群方式新建两个节点(一主一从)
Master:7007 Slave:7008
添加主节点:
步骤一:创建7007/7008文件夹.拷贝redis.config文件到对应的7007,7008目录.修改配置文件.
步骤二:使用add-node命令.(第一个参数是需要添加的节点,第二个节点是目前已经在集群中的节点)
/usr/local/redis-3.2.9/src/redis-trib.rb add-node 192.168.122.128:7007 192.168.122.128:7001
(如果报错,需要把对应700*目录下的除了redis.config之外的文件都删除)
步骤三:分配slot槽.使用redis-trib命令,找到集群中的任意一个主节点,对其进行重新分片工作.
/usr/local/redis-3.2.9/src/redis-trib.rb reshard 192.168.122.128:7001
添加从节点:
步骤1:将7008节点添加到集群中:
/usr/local/redis-3.2.9/src/redis-trib.rb add-node 192.168.122.128:7008 192.168.122.128:7001
步骤2:进入7008节点之后,关联master的id,变成从节点
cluster replicate <master节点的ID>
删除节点
步骤一:删除从节点7008,输入del-node命令,指定删除节点ip和端口,以及节点id
/usr/local/redis-3.2.9/src/redis-trib.rb del-node 192.168.122.128:7008 2f84a20a1afa3e21854ce7f102ded99581578b92
步骤二:删除主节点7007.因为主节点里面是有分配slot槽的,所以我们这里必须先把7007里的slot槽放入到其他的可用主节点去,然后再进行移除节点操作才行,不然会出现数据丢失问题
/usr/local/redis-3.2.9/src/redis-trib.rb reshard 192.168.122.128:7007
步骤三:删除主节点:
/usr/local/redis-3.2.9/src/redis-trib.rb del-node 192.168.122.128:7007 20e1b217db7d2b2180e6ba467ee609572d1be8e5