Redis,NoSql数据库
目录
1、Redis数据类型(重点)
a)String类型
b)Map(hash)类型
c)List类型
d)Set类型
e)SortedSet
2、Redis的持久化方案
a)Rbd方式
b)Aof方式
3、Redis的主从复制(读写分离)
正文
1Redis数据类型
1.1String
1.1.1命令
1.1.1.1赋值
语法:SET key value
127.0.0.1:6379> set test 123
OK
1.1.1.2取值
语法:GET key
127.0.0.1:6379> get test
"123“
1.1.1.3取值并赋值
语法:GETSET key value
127.0.0.1:6379> getset s2 222
“111”
127.0.0.1:6379> get s2
“222”
1.1.1.4设置/获取多个键值
语法:
MSET key value [key value …]
MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
“v1”
127.0.0.1:6379> mget k1 k3
- “v1”
- “v3”
1.1.1.5删除
语法:DEL key
127.0.0.1:6379> del test
(integer) 1
1.1.1.6数值增减
incr 增加一
incrby num 3 加3
decr 减一
decrby num 3 减3
递增数字
当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
语法:INCR key (increment)
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3
增加指定的整数
语法:INCRBY key increment
127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9
递减数值
语法:DECR key
127.0.0.1:6379> decr num
(integer) 9
127.0.0.1:6379> decr num
(integer) 8
减少指定的整数
语法:DECRBY key decrement
127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decrby num 3
(integer) -1
1.1.1.6.1向尾部追加值
APPEND的作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
语法:APPEND key value
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str
“hello world!”
1.1.1.6.2获取字符串长度
STRLEN命令返回键值的长度,如果键不存在则返回0。
语法:STRLEN key
127.0.0.1:6379> strlen str
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str
(integer) 5
1.1.2应用
1.1.2.1自增主键
语法:incr 主键名
1.2Hash 散列类型
1.2.1redis hash介绍
hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。如下:
string:
键 值
1.2.2命令
1.2.2.1赋值
HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
一次设置一个字段值
语法:HSET key field value
127.0.0.1:6379> hset user username zhangsan
(integer) 1
一次设置多个字段值
语法:HMSET key field value [field value …]
127.0.0.1:6379> hmset user age 20 username lisi
OK
当字段不存在时赋值,类似HSET,区别在于如果字段存在,该命令不执行任何操作
语法:HSETNX key field value
127.0.0.1:6379> hsetnx user age 30 如果user中没有age字段则设置age值为30,否则不做任何操作
(integer) 0
1.2.2.2取值
一次获取一个字段值
语法:HGET key field
127.0.0.1:6379> hget user username
"zhangsan“
一次获取多个字段值
语法:HMGET key field [field …]
127.0.0.1:6379> hmget user age username
- “20”
- “lisi”
获取所有字段值
语法:HGETALL key
127.0.0.1:6379> hgetall user
- “age”
- “20”
- “username”
- “lisi”
1.2.2.3删除字段
删除一个或多个字段,返回值是被删除的字段个数
语法:HDEL key field [field …]
127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1
1.2.2.4增加数字
语法:HINCRBY key field increment
127.0.0.1:6379> hincrby user id 2 将用户的编号加2
(integer) 22
127.0.0.1:6379> hget user age 获取用户的年龄
"22“
1.2.2.5其它命令
1.2.2.5.1判断字段是否存在,true返回1,false返回0
语法:hexists key field
127.0.0.1:6379> hexists user age 查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name 查看user中是否有name字段
(integer) 0
1.2.2.5.2获取字段名或字段值
语法:
HKEYS key
HVALS key
127.0.0.1:6379> hmset user age 20 name lisi
OK
127.0.0.1:6379> hkeys user 键集
- “age”
- “name”
127.0.0.1:6379> hvals user 值集 - “20”
- “lisi”
1.2.2.5.3获取字段数量
语法:HLEN key
127.0.0.1:6379> hlen user
(integer) 2
1.2.3应用
1.2.3.1存储商品信息
商品字段
【商品id、商品名称、商品描述、商品库存、商品好评】
定义商品信息的key
商品1001的信息在 Redis中的key为:[items:1001]
存储商品信息
192.168.101.3:7003> HMSET items:1001 id 1001 name apple price 999.9
OK
获取商品信息
192.168.101.3:7003> HGET id
“3”
192.168.101.3:7003> HGETALL items:1001
- “id”
- “3”
- “name”
- “apple”
- “price”
- “999.9”
1.3List
Redis的list是采用来链表(底层设计是类似LinkedList结构)来存储的,所以对于redis的list数据类型的操作,是操作list的两端数据来操作的。
1.3.1命令
1.3.1.1向列表两端增加元素
向列表左边增加元素
语法:LPUSH key value [value …] left
127.0.0.1:6379> lpush list:1 1 2 3
(integer) 3
向列表右边增加元素
语法:RPUSH key value [value …] right
127.0.0.1:6379> rpush list:1 4 5 6
(integer) 3
1.3.1.2查看列表
LRANGE命令是列表类型最常用的命令之一,获取列表中的某一片段,将返回start、stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:“-1”代表最后边的一个元素。
语法:LRANGE key start stop
127.0.0.1:6379> lrange list:1 0 2
- “2”
- “1”
- “4”
127.0.0.1:6379> lrange list1 0 -1
1.3.1.3从列表两端弹出元素
LPOP命令从列表左边弹出一个元素,会分两步完成:pop()
第一步是将列表左边的元素从列表中移除
第二步是返回被移除的元素值。
语法:
LPOP key
RPOP key
127.0.0.1:6379> lpop list:1
"3“
127.0.0.1:6379> rpop list:1
"6“
1.3.1.4获取列表中元素的个数
语法:LLEN key
127.0.0.1:6379> llen list:1
(integer) 2
1.3.1.5其它命令
1.3.1.5.1删除列表中指定的值
LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
当count>0时, LREM会从列表左边开始删除。
当count<0时, LREM会从列表后边开始删除。
当count=0时, LREM删除所有值为value的元素。
语法:LREM key count value
1.3.1.5.2获得/设置指定索引的元素值
获得指定索引的元素值
语法:LINDEX key index
127.0.0.1:6379> lindex list:1 2
“1”
设置指定索引的元素值
语法:LSET key index value (替换)
127.0.0.1:6379> lset list:1 2 2
OK
127.0.0.1:6379> lrange list:1 0 -1
- “6”
- “5”
- “2”
- “2”
1.3.1.5.3只保留列表指定片段 (lrange分页,trim:截取某个区间的值)
指定范围和LRANGE一致
语法:LTRIM key start stop
127.0.0.1:6379> lrange l:list 0 -1
- “6”
- “5”
- “0”
- “2”
127.0.0.1:6379> ltrim l:list 0 2
OK
127.0.0.1:6379> lrange l:list 0 -1 - “6”
- “5”
- “0”
1.3.1.5.4向列表中插入元素
该命令首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
语法:LINSERT key BEFORE|AFTER pivot value
127.0.0.1:6379> lrange list 0 -1
- “3”
- “2”
- “1”
127.0.0.1:6379> linsert list after 3 4
(integer) 4
127.0.0.1:6379> lrange list 0 -1 - “3”
- “4”
- “2”
- “1”
1.3.1.5.5将元素从一个列表转移到另一个列表中
语法:RPOPLPUSH source destination
127.0.0.1:6379> rpoplpush list newlist
“1”
127.0.0.1:6379> lrange newlist 0 -1
- “1”
127.0.0.1:6379> lrange list 0 -1 - “3”
- “4”
- “2”
1.3.2应用
1.3.2.1商品评论列表
思路:
在Redis中创建商品评论列表
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
定义商品评论列表key:
商品编号为1001的商品评论key【items: comment:1001】
192.168.101.3:7001> LPUSH items:comment:1001 ‘{“id”:1,“name”:“商品不错,很好!!”,“date”:1430295077289}’
1.4Set 集合类型
Set类型:无序(存取无序)、不可重复
list列表类型:存取有序、可重复
1.4.1命令
1.4.1.1增加/删除元素
语法:SADD key member [member …]
127.0.0.1:6379> sadd set a b c
(integer) 3
127.0.0.1:6379> sadd set a
(integer) 0
语法:SREM key member [member …]
127.0.0.1:6379> srem set c d
(integer) 1
1.4.1.2获得集合中的所有元素
语法:SMEMBERS key
127.0.0.1:6379> smembers set
- “b”
- "a”
1.4.1.3判断元素是否在集合中
语法:SISMEMBER key member
127.0.0.1:6379> sismember set a
(integer) 1
127.0.0.1:6379> sismember set h
(integer) 0
1.4.2运算命令
1.4.2.1集合的差集运算 A-B
属于A并且不属于B的元素构成的集合。
语法:SDIFF key [key …]
127.0.0.1:6379> sadd setA 1 2 3
(integer) 3
127.0.0.1:6379> sadd setB 2 3 4
(integer) 3
127.0.0.1:6379> sdiff setA setB
- “1”
127.0.0.1:6379> sdiff setB setA - “4”
1.4.2.2集合的交集运算 A ∩ B
属于A且属于B的元素构成的集合。
语法:SINTER key [key …]
127.0.0.1:6379> sinter setA setB
- “2”
- “3”
1.4.2.3集合的并集运算 A ∪ B
属于A或者属于B的元素构成的集合
语法:SUNION key [key …]
127.0.0.1:6379> sunion setA setB
- “1”
- “2”
- “3”
- “4”
1.4.3其它命令
1.4.3.1获得集合中元素的个数
语法:SCARD key
127.0.0.1:6379> smembers setA
- “1”
- “2”
- “3”
127.0.0.1:6379> scard setA
(integer) 3
1.4.3.2从集合中弹出一个元素
注意:由于集合是无序的,所以SPOP命令会从集合中随机选择一个元素弹出
语法:SPOP key
127.0.0.1:6379> spop setA
"1“
应用:抽奖
1.5Sortedset Sortedset又叫zset
Sortedset可排序的,但是唯一,存取无序。
Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。
1.5.1命令
1.5.1.1增加元素
向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
语法:ZADD key score member [score member …]
127.0.0.1:6379> zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
(integer) 3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer) 0
1.5.1.2获取元素的分数
语法:ZSCORE key member
127.0.0.1:6379> zscore scoreboard lisi
“97”
1.5.1.3删除元素
移除有序集key中的一个或多个成员,不存在的成员将被忽略。
当key存在但不是有序集类型时,返回一个错误。
语法:ZREM key member [member …]
127.0.0.1:6379> zrem scoreboard lisi
(integer) 1
1.5.1.4获得排名在某个范围的元素列表
获得排名在某个范围的元素列表
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:ZRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrange scoreboard 0 2
- “zhangsan”
- “wangwu”
- "lisi“
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)
语法:ZREVRANGE key start stop [WITHSCORES]
127.0.0.1:6379> zrevrange scoreboard 0 2
- " lisi "
- “wangwu”
- " zhangsan “
如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数
127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
- “zhangsan”
- “80”
- “wangwu”
- “94”
1.5.1.5获取元素的排名 (得到的是下标)
从小到大
语法:ZRANK key member
127.0.0.1:6379> ZRANK scoreboard lisi
(integer) 0
从大到小
语法:ZREVRANK key member
127.0.0.1:6379> ZREVRANK scoreboard zhangsan
(integer) 1
1.5.1.6其它命令
1.5.1.6.1获得指定分数范围的元素
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
limit:分页 与数据库一致
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 90 97 WITHSCORES
- “wangwu”
- “94”
- “lisi”
- “97”
127.0.0.1:6379> ZRANGEBYSCORE scoreboard 70 100 limit 1 2 - “wangwu”
- “lisi”
1.5.1.6.2增加某个元素的分数
返回值是更改后的分数
语法:ZINCRBY key increment member
127.0.0.1:6379> ZINCRBY scoreboard 4 lisi
"101“
1.5.1.6.3获得集合中元素的数量
语法:ZCARD key
127.0.0.1:6379> ZCARD scoreboard
(integer) 3
1.5.1.6.4获得指定分数范围内的元素个数
语法:ZCOUNT key min max
127.0.0.1:6379> ZCOUNT scoreboard 80 90
(integer) 1
1.5.1.6.5按照排名范围删除元素
语法:ZREMRANGEBYRANK key start stop 排名
127.0.0.1:6379> ZREMRANGEBYRANK scoreboard 0 1
(integer) 2
127.0.0.1:6379> ZRANGE scoreboard 0 -1
- “lisi”
1.5.1.6.6按照分数范围删除元素
语法:ZREMRANGEBYSCORE key min max 分数
127.0.0.1:6379> zadd scoreboard 84 zhangsan
(integer) 1
127.0.0.1:6379> ZREMRANGEBYSCORE scoreboard 80 100
(integer) 1
1.5.2应用
1.5.2.1商品销售排行榜
需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10
192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002
商品编号1001的销量加1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
商品销量前10名:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
Redis:
String
Key value(json)
Hash
Key field value
List
Key ……value
Set
Key ……value
Zset
Key ……score value
2Redis持久化方案
2.1Rdb方式
Redis默认的方式,redis通过快照来将数据持久化到磁盘中。
2.1.1设置持久化快照(备份)的条件
在redis.conf中修改持久化快照的条件(持久化数据的条件),如下:
2.1.2持久化文件存储的目录
在redis.conf中可以指定持久化文件存储的目录
2.1.3Rdb问题
一旦redis非法关闭,那么会丢失最后一次持久化之后的数据。
如果数据不重要,则不必要关心。
如果数据不能允许丢失,那么要使用aof方式。
2.2Aof方式
Redis默认是不使用该方式持久化的。Aof方式的持久化,是操作一次redis数据库,则将操作的记录存储到aof持久化文件中。
第一步:开启aof方式的持久化方案
将redis.conf中的appendonly改为yes,即开启aof方式的持久化方案。
Aof文件存储的目录和rdb方式的一样。
Aof文件存储的名称
2.2.1结论
在使用aof和rdb方式时,如果redis重启,则数据从aof文件加载。
Aof:底层频繁的持久化数据,资源占用率高。但是数据不会丢失
Rdb: 满足条件才持久化数据,资源占用率低。但是非法关闭redis,最后一次存储的数据会丢失。
3Redis的主从复制
3.1什么是主从复制
持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:
说明:
主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。
主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。
只有一个主redis,可以有多个从redis。
主从复制不会阻塞master,在同步数据时,master 可以继续处理client 请求
一个redis可以即是主又是从,如下图:
3.2主从复制设置
3.2.1主机配置
无需配置
3.2.2从机配置
第一步:复制出一个从机
[root@localhost redis]# cp bin /bin2 –r
第二步:修改从机的redis.conf
语法:Slaveof masterip masterport
slaveof 192.168.82.100 6379
第三步:修改从机的port地址为6380
在redis.conf中修改
第四步:清除从机中的持久化文件
[root@localhost bin2]# rm -rf appendonly.aof dump.rdb
第五步:启动从机
[root@localhost bin2]# ./redis-server redis.conf
第六步:启动6380的客户端
[root@localhost bin2]# ./redis-cli -p 6380
可查看主从配置信息
注意:
主机一旦发生增删改操作,那么从机会将数据从主机同步到从机中
从机不能执行写操作(读写分离)
127.0.0.1:6380> set s2 222
(error) READONLY You can’t write against a read only slave.
3.2.3主从复制原理 (面试)
主从同步?
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。(配置好主从复制后,启动(重启)从redis)
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
通过info server,info replication命令查看服务运行信息和主从复制信息。
3.2.4复制存在的问题
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
3.2.5面试题分享:
复制架构中出现宕机情况,怎么办?
如果在主从复制架构中出现宕机的情况,需要分情况看:
1、从Redis宕机
a)这个相对而言比较简单,在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据;
b)问题? 如果从库在断开期间,主库的变化不大,从库再次启动后,主库依然会将所有的数据做RDB操作吗?还是增量更新?(从库有做持久化的前提下)
i.不会的,因为在Redis2.8版本后就实现了,主从断线后恢复的情况下实现增量复制。
2、主Redis宕机
a)这个相对而言就会复杂一些,需要以下2步才能完成
i.第一步,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务;
ii.第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来;
b)这个手动完成恢复的过程其实是比较麻烦的并且容易出错,有没有好办法解决呢?
当前有的,Redis提供的哨兵(sentinel)的功能。
3.2.6哨兵(sentinel)
3.2.6.1什么是哨兵
顾名思义,哨兵的作用就是对Redis的系统的运行情况的监控,它是一个独立进程。它的功能有2个:
1、监控主数据库和从数据库是否运行正常;
2、主数据出现故障后自动将从数据库转化为主数据库;
3.2.6.2原理
单个哨兵的架构:
多个哨兵的架构:
多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控。
3.2.6.3环境
当前处于一主多从的环境中: 输入info replication 查看主从配置关系
3.2.6.4配置哨兵
启动哨兵进程首先需要创建哨兵配置文件:
或者复制:/opt/install/redis-4.0.11/sentinel.conf
vi sentinel.conf
输入内容:
sentinel monitor 票数
sentinel monitor myMaster 10.9.41.134 6379 1
sentinel auth-pass myMaster 123456
说明:
myMaster:监控主数据的名称,自定义即可。
127.0.0.1:监控的主数据库的IP
6379:监控的主数据库的端口
1:最低通过票数
auth-pass:主redis的密码
启动哨兵进程:
redis-sentinel ./sentinel.conf
哨兵无需配置slave,只需要指定master,哨兵会自动发现slave
3.2.6.5从数据库宕机
kill掉从redis进程后,30秒后哨兵的控制台输出:
2989:X 05 Jun 20:09:33.509 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6379
说明已经监控到slave宕机了,那么,如果我们将6380端口的redis实例启动后,会自动加入到主从复制吗?
2989:X 05 Jun 20:13:22.716 * +reboot slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6379
2989:X 05 Jun 20:13:22.788 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6379
可以看出,slave从新加入到了主从复制中。-sdown:说明是恢复服务。
3.2.6.6主库宕机
哨兵控制台打印出如下信息:
2989:X 05 Jun 20:16:50.300 # +sdown master ttMaster 127.0.0.1 6379 说明master服务已经宕机
2989:X 05 Jun 20:16:50.300 # +odown master ttMaster 127.0.0.1 6379 #quorum 1/1
2989:X 05 Jun 20:16:50.300 # +new-epoch 1
2989:X 05 Jun 20:16:50.300 # +try-failover master ttMaster 127.0.0.1 6379 开始恢复故障
2989:X 05 Jun 20:16:50.304 # +vote-for-leader 9059917216012421e8e89a4aa02f15b75346d2b7 1 投票选举哨兵leader,现在就一个哨兵所以leader就自己
2989:X 05 Jun 20:16:50.304 # +elected-leader master ttMaster 127.0.0.1 6379 选中leader
2989:X 05 Jun 20:16:50.304 # +failover-state-select-slave master ttMaster 127.0.0.1 6379 选中其中的一个slave当做master
2989:X 05 Jun 20:16:50.357 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ ttMaster 127.0.0.1 6379 选中6381
2989:X 05 Jun 20:16:50.357 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ ttMaster 127.0.0.1 6379 发送slaveof no one命令
2989:X 05 Jun 20:16:50.420 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ ttMaster 127.0.0.1 6379 等待升级master
2989:X 05 Jun 20:16:50.515 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ ttMaster 127.0.0.1 6379 升级6381为master
2989:X 05 Jun 20:16:50.515 # +failover-state-reconf-slaves master ttMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:50.566 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:51.333 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:52.382 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6379
2989:X 05 Jun 20:16:52.438 # +failover-end master ttMaster 127.0.0.1 6379 故障恢复完成
2989:X 05 Jun 20:16:52.438 # +switch-master ttMaster 127.0.0.1 6379 127.0.0.1 6381 主数据库从6379转变为6381
2989:X 05 Jun 20:16:52.438 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ ttMaster 127.0.0.1 6381 添加6380为6381的从库
2989:X 05 Jun 20:16:52.438 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ ttMaster 127.0.0.1 6381 添加6379为6381的从库
2989:X 05 Jun 20:17:22.463 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ ttMaster 127.0.0.1 6381 发现6379已经宕机,等待6379的恢复
可以看出,目前,6381为master,拥有一个slave为6380.
接下来,我们恢复6379查看状态:
2989:X 05 Jun 20:35:32.172 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ ttMaster 127.0.0.1 6381 6379已经恢复服务
2989:X 05 Jun 20:35:42.137 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ ttMaster 127.0.0.1 6381 将6379设置为6381的slave
3.2.6.7使用命令设置密码
除了在配置文件redis.conf中配置验证密码以外,也可以在已经启动的redis服务器通过命令行设置密码,但这种方式是临时的,当服务器重启了密码必须重设。命令行设置密码方式如下:
config set requirepass yourPassword 设置密码
设置主redis密码
config set masterauth masterpassword
有时候我们不知道当前redis服务器是否有设置验证密码,或者忘记了密码是什么,我们可以通过命令行输入命令查看密码,命令如下:
config get requirepass
附加:
redis使用过程中可能会出现的问题:
数据穿透
数据穿刺
数据倾斜
数据雪崩