目录
redis主从复制结构模式
1、主从复制工作原理
• 工作原理:
- – Slave 向 maste 发送 sync 命令
- – Master 启动后台存盘进程,同时收集所有修改数据命令
- – Master 执行完后台存盘进程后,传送整个数据文件到slave
- – Slave 接收数据文件后,将其存盘并加载到内存中完成首次完全同步
- – 后续有新数据产生时, master 继续将新的所有收集到的修改命令依次传给 slave ,完成同步
- 主从复制缺点
- – 网络繁忙,会产生数据同步延时问题
- – 系统繁忙,会产生数据同步延时问题
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、哨兵模式---自动从库变主库
• 哨兵模式
- – 主库宕机后,从库自动升级为主库
- – 在 slave 主机编辑 sentinel.conf 文件
- – 在 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-----运行哨兵程序
在这里注意以下:
- 主机名:自定义
- IP 地址: 被检控主库的 IP 地址
- 端 口: master 主机 redis 服务使用的端口
- 票 数:主库宕机后, 票数大于 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,再启服务就可以了,数据照样能恢复。
• 手动立刻存盘
- – > save---阻塞写存盘,存盘的时候不允许存储数据
- – > bgsave ------不阻塞写存盘
• 压缩
– rdbcompression yes | no
• 在存储快照后,使用 crc16 算法做数据校验
– rdbchecksum yes|no
• bgsave 出错停止写操作 , 对数据一致性要求不高设置为 no
– stop-writes-on-bgsave-error yes|no
使用RDB文件恢复数据
• 备份数据
– 备份 dump.rdb 文件到其他位置
– ~]# cp 数据库目录 /dump.rdb 备份目录
• 恢复数据
- - 停掉redis服务
- – 把备份的 dump.rdb 文件拷贝回数据库目录 , 重启 redis 服务
- – cp 备份目录 /dump.rdb 数据库目录 /
- – /etc/init.d/redis_6379 start
RDB优点与缺点
• RDB 优点
– 持久化时, Redis 服务会创建一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件;整个过程中主进程不做任何 IO 操作,这就确保了极高的性能。
– 如果要进行大规模数据恢复,且对数据完整性要求不是非常高,使用 RDB 比 AOF 更高效。
• RDB 的缺点
– 意外宕机,最后一次持久化的数据会丢失。
7、持久化之AOF
AOF介绍
- • 只追加操作的文件
- – Append Only File
- – 记录 redis 服务所有写操作。
- – 不断的将新的写操作,追加到文件的末尾。
- – 使用 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 优点
- – 可以灵活的设置同步持久化 appendfsync alwayls ,异步持久化 appendfsync everysec
- – 宕机时,仅可能丢失 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列表简介
- • Redis 的 list 是一个字符队列
- •后进先出
- • 一个 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 ,特殊符号用 \ 屏蔽
- >keys * // 显示所有 key
- >keys h?llo // 匹配 hello,hallo,hxllo 等
- >keys h*llo // 匹配 hllo 或 h***llo 等
- >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 的数据类型