数据库基础之13(redis主从复制结构,哨兵模式,持久化之RDB,持久化之AOF,hash表,list表)

目录

redis主从复制结构模式

1、主从复制工作原理

2、配置从库

3、反客为主---手动从库变主库

4、哨兵模式---自动从库变主库

 5、配置带验证的主从复制---带密码自动从库变主库

6、持久化之RDB

7、持久化之AOF

8、字符串操作

9、hash表

10、list列表

11、其它操作指令


redis主从复制结构模式


1、主从复制工作原理

• 工作原理:

  • – Slave 向 maste 发送 sync 命令
  • – Master 启动后台存盘进程,同时收集所有修改数据命令
  • – Master 执行完后台存盘进程后,传送整个数据文件到slave
  • – Slave 接收数据文件后,将其存盘并加载到内存中完成首次完全同步
  • – 后续有新数据产生时, master 继续将新的所有收集到的修改命令依次传给 slave ,完成同步

 

  • 主从复制缺点
  1. – 网络繁忙,会产生数据同步延时问题
  2. – 系统繁忙,会产生数据同步延时问题


2、配置从库

• 配置从库 192.168.4.52/24
– redis 服务运行后,默认都是 master 服务器
– 修改服务使用的 IP 地址 bind 192.168.4.X
[root@redis52 ~]# redis-cli -h 192.168.4.52
192.168.4.52:6379> info replication                 // 查看主从配置信息
# Replication
role:master
connected_slaves:0
......
192.168.4.52:6379> SLAVEOF 192.168.4.51 6379------临时设定自己为从库
OK
192.168.4.52:6379> info replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6379
 
注:命令行指定从库    SLAVEOF 主库IP地址 端口号----------重起机器会失效
192.168.4.52:6352> slaveof 192.168.4.51 6351
OK
 

3、反客为主---手动从库变主库

• 反客为主
– 主库宕机后,手动将从库设置为主库
[root@redis52 ~]# redis-cli -h 192.168.4.52
192.168.4.52:6379> SLAVEOF no one-----还原为主库
OK
192.168.4.52:6379> info replication
# Replication
role:master


4、哨兵模式---自动从库变主库

• 哨兵模式

  1. – 主库宕机后,从库自动升级为主库
  2. – 在 slave 主机编辑 sentinel.conf 文件
  3. – 在 slave 主机运行哨兵程序

[root@redis52 ~]# vim /etc/sentinel.conf
sentinel monitor redis51 192.168.4.51 6351 1-------格式:sentinel monitor 主机名 ip地址 端口 票数
sentinel auth-pass redis51 123456--------------针对监控的主库设有密码,所以这里也必须配置对应密码    
 
[root@redis52 ~]# redis-sentinel /etc/sentinel.conf-----运行哨兵程序
 
在这里注意以下:

  1. 主机名:自定义
  2. IP 地址: 被检控主库的 IP 地址
  3. 端 口: master 主机 redis 服务使用的端口
  4. 票 数:主库宕机后, 票数大于 1 的主机被升级为主库

 
5、配置带验证的主从复制---带密码自动从库变主库

• 配置 master 主机
– 设置连接密码 ,启动服务,连接服务
[root@redis51 ~]# vim /etc/redis/6379.conf
bind 192.168.4.51
requirepass 123456  ------设置连接redis服务器的密码
[root@redis51 ~]#
[root@redis51 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis51 ~]# redis-cli -h 192.168.2.52 -a 123456 -p 6351
192.168.4.51:6379>
 
• 配置 slave 主机
– 指定主库 IP ,设置连接密码,启动服务
[root@redis52 ~]# vim /etc/redis/6379.conf
bind 192.168.4.52
slaveof 192.168.4.51 6351 -----------作为谁的从库
masterauth 123456   --------------------主库密码,若无密码则没办法从主库备份数据
[root@redis52 ~]#
[root@redis52 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis52 ~]# redis-cli -h 192.168.4.52
192.168.4.52:6379> INFO replication
# Replication
role:slave
master_host:192.168.4.51
master_port:6379
 

root@redis52 ~]# vim /etc/sentinel.conf
sentinel monitor redis51 192.168.4.51 6351 1-------格式:sentinel monitor 主机名 ip地址 端口 票数
sentinel auth-pass redis51 123456--------------针对监控的主库设有密码,所以这里也必须配置对应密码    
 
[root@redis52 ~]# redis-sentinel /etc/sentinel.conf-----运行哨兵程序


6、持久化之RDB

RDB介绍

  • 全称 Reids DataBase
  • – 数据持久化方式之一
  • – 在指定时间间隔内,将内存中的数据集快照写入硬盘
  • – 术语叫 Snapshot 快照。
  • – 恢复时,将快照文件直接读到内存里。

相关配置参数 vim /etc/redis/6379.conf
• 文件名
– dbfilename “dump.rdb"---- 默认文件名
– save “”------------------ 禁用 RDB
• 数据从内存保存到硬盘的频率
– save 900 1--------------- 900 秒内且有 1 次修改存盘
– save 300 10---------------300 秒内且有 10 次修改存盘
– save 60 10000-------------60 秒内且有 10000 修改存盘
注意:不管时间频率条件是否满足,只要停一次服务/etc/init.d/redis_6379 stop,redis就会将内存中的数据存盘到dump.rdb,若没有该文件,则会自动创建此文件。所以就算flushall,千万不要紧接着shutdown,先将dump.rdb备份以下,然后停止服务,再将备份的数据覆盖复制dump.rdb,再启服务就可以了,数据照样能恢复。


• 手动立刻存盘

  1. – > save---阻塞写存盘,存盘的时候不允许存储数据
  2. – > bgsave ------不阻塞写存盘

• 压缩
– rdbcompression yes | no
• 在存储快照后,使用 crc16 算法做数据校验
– rdbchecksum yes|no
• bgsave 出错停止写操作 , 对数据一致性要求不高设置为 no
– stop-writes-on-bgsave-error yes|no
 
使用RDB文件恢复数据
• 备份数据
– 备份 dump.rdb 文件到其他位置
– ~]# cp 数据库目录 /dump.rdb    备份目录
• 恢复数据

  1. - 停掉redis服务
  2. – 把备份的 dump.rdb 文件拷贝回数据库目录 , 重启 redis 服务
  3. – cp 备份目录 /dump.rdb 数据库目录 /
  4. – /etc/init.d/redis_6379 start

RDB优点与缺点
• RDB 优点
– 持久化时, Redis 服务会创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件;整个过程中主进程不做任何 IO 操作,这就确保了极高的性能。
– 如果要进行大规模数据恢复,且对数据完整性要求不是非常高,使用 RDB 比 AOF 更高效。
• RDB 的缺点
– 意外宕机,最后一次持久化的数据会丢失。


7、持久化之AOF

AOF介绍

  1. • 只追加操作的文件
  2. – Append Only File
  3. – 记录 redis 服务所有写操作。
  4. – 不断的将新的写操作,追加到文件的末尾。
  5. – 使用 cat 命令可以查看文件内容

相关配置参数
• 文件名
– appendfilename "appendonly.aof" -----默认文件名
– appendonly yes --------------启用aof ,默认 no
 
• AOF 文件记录,写操作的三种方式
– appendfsync always------------有新的写操作立即记录,性能差,完整性好。
– appendfsync everysec -------- 每秒记录一次,宕机时会丢失 1 秒的数据
– appendfsync no---------------系统不忙的时候,才存数据到aof文件
 
• 日志重写 ( 日志文件会不断增大 ) ,何时会触发日志重写
– redis 会记录上次重写时 AOF 文件的大小,默认配置
是当 aof 文件是上次 rewrite 后大小的 1 倍且文件大于
64M 时触发。
– auto-aof-rewrite-percentage 100
– auto-aof-rewrite-min-size 64mb
 
• 修复 AOF 文件,
– 把文件恢复到最后一次的正确操作(针对于不小心把aof文件修改错了)
[root@redis53 6379]# redis-check-aof --fix appendonly.aof
0x
83: Expected \r\n, got: 6166
AOF analyzed: size=160, ok_up_to=123, diff=37
This will shrink the AOF from 160 bytes, with 37 bytes, to 123
bytes
Continue? [y/N]: y
Successfully truncated AOF
 
使用AOF文件恢复数据
• 备份数据

- 停掉redis服务
– 备份 appendonly.aof 文件到其他位置
– ~]# cp 数据库目录 /appendonly.aof    备份目录
 
• 恢复数据
– 把备份的 appendonly.aof 文件拷贝回数据库目录 , 重启 redis 服务
– Cp 备份目录 /appendonly.aof  数据库目录/   
 – /etc/init.d/redis_6379 start
 
AOF优点与缺点
• AOF 优点

  1. – 可以灵活的设置同步持久化 appendfsync alwayls ,异步持久化 appendfsync everysec
  2. – 宕机时,仅可能丢失 1 秒的数据

 
• AOF 的缺点
– AOF 文件的体积通常会大于 RDB 文件的体积。执行 fsync 策略时的速度可能会比 RDB 慢。


8、字符串操作

• set key value [ex seconds] [px milliseconds] [nx|xx]
– 设置 key 及值,过期时间可以设置为秒或毫秒为单位
– ex 设置过期秒
– px 设置过期毫秒
– nx 只有 key 不存在,才对 key 进行操作    不存在变量才定义变量
– xx 只有 key 已存在,才对 key 进行操作    存在变量才定义变量(修改)


• setrange key offset value
– 从偏移量开始复写 key 的特定位的值
>set first "hello world"
>setrange first 6 “Redis”        // 改写为 hello Redis
192.168.4.51:6351> set num 13356894561
OK
192.168.4.51:6351> setrange num 4 ***** -----------这里的4是从0开始的,所以4就是第5位,从第5位开始将后面的5位改为*
(integer) 11
192.168.4.51:6351> get num
"1335*****61"
注:引号不算字符长度。空格算一个字符长度

• getrange key start end
– 返回字串值中的子字串,截取范围为 start 和 end
– 负数偏移量表述从末尾计数, -1 表示最后一个字符, -2表示倒数第二个字符
192.168.4.51:6351> set h 1234567
OK
192.168.4.51:6351> getrange h 3 6
"4567"
 
>set first “hello,the world”
>getrange first -5 -1
>getrange first 0 4
in
 
• append key value
192.168.4.51:6351> append name harry-------– 字符存在则追加,不存在则创建 key 及 value
(integer) 5     ---------------------------– 返回值为 key 的长度
192.168.4.51:6351> get name
"harry"
192.168.4.51:6351> append name 9999
(integer) 9
192.168.4.51:6351> get name
"harry9999"

• strlen key
– 统计字串长度
192.168.4.51:6351> strlen name
(integer) 9
 
• setbit key offset value
– 对 key 所存储字串,设置或清除特定偏移量上的位 (bit)
– Value 值可以为 1 或 0 , offset 为 0~2^32 之间
– key 不存在,则创建新 key
>setbit bit 0 1
>setbit bit 1 0
bit: 第 0 位为 1 ,第一位为 0
 
• bitcount key
– 统计字串中被设置为 1 的比特位数量
>setbit bits 0 1        //0001
>setbit bits 3 1        //1001
>bitcount bits        //结果为 2
记录网站用户上线频率,如用户 A 上线了多少天等类似的数据
如用户在某天上线,则使用 setbit ,以用户名为 key ,将网站上线
日为 offset ,并在该 offset 上设置 1 ,最后计算用户总上线次数时
,使用 bitcount 用户名即可
这样,即使网站运行 10 年,每个用户仅占用 10*365 比特位即 456
字节即可
>setbit peter 100 1 // 网站上线 100 天用户登录了一次
>setbit peter 105 1 // 网站上线 105 天用户登录了一次
>bitcount peter
 
• decr key
– 将 key 中的值减 1 , key 不存在则先初始化为 0 ,再减 1
>set test 10
>decr test


• decrby key decrement
– 将 key 中的值,减去 decrement
>set count 100
>decrby count 20


• get key
– 返回 key 所存储的字符串值
– 如果 key 不存在则返回特殊值 nil
– 如果 key 的值不是字串,则返回错误, get 只能处理字串
 
• mget key [key...]
– 一次获取一个或多个 key 的值,空格分隔, < 具有原子性>
• mset key value [key value ...]
– 一次设置多个 key 及值,空格分隔, < 具有原子性 >
192.168.4.51:6351> mset j 1 k 2
OK
192.168.4.51:6351> get j
"1"
192.168.4.51:6351> get k
"2"
 
• incr key
– 将 key 的值加 1 ,如果 key 不存在,则初始为 0 后再加 1
– 主要应用为计数器
• incrby key increment
– 将 key 的值增加 increment
192.168.4.51:6351> set age 56
OK
192.168.4.51:6351> get age
"56"
192.168.4.51:6351> incr age
(integer) 57
192.168.4.51:6351> incrby age 10
(integer) 67
 
• incrbyfloat key increment
– 为 key 中所储存的值加上浮点数增量 increment
192.168.4.51:6351> set num 15.1
OK
192.168.4.51:6351> get num
"15.1"
192.168.4.51:6351> incrbyfloat num 3.1
"18.2"

 

9、hash表

Hash表简介

  • • Redis hash 是一个 string(字符) 类型的 value(字段) 和 value(值) 的映射表
  • • 一个 key 可对应多个 field ,一个 field 对应一个 value
  • • 将一个对象存储为 hash 类型,相比较于每个字段都存储成string 类型更能节省内存Hash表操作

• hset key field value
192.168.4.50:6350> hset me hobby swiming------给变量me的hobby字段赋值为swimming
(integer) 1
192.168.4.50:6350> hset me name  jack
(integer) 1
192.168.4.50:6350> hset me age   25
(integer) 1
192.168.4.50:6350> hset me color white
(integer) 1

• hmset key field value [field value...]– 同时给 hash 表中的多个 field 赋值
192.168.4.50:6350> hmset me hight 185 num 1----me为变量,hight和num为该变量的字段
OK


• hget key filed-----------------– 获取 hash 表中 field 的值
192.168.4.50:6350> hget me age
"25"
• hmget key field [field...]– -------------返回 hash 表中多个 field 的值
192.168.4.50:6350> hmget me age name
1) "25"
2) "jack"


• hkeys key– ---------------返回 hash 表中所有 字段名称
192.168.4.50:6350> hkeys me
1) "hobby"
2) "name"
3) "age"
4) "color"
5) "hight"
6) "num"

• hvals key–-------------- 返回 hash 表中所有 字段的值
192.168.4.50:6350> hvals me
1) "swiming"
2) "jack"
3) "25"
4) "white"
5) "185"
6) "1"

• hgetall key– 返回 hash 表中所有 field 的值,包括字段名称-----hvals + hkeys=hgetall
192.168.4.50:6350> hgetall me
 1) "hobby"
 2) "swiming"
 3) "name"
 4) "jack"
 5) "age"
 6) "25"
 7) "color"
 8) "white"
 9) "hight"
10) "185"
11) "num"
12) "1"



• hdel key field [field...]–--------------- 删除 hash 表中多个 字段 的值,不存在则忽略
192.168.4.50:6350> hdel me age name
(integer) 2
192.168.4.50:6350> hkeys me
1) "hobby"
2) "color"
3) "hight"
4) "num"


10、list列表

List列表简介

  1. • Redis 的 list 是一个字符队列
  2. 后进先出
  3. • 一个 key 可以有多个值

List列表操作
• lpush key value [value...]
– 将一个或多个值 value 插入到列表 key 的表头
– Key 不存在,则创建 key
>lpush list a b c ---------list值依次为 c b a,等同于 lpush list a; lpush list b; lpush list c
• lrange key start stop----------– 从开始位置读取 key 的值到 stop 结束
[root@host50 ~]# redis-cli -h 192.168.4.50 -p 6350
192.168.4.50:6350> lpush website a b c d e
(integer) 5
192.168.4.50:6350> type website
list
192.168.4.50:6350> lrange website 0 -1--------------从开始读到(倒数第一个)结束为止----注意这里第一个是从0开始算的
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
192.168.4.50:6350> lrange website 0 0------------从开始读到开始
1) "e"
192.168.4.50:6350> lrange website 0 -2---------------从 0 位开始,读到倒数 2 位为止
1) "e"
2) "d"
3) "c"
4) "b"
192.168.4.50:6350> lrange website 0 -3
1) "e"
2) "d"
3) "c"
192.168.4.50:6350> lrange website 0 2
1) "e"
2) "d"
3) "c"
192.168.4.50:6350> lrange website -2 -1
1) "b"
2) "a"
192.168.4.50:6350> lrange website -1 -2
(empty list or set)


• lpop key-----------– 移除并返回到表头元素数据, key 不存在则返回 nil
>lpop list----------------- 删除表头元素,可以多次执行

• rpop key-----– 删除并返回 key 末尾的值
192.168.4.50:6350> rpop website
"q"

• llen key
– 返回列表 key 的长度

192.168.4.50:6350> llen website
(integer) 4


• lindex key index
– 返回列表中第 index 个值
如 lindex key 0 ; lindex key 2; lindex key -2
192.168.4.50:6350> lrange website 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
192.168.4.50:6350> lindex website 0
"d"

• lset key index value
– 将 key 中 index 位置的值修改为 value
>lset list 3 test            // 将 list 中第 3 个值修改为 test
192.168.4.50:6350> lset website 0 D
OK
192.168.4.50:6350> lindex website 0
"D"

• rpush key value [value...]--------– 将 value 插入到 key 的末尾
>rpush list3 a b c            //list3 值为 a b c
192.168.4.50:6350> rpush website o p q------插入时先进先出
(integer) 7
192.168.4.50:6350> lrange website 0 -1
1) "D"
2) "c"
3) "b"
4) "a"
5) "o"
6) "p"
7) "q"



11、其它操作指令


• del key [key...]-----– 删除一个或多个 key
• exists key------– 测试一个 key 是否存在
• expire key seconds-----– 设置 key 的生存周期
• persist key-----– 设置 key 永不过期
• ttl key---------– 查看 key 的生存周期
• keys 匹配
– 找符合匹配条件的 key ,特殊符号用 \ 屏蔽

  1. >keys *                                        // 显示所有 key
  2. >keys h?llo                                 // 匹配 hello,hallo,hxllo 等
  3. >keys h*llo                                 // 匹配 hllo 或 h***llo 等
  4. >keys h[ae]llo                                 // 匹配 hello 和 hallo

• flushall------– 清空所有数据
• select id------– 选择数据库, id 用数字指定,默认数据库为 0
>select 0
>select 2
• move key db_id--------– 将当前数据库的 key 移动到 db_id 数据库中
>move key   1 --------------将 key 移动到 1 数据库中
• rename key newkey----– 给 key 改名为 newkey , newkey 已存在时,则覆盖其值
• renamenx key newkey------– 仅当 newkey 不存在时,才将 key 改名为 newkey
• sort key------– 对 key 进行排序
>sort cost   -------------默认对数字排序,升序
>sort cost desc  -----------------降序
>lpush test “about” “site” “rename”
>sort test alpha  -----------对字符排序
>sort cost alpha limit 0 3  ---------------排序后提取 0-3 位数据
>sort cost alpha limit 0 3 desc
>sort cost STORE cost2    -----------对 cost 排序并保存为 cost2
• type key--------– 返回 key 的数据类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值