主从复制结构模式
- 结构模式:一主一从、一主多从、主从从
主从复制工作原理
工作原理
- slave向master发送sync命令
- master启动后台存盘进程,并收集所有修改数据命令
- master完成后台存盘后,传送整个数据文件到slave
- slave接收数据文件,加载到内存中完成首次完全同步
- 后续有新数据产生时,master继续将新的数据收集到的修改命令依次传给slave,完成同步
主从复制缺点
缺点
- 网络繁忙,会产生数据同步延时问题
- 系统繁忙,会产生数据同步延时问题
配置主从复制
一、查看主从复制信息,redis服务运行后,默认都是master服务器
[root@ip51 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> info replication
二、给51配置从库
- 命令行配置,临时有效,服务重启消失
[root@ip52 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> SLAVEOF 192.168.4.51 6351 //将51设置为52的主库
192.168.4.52:6352> INFO replication
- 永久配置,修改配置文件
[root@ip52 ~]# vim /etc/redis/6379.conf
... ...
slaveof 192.168.4.51 6351
... ...
三、数据测试
[root@ip50 ~]# redis-cli -h 192.168.4.51 -p 6351
192.168.4.51:6351> set sex boy
四、配置53主机为51的从库
[root@ip53 ~]# /etc/init.d/redis_6379 stop
[root@ip53 ~]# vim /etc/redis/6379.conf
... ...
slaveof 192.168.4.51 6351
... ...
[root@ip53 ~]# /etc/init.d/redis_6379 start
[root@ip53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> INFO replication
五、将54配置为53的从的库(主从从)
[root@ip54 ~]# /etc/init.d/redis_6379 stop
[root@ip54 ~]# vim /etc/redis/6379.conf
... ...
slaveof 192.168.4.53 6353
... ...
[root@ip54 ~]# /etc/init.d/redis_6379 start
[root@ip54 ~]# redis-cli -h 192.168.4.54 -p 6354
192.168.4.54:6354> INFO replication
六、把从服务器恢复为独立的服务器
- 命令行恢复(临时)
从服务器上
192.168.4.52:6352> slaveof no one
- 永久配置
注释掉从服务器配置
[root@ip52 ~]# vim /etc/redis/6379.conf
... ...
#slaveof 192.168.4.53 6353
... ...
配置带验证的主从复制结构
一、给55主机上的redis服务配置密码
- 添加密码
[root@ip55 ~]# vim /etc/redis/6379.conf
... ...
requirepass 123456
... ...
[root@ip55 ~]# /etc/init.d/redis_6379 stop
[root@ip55 ~]# /etc/init.d/redis_6379 start
- 给服务脚本添加密码设置
[root@ip55 ~]# vim /etc/init.d/redis_6379
... ...
$CLIEXEC -p 6355 -h 192.168.4.55 -a 123456 shutdown
... ...
- 连接55,添加数据
[root@ip55 ~]# redis-cli -h 192.168.4.55 -p 6355 -a 123456
192.168.4.55:6355>
二、给55主机配置从库
- 修改56配置文件
[root@ip56 ~]# vim /etc/redis/6379.conf
... ...
slaveof 192.168.4.55 6355
... ...
masterauth 123456
... ...
- 重启服务
[root@ip56 ~]# /etc/init.d/redis_6379 stop
[root@ip56 ~]# /etc/init.d/redis_6379 start
- 查看状态信息
192.168.4.56:6356> info replication
哨兵服务
哨兵模式
- 主库宕机后,从库自动升级为主库
- 在slave主机编辑sentinel.conf文件
- 在slave主机运行哨兵程序
一、创建哨兵服务配置文件
[root@ip58 ~]# vim /etc/sentinel.conf
添加如下配置项
bind 0.0.0.0
port 26379
sentinel monitor redisser 192.168.4.55 6355 1
sentinel auth-pass redisser 123456
sentinel monitor redisser 192.168.4.55 6355 1
主机名 ip地址 端口 票数
主机名:自定义
IP地址:master主机的IP地址
端口:master主机redis服务使用的端口
票数:有几台哨兵主机连接不上主库时,切换主库
二、运行哨兵服务
[root@ip58 ~]# redis-sentinel /etc/sentinel.conf
三、停掉55主机,查看监控信息
[root@ip55 ~]# /etc/init.d/redis_6379 stop
等待一会,监控信息就会显示55宕机,56主动升级为主
往56主机上存入新的数据
再打开55主机,55主机就会主动变为56的从库
[root@ip55 ~]# /etc/init.d/redis_6379 start
登录55主机查看数据,就会看到56主机上新添加的数据
持久化之RDB
RDB介绍
Redis数据库文件,全称Redis DataBase
- 数据持久化方式之一
- 依照指定时间间隔,将内存中的数据集快照写入磁盘
- 术语叫Snapshot快照
- 恢复时,将快照文件直接读如到内存
相关配置参数
文件名
- dbfilename “dump.rdb” //文件名
- save “” //禁用RDB
数据从内存保存到硬盘的频率
- save 900 1 //900秒内且有一次修改
- save 300 10 //300秒内且有10次修改
- save 60 10000 //60秒内且有10000次修改
手动立刻存盘
- save //阻塞写存盘
- bgsave //不阻塞写存盘
压缩
- rdbcompression yes|no
在存储快照后,使用crc16算法做数据校验
- rdbchecksum yes|no
bgsave出错时停止写操作
- stop-writes-on-bgsave-error yes|no
使用RDB文件恢复数据
-
备份数据
备份dump.rdb文件到其他为值
#cp 数据库目录/dump.rdb 备份目录
-
恢复数据
拷贝备份文件到数据库目录,重启redis服务
#cp 备份目录/dump.rdb 数据库目录/
#/etc/redis/redis_端口 start
RDB优点/缺点
RDB优点
- 高性能的持久化实现----创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件,过程中主进程不做任何IO操作
- 比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
RDB的缺点
- 意外宕机时,最后一次持久化的数据会丢失
备份恢复操作
[root@ip51 ~]# scp /var/lib/redis/6379/dump.rdb root@192.168.4.52:/root/
[root@ip52 ~]# /etc/init.d/redis_6379 stop
[root@ip52 ~]# rm -rf /var/lib/redis/6379/*
[root@ip52 ~]# mv /root/dump.rdb /var/lib/redis/6379/
[root@ip52 ~]# /etc/init.d/redis_6379 start
持久化之AOF
只做追加操作的文件,Append Only File
- 记录redis服务所有写操作
- 不断的将新的写操作,追加到文件的末尾
- 使用cat命令可以查看文件内容
相关配置参数
文件名
- appendfilename “appendonly.aof” //指定文件名
- appendonly yes //启用aof,默认为no
AOF文件记录写操作的方式
- appendfsync always //有新写操作立即记录
- appendfsync everysec //每秒记录一次
- appendfsync no //从不记录
开启aof日志
[root@ip51 ~]# vim /etc/redis/6379.conf
... ...
appendonly yes //启用日志
appendfilename "appendonly.aof" //定义文件名,一般采用默认
appendfsync everysec //配置记录写操作的方式
... ...
使用AOF文件恢复数据
备份数据
- 备份appendonly.aof文件到其他位置
#cp 数据库目录/appendonly.aof 备份目录
恢复数据
- 拷贝备份文件到数据库目录,重启redis服务
#cp 备份目录/appendonly.aof 数据库目录/
#/etc/redis/redis_端口 start
[root@ip52 ~]# /etc/init.d/redis_6379 stop
[root@ip52 ~]# rm -rf /var/lib/redis/6379/*
[root@ip52 ~]# vim /etc/redis/6379.conf
... ...
appendonly yes //启用日志
appendfilename "appendonly.aof" //定义文件名,一般采用默认
appendfsync everysec //配置记录写操作的方式
... ...
[root@ip51 ~]# scp /var/lib/redis/6379/appendonly.aof root@192.168.4.52:/var/lib/redis/6379/
[root@ip52 ~]# /etc/init.d/redis_6379 start
在命令行启用aof文件不会覆盖已有的数据
[root@ip53 ~]# redis-cli -h 192.168.4.53 -p 6353
192.168.4.53:6353> CONFIG SET appendonly yes //设置这个配置项的值
192.168.4.53:6353> CONFIG REWRITE //永久修改配置文件
192.168.4.53:6353> save
修复AOF文件
- 把文件恢复到最后一次的正确操作
[root@ip53 ~]# redis-check-aof --fix /var/lib/redis/6379/appendonly.aof
[root@ip53 ~]# rm -rf /var/run/redis_6379.pid
[root@ip53 ~]# /etc/init.d/redis_6379 start
日志文件不断增大,何时触发日志重写
- redis会记录上次重写时AOF文件的大小
- 默认配置当aof文件是上次rewrite后大小的一倍且文件大于64M时触发
>auto-aof-rewrite-percentage 100
>auto-aof-rewrite-min-size 64mb
AOF优点/缺点
AOF优点
- 可以灵活设置持久化方式,同步持久化appendfsync always 或异步持久化appendfsync everysec
- 出现意外宕机时,仅可能丢失1秒的数据
AOF缺点 - 持久化文件的体积通常会大于RDB方式
- 执行fsync策略时的速度可能会比RDB方式慢
数据类型
String字符串
字符串操作
-
set key value [ex seconds] [px milliseconds] [nx|xx] //加nx表示变量存在时不存,xx表示直接覆盖
-
设置key及值,过期时间可以使用秒或者毫秒为单位
-
setrange key offset value
-
从偏移量开始复写key的特定位的值
-
strlen key,统计字串长度
192.168.4.51:6351> set tel 19999999444455
OK
192.168.4.51:6351> get tel
"19999999444455"
192.168.4.51:6351> SETRANGE tel 4 "****"
(integer) 14
192.168.4.51:6351> get tel
"1999****444455"
192.168.4.51:6351> strlen tel
(integer) 14
- append key value
存在则追加,不存在则创建key及value,返回key长度
192.168.4.51:6351> append tel ****
(integer) 18
-
setbit key offset value
对key所存储字串,设置或清除特定偏移量上的位(bit)
value值可以为1或0,offset为0~2^32之间
key不存在,则创建新key -
bitcount key
统计字串中被设置为1的比特位数量
192.168.4.51:6351>setbit bits 0 1 //0001
192.168.4.51:6351>setbit bits 3 1 //1001
192.168.4.51:6351>bitcount bits //结果为2
192.168.4.51:6351>setbit peter 100 1 //网站上线100天用户登录了一次
192.168.4.51:6351>setbit peter 105 1 //网站上线105天用户登录了一次
192.168.4.51:6351>bitcount peter
场景说明:
记录网站用户上线频率,如用户A上线了多少天等类似的数据
如用户再某天上线,则使用setbit,以用户名为key,将网站上线日为offset,并在该offset上设置1,最后计算用户总上线次数时。使用bitcount用户名即可,这样,即使网站运行10年,每个用户仅占用10*365比特位即456字节
- decr key
将key中的值减1,key不存在则先初始化为0,再减1
192.168.4.51:6351> set test 10
OK
192.168.4.51:6351> decr test
(integer) 9
- decrby key decrement
将key中的值,减去decrement
192.168.4.51:6351> set count 100
OK
192.168.4.51:6351> DECRBY count 20
(integer) 80
-
get key
返回key存储的字符串值,若key不存在则返回null
若key的值不是字串,则返回错误,get只能处理字串 -
getrange key start end
返回字串值的子字串,截取范围为start和end
负数偏移量表示从末尾开始计数,-1表示最后一个字符,-2表示倒数第二个字符
192.168.4.51:6351> GETRANGE tel -5 -1
"5****"
192.168.4.51:6351> GETRANGE tel 0 4
"1999*"
- incr key
将key的值加1,如果key不存在,则初始为0后再加1
主要应用为计数器
192.168.4.51:6351> set page 20
OK
192.168.4.51:6351> incr page
(integer) 21
- incrby key increment
将key的值增加increment
192.168.4.51:6351> INCRBY page 20
(integer) 41
- incrbyfloat key increment
为key中所存储的值加上浮点数增量 increment
192.168.4.51:6351> set num 16.1
OK
192.168.4.51:6351> incrbyfloat num 1.1
"17.2"
- mget key [key…]
获取一个或者多个key的值,空格分割,具有原子性
192.168.4.51:6351> mget count tel page
1) "80"
2) "1999****444455****"
3) "41"
- mset key value [key value…]
设置多个key及值,空格分隔,具有原子性
192.168.4.51:6351> MSET q w e r t y u i
OK
192.168.4.51:6351> mget q e t u
1) "w"
2) "r"
3) "y"
4) "i"
List列表
List列表简介
- Redis的list是一个字符队列
- 先进后出
- 一个key可以有多个值
List列表操作
- lpush key value [value…]
将一个或多个值value插入到列表key的表头
key不存在,则创建key
192.168.4.51:6351> LPUSH list a b c
(integer) 3
- lrange key start stop
从开始位置读取key值到stop结束
192.168.4.51:6351> lrange list 0 2 //从0位开始,读到2位为止
1) "c"
2) "b"
3) "a"
192.168.4.51:6351> lrange list 0 -1 //从开始读到结束为止
1) "c"
2) "b"
3) "a"
192.168.4.51:6351> LRANGE list 0 -2 //从开始读到倒数第2位为止
1) "c"
2) "b"
- lpop key
移除并返回列表头元素数据,key不存在则返回nil
192.168.4.51:6351> lpop list //删除表头元素,可以多次执行
"c"
- llen key
返回列表key的长度
192.168.4.51:6351> llen list
(integer) 2
- lindex key index
返回列表中第index个值
192.168.4.51:6351> lindex list 0
"b"
192.168.4.51:6351> lindex list 1
"a"
- lset key index value
将key中index位置的值修改为value
192.168.4.51:6351> lset list 0 test //将列表list中的第一个值修改为test
OK
192.168.4.51:6351> LRANGE list 0 4
1) "test"
2) "a"
- rpush key value [value…]
将value插入到key的末尾
192.168.4.51:6351> RPUSH list3 a b c //list3值为a b c
(integer) 3
192.168.4.51:6351> RPUSH list3 d //末尾插入d
(integer) 4
- rpop key
删除并返回key末尾的值
192.168.4.51:6351> rpush list4 a b c
(integer) 3
192.168.4.51:6351> rpop list4
"c"
Hash表
Hash表简介
- Redis hash
- 是一个string类型的field和value映射表
- 一个key可以对应多个field,一个field对应一个value
- 将一个对象存储为hash类型,较于每个字段都存储成string类型更能节省内存
Hash表操作
- hset key field value
将hash表中field值设置为value
192.168.4.51:6351> hset site google 'www.g.cn'
(integer) 1
192.168.4.51:6351> hset site baidu 'www.baidu.com'
(integer) 1
-hget key field
获取hash表中field的值
192.168.4.51:6351> hget site google
"www.g.cn"
192.168.4.51:6351> hget site baidu
"www.baidu.com"
- hmset key field value [field value…]
同时给hash表中的多个field赋值
192.168.4.51:6351> hmset site google www.g.cn baidu www.baidu.com
OK
- hmget key field [field…]
返回hash表中多个field的值
192.168.4.51:6351> hmget site google baidu
1) "www.g.cn"
2) "www.baidu.com"
- hkeys key
返回hash表中所有的field名称
192.168.4.51:6351> hkeys site
1) "google"
2) "baidu"
-
hgetall key
返回hash表中所有key名和对应的值列表 -
hvals key
返回hash表中所有key的值 -
hdel key field [field…]
删除hash表中多个field的值,不存在则忽略
192.168.4.51:6351> hdel site goodle baidu
(integer) 1
管理命令总结
- del key [key…]
删除一个或者多个key - exists key
测试一个key是否存在 - expire key seconds
设置key的生存周期 - persist key
设置一个key永不过期 - ttl key
查看key的生存周期