redis服务器 服务器IP地址 端口
mysql50 192.168.4.50/24 无
mysql51 192.168.4.51/24 6351
mysql52 192.168.4.52/24 6352
mysql53 192.168.4.53/24 6353
mysql54 192.168.4.54/24 6354
mysql55 192.168.4.55/24 6355
一、主从复制
1.一主一从 主mysql51 从mysql52
redis服务器启动默认就是主服务器
[root@mysql51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> info replication
# Replication
role:master
--------------------------------------------------------
配置从服务器:slaveof 主服务器主机名 端口
命令行配置即可生效
修改配置文件永久生效
--------------------------------------------------------
[root@mysql52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> slaveof 192.168.4.51 6351
OK
192.168.4.52:6352> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6351
master_link_status:up
[root@mysql52 ~]# vim /etc/redis/6352.conf ==>>永久配置从服务器
282 slaveof 192.168.4.51 6351
恢复从库为主库
[root@mysql52 ~]# redis-cli -h 192.168.4.52 -p 6352 ==>>临时恢复从库为主库,永久修改配置文件
192.168.4.52:6352> slaveof no one
配置带验证的主从复制
[root@mysql51 ~]# vim +501 /etc/redis/6351.conf
501 requirepass 123456
[root@mysql51 ~]# redis-cli -h 192.168.4.51 -p 6351 -a 123456
192.168.4.51:6351> shutdown
[root@mysql51 ~]# /etc/init.d/redis_6351 start
[root@mysql52 ~]# vim +289 /etc/redis/6352.conf
289 masterauth 123456 ==>>主库密码
[root@mysql52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> shutdown
[root@mysql52 ~]# /etc/init.d/redis_6352 start
在命令行修改服务器配置,并且永久有效
[root@mysql52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> CONFIG set masterauth "123456"
OK
192.168.4.52:6352> CONFIG GET masterauth
1) "masterauth"
2) "123456"
192.168.4.52:6352> CONFIG REWRITE
OK
2.一主多从
3.主从从 主mysql53 从mysql54 从从mysql55
[root@mysql53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> info replication
# Replication
role:master
connected_slaves:0
[root@mysql54 ~]# redis-cli -h 192.168.4.54 -p 6354
192.168.4.54:6354> slaveof 192.168.4.53 6353
OK
192.168.4.54:6354> CONFIG REWRITE
OK
192.168.4.54:6354> info replication
# Replication
role:slave
master_host:192.168.4.53
master_port:6353
master_link_status:up
[root@mysql55 ~]# redis-cli -h 192.168.4.55 -p 6355
192.168.4.55:6355> slaveof 192.168.4.54 6354
OK
192.168.4.55:6355> CONFIG REWRITE
OK
192.168.4.55:6355> info replication
# Replication
role:slave
master_host:192.168.4.54
master_port:6354
master_link_status:up
[root@mysql54 ~]# redis-cli -h 192.168.4.54 -p 6354
192.168.4.54:6354> info replication
# Replication
role:slave
master_host:192.168.4.53
master_port:6353
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:280
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=192.168.4.55,port=6355,state=online,offset=280,lag=1
哨兵服务
监视master服务器
发现master宕机后,将从服务器升级为主服务器
sentinel monitor 主机名 master主机的IP地址 master主机redis服务使用的端口 票数(发现主库宕机的哨兵服务器台数)
[root@mysql57 ~]# yum -y install gcc
[root@mysql57 ~]# tar -zxf redis-4.0.8.tar.gz
[root@mysql57 ~]# cd redis-4.0.8/
[root@mysql57 redis-4.0.8]# make && make install
[root@mysql57 redis-4.0.8]# vim /etc/sentinel.conf
sentinel monitor server53 192.168.4.51 6351 1
bind 0.0.0.0 ==>>服务地址
#port 23067 ==>>端口号
#sentinel auth-pass server53 123456 ==>>连接服务密码
[root@mysql57 redis-4.0.8]# redis-sentinel /etc/sentinel.conf
二、持久化
1.RDB
Redis数据库文件,全称Redis DataBase
数据持久化方式之一
数据持久化默认方式
按照指定时间间隔,将内存中的数据集快照写入硬盘
优点:
高性能的持久化实现--创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,在用这个临时文件替换上次持久化好的文件;过程中不做任何IO操作
比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
缺点:
意外宕机时,丢失最后一次持久化的多有数据
[root@mysql50 ~]# vim /etc/redis/6379.conf
219 save 900 1 ==>>900秒且有1个可以改变即存盘
220 save 300 10 ==>>300秒且有10个可以改变即存盘
221 save 60 10000 ==>>60秒且有10000个可以改变即存盘
254 dbfilename dump.rdb ==>>定义RDB文件名
------------------------------------------------------------------------
手动存盘:
save 阻塞写存盘
bgsave 不阻塞写存盘
------------------------------------------------------------------------
[root@mysql50 ~]# cp /var/lib/redis/6379/dump.rdb /root/ ==>>备份dump.rdb文件到其他位置
恢复数据
[root@mysql57 ~]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@mysql57 ~]# rm -f /var/lib/redis/6379/dump.rdb
[root@mysql57 ~]# cp dump.rdb /var/lib/redis/6379/
[root@mysql57 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
2.AOF
Append Only File
追加方式记录写操作的文件
记录redis服务所有写操作
不断的将新的写操作,追加到文件的末尾
默认没有启用
使用cat命令可以查看文件内容
优点:
可以灵活设置持久化方式
出现意外宕机时,仅可能丢失1秒的数据
缺点:
持久化文件的体积通常会大于RDB方式
执行fsync策略时的速度可能会比RDB方式慢
[root@mysql50 ~]# redis-cli -h 192.168.4.50 -p 6350 -a 123456
192.168.4.50:6350> CONFIG SET appendonly yes ==>>启用AOF
OK
192.168.4.50:6350> CONFIG REWRITE ==>>写入配置文件
OK
[root@mysql50 ~]# ls /var/lib/redis/6379/
appendonly.aof dump.rdb
[root@mysql50 ~]# cp /var/lib/redis/6379/appendonly.aof /root/ ==>>备份数据到其他目录
恢复数据
[root@mysql57 ~]# /etc/init.d/redis_6379 stop
Stopping ...
Redis stopped
[root@mysql57 ~]# vim /etc/redis/6379.conf
673 appendonly yes ==>>启用AOF,默认为no
677 appendfilename "appendonly.aof" ==>>指定文件名
[root@mysql57 ~]# /etc/init.d/redis_6379 start
[root@mysql57 ~]# rm -f /var/lib/redis/6379/appendonly.aof
[root@mysql57 ~]# cp appendonly.aof /var/lib/redis/6379/
[root@mysql57 ~]# /etc/init.d/redis_6379 restart
Starting Redis server...
[root@mysql50 ~]# cat /etc/redis/6379.conf
702 # appendfsync always ==>>时时记录,并完成磁盘同步
703 appendfsync everysec ==>>每秒记录一次,并完成磁盘同步
704 # appendfsync no ==>>写入AOF,不执行磁盘同步
744 auto-aof-rewrite-percentage 100 ==>>再次重写,增长百分比
745 auto-aof-rewrite-min-size 64mb ==>>首次重写触发值
[root@mysql50 ~]# redis-check-aof --fix /var/lib/redis/6379/appendonly.aof ==>>修复AOF文件
三、数据类型
1.字符类型
set key value [EX seconds] [PX milliseconds] [NX|XX]
EX 过期时间单位秒
PX 过期时间单位毫秒
NX 数据不存在时存储
XX 数据存在也存储(默认)
get key
返回key存储的字符串值,若key不存在则返回null
若key的值不是字符串,则返回错误,get只能处理字符串
SETRANGE key offset value ==>>从偏移量复写key特定的值
APPEND key value ==>>存在就追加,不存在就创建
STRLEN key ==>>统计字符串长度
SETBIT key offset value ==>>多用于统计用户上线天数
对key所存储字串,设置或清除特定偏移量上的位(bit)
value值只能是1或0,offset为0~2^32之间
key不存在,则创建新key
BITCOUNT key [start end] ==>>统计字符串被设置为1的比特位数量
DECR key ==>>将key中的值减1,key不存在则先初始化为0,再减1
DECRBY key decrement ==>>将key值减去decrement
GETRANGE key start end
返回字符串值的子字符串,截取范围为start和end
负数偏移量表示从末尾开始计数
INCR key
将key值加1,key不存在则先初始化为0,再加1。主要应用计数器
INCRBY key increment ==>>将key值加上increment
INCRBYFLOAT key increment ==>>为key中所存储的值加上浮点数增量 increment
mget key [key ...] ==>>获取一个或多个key值,空格分隔,具有原子性
mset key value [key value ...] ==>>设置多个key值,空格分隔,具有原子性
192.168.4.50:6350> set name myllovechina
OK
192.168.4.50:6350> SETRANGE name 0 we
(integer) 12
192.168.4.50:6350> get name
"wellovechina"
192.168.4.50:6350> APPEND name 123
(integer) 15
192.168.4.50:6350> get name
"wellovechina123"
192.168.4.50:6350> STRLEN name
(integer) 15
192.168.4.50:6350> SETBIT bit 0 1
(integer) 0
192.168.4.50:6350> SETBIT bit 1 1
(integer) 0
192.168.4.50:6350> BITCOUNT bit
(integer) 2
192.168.4.50:6350> set age 89
OK
192.168.4.50:6350> DECR age
(integer) 88
192.168.4.50:6350> DECRBY age 20
(integer) 68
192.168.4.50:6350> GETRANGE name 0 6
"wellove"
192.168.4.50:6350> GETRANGE name -5 -1
"na123"
192.168.4.50:6350> get age
"69"
192.168.4.50:6350> INCR age
(integer) 70
192.168.4.50:6350> INCRBY age 20
(integer) 90
192.168.4.50:6350> set num 19.2
OK
192.168.4.50:6350> INCRBYFLOAT num 1.1
"20.3"
2.列表类型
redis的list是一个字符队列
先进后出
一个key可以有多个值
LPUSH key value [value ...]
将一个或多个值value插入到列表key的表头
key不存在,则创建key
LRANGE key start stop ==>>从开始位置读取key值到stop结束
LPOP key ==>>移除并返回列表头元素数据,key不存在则返回nil
LLEN key ==>>返回列表key的长度
lindex key index ==>>返回列表中第index个值
LSET key index value ==>>将key中index位置的值修改为value
RPUSH key value [value ...] ==>>将value插入到key的末尾
RPOP key ==>>删除并返回key末尾的值
192.168.4.50:6350> LPUSH alist a b c ==>>list值一次为c,b,a
(integer) 3
192.168.4.50:6350> LRANGE alist 0 1
1) "c"
2) "b"
192.168.4.50:6350> LPOP alist
"c"
192.168.4.50:6350> LPOP alist
"b"
192.168.4.50:6350> LLEN alist
(integer) 1
192.168.4.50:6350> LPUSH blist a s s s df g ge q yu i j
(integer) 11
192.168.4.50:6350> LINDEX blist 3
"q"
192.168.4.50:6350> LINDEX blist 2
"yu"
192.168.4.50:6350> LINDEX blist 0
"j"
192.168.4.50:6350> LSET blist 0 ss
OK
192.168.4.50:6350> LINDEX blist 0
"ss"
192.168.4.50:6350> RPUSH alist v c x z
(integer) 5
192.168.4.50:6350> LINDEX alist 4
"z"
192.168.4.50:6350> RPOP alist
"z"
3.哈希类型
是一个string类型的field和value的映射表
一个key可以对应多个field,一个field对应一个value
将一个对象存储为hash类型,较于每隔字段都存储城string类型更节省内存
HSET key field value ==>>将hash表中的field值设置为value
HGET key field ==>>获取hash表中的field的值
HMSET key field value [field value ...] ==>>同时给hash表中的多个field赋值
HMGET key field [field ...] ==>>返回hash表中多个field的值
HKEYS key ==>>返回hash表中所有field名称
HGETALL key ==>>返回hash表中多有field的值
HVALS key ==>>返回hash表中多有field的值
HDEL key field [field ...] ==>>删除hash表中多个field的值,不存在则忽略
192.168.4.50:6350> HSET site qq 'www.qq.com'
(integer) 1
192.168.4.50:6350> HGET site qq
"www.qq.com"
192.168.4.50:6350> HMSET site goole www.g.cn baidu www.baidu.com
OK
192.168.4.50:6350> HMGET site goole baidu qq
1) "www.g.cn"
2) "www.baidu.com"
3) "www.qq.com"
192.168.4.50:6350> HKEYS site
1) "qq"
2) "goole"
3) "baidu"
192.168.4.50:6350> HVALS site
1) "www.qq.com"
2) "www.g.cn"
3) "www.baidu.com"
192.168.4.50:6350> HDEL site goole baidu
(integer) 2