1、Redis介绍
1.1、redis是什么?
Redis 是一种基于键值对的NoSQL数据库,实现缓存
NoSQL 非关系型数据库
Redis 会将所有数据都放在内存中,所以读写性能特别惊人
Redis 将内存中的数据 利用快照和日志的形式保存到硬盘上
Redis 还提供了键过期,发布订阅,事务,流水线等附加功能
1.2、重要特性
1) 速度快,Redis 的数据都存放在内存中
2)支持5种数据架构:
字符串 优惠券过期,帖子浏览数计数
哈希 mysql缓存,对应表关系
列表 排行榜
集合 兴趣爱好标签、共同好友、共同爱好、精确广告投放
有序集合
3) 持久化存储:
RDB:优点恢复速度快,占用空间少,缺点是可能会丢失数据
AOF :优点是安全性高,缺点是恢复速度慢,占用空间大
4)主从复制
5)高可用和分布式
哨兵、集群
6)简单稳定
1.3、Redis应用场景
1. 缓存--键过期
缓存session会话
缓存用户信息,找不到再去mysql找,找到后写回到redis,方便下次查找
2. 排行榜--列表&有序集合
热度排名排行榜
发布时间排行榜
3. 计数器应用--字符串
帖子浏览数
视频播放数
商品浏览数
4. 社交网路--集合
踩/赞,粉丝,共同好友/喜好,推送,打标签
5. 消息队列系统--发布订阅
配合ELK实现日志收集
第二章、Redis 安装部署
2.1、目录规划
### redis 下载目录
/data/soft/
### redis 安装目录
/opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
### redis 数据目录
/data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb
### redis 运维脚本
/root/scripts/redis_shell.sh
2.2、安装命令
### 编辑 hosts 文件
vim /etc/hosts
10.0.0.51 db01
10.0.0.52 db02
10.0.0.53 db03
mkdir -p /data/soft
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
cd /data/soft/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install
2.3、配置文件说明
cat > /opt/redis_cluster/redis_6379/conf/redis_6379.conf <<EOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51 127.0.0.1
### 监听端口
port 6379
### pid 文件和 log 文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为 0
databases 16
### 指定本地持久化文件的文件名,默认是 dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379
EOF
2.4、启动关闭服务
### 启动
[root@db01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
### 关闭
[root@db01 ~]# redis-cli -h db01 shutdown
3、Redis基本操作命令
3.1、全局命令
1.查看所有命键
keys *
十分危险的命令,线上禁止使用
2.查看键的总数
dbsize
3.查看键是否存在
exists key
如果存在返回1 ,不存在返回0
4.删除键
del key [key ...]
5.键过期
expire key seconds
Redis支持对键添加过期时间,过期自动删除键
通过ttl命令观察键的剩余时间
大于等于0:键剩余过期时间
-1:键没有设置过期时间
-2:键不存在
6、键的数据类型
type key
3.2、字符串
Redis 并不是简单地 key value 存储,实际上他是一个数据结构服务器,支持不同类型的值
1)通过 set 设置字符串值 ,get 获取字符串值
127.0.0.1:6379> set k2 100
OK
127.0.0.1:6379> get k2
"100"
2)INCR 命令将字符串值解析成整型,将其加1,结果保存为新的字符串,类似命令:INCRBY、DECR、DEXCRBY
127.0.0.1:6379> INCR k2
(integer) 101
127.0.0.1:6379> INCRBY k2 10
(integer) 111
127.0.0.1:6379> DECR k2
(integer) 110
127.0.0.1:6379> DECRby k2 10
(integer) 100
3)mset和mget可以一次存储或获取多个key对应的值
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
4)EXISTS命令返回1表示key的值存在,返回0表示key的值不存在,
DEL 删除key 对应的值,返回1 或0表示删除或者没被删除
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS n1
(integer) 0
127.0.0.1:6379> DEL k1
(integer) 1
127.0.0.1:6379> DEL n1
(integer) 0
5)TYPE 命令可以返回Key对应的和数据类型
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> TYPE k2
string
127.0.0.1:6379>
6)EXPIRE对Key设置超时时间,时间过后自动删除key
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> ttl k3 -----结果-1表示没设置超时时间
(integer) -1
127.0.0.1:6379> EXPIRE k3 10 -----设置超时时间10秒
(integer) 1
127.0.0.1:6379> ttl k3 -----超时时间剩余时间
(integer) 6
127.0.0.1:6379> ttl k3
(integer) 5
127.0.0.1:6379> ttl k3
(integer) 0
127.0.0.1:6379> ttl k3 ----返回结果-2表示key键不存在
(integer) -2
7) PERSIST去除超时时间
127.0.0.1:6379> get k4
"v4"
127.0.0.1:6379> EXPIRE k4 15
(integer) 1
127.0.0.1:6379> ttl k4
(integer) 12
127.0.0.1:6379> PERSIST k4
(integer) 1
127.0.0.1:6379> ttl k4
(integer) -1
3.3、列表
1)LPUSH 命令可向list的左边(头部)添加一个新元素
RPUSH 命令可向list的右边(尾部)添加一个新元素
LRANGE 可以从list中取出一定范围的元素
LPOP 命令可以从左边删除元素并返回删除的值
RPOP 命令可以从右边删除元素并返回删除的值
127.0.0.1:6379> lpush list A
(integer) 1
127.0.0.1:6379> lpush list B
(integer) 2
127.0.0.1:6379> Rpush list 1
(integer) 3
127.0.0.1:6379> Rpush list 2
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1
1) "B"
2) "A"
3) "1"
4) "2"
127.0.0.1:6379> lpop list
"B"
127.0.0.1:6379> rpop list
"2"
3.4、哈希
Hash 看起来就像一个'hash' 的样子,由键值对组成
HMSET 命令设置hash中的多个域
HGET 取回单个域
HMGET 取回一系列的值
127.0.0.1:6379> HMSET user:1000 name wanwan age 27 job it
OK
127.0.0.1:6379> HGET user:1000 name
"wanwan"
127.0.0.1:6379> HMGET user:1000 name age job
1) "wanwan"
2) "27"
3) "it"
127.0.0.1:6379> HGETall user:1000
1) "name"
2) "wanwan"
3) "age"
4) "27"
5) "job"
6) "it"
3.5、集合
1) 集合是字符串的无序排列
SADD 是指把新元素添加到set中
SMEMBERS 查看所有值
SREM 删除指定值
SDIFF 计算集合的差异成员
SINTER 计算集合的交集
SUNION 计算集合并集
127.0.0.1:6379> SADD set1 1 2 3 4 -----添加
(integer) 4
127.0.0.1:6379> SMEMBERS set1 -----查看
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> SREM set1 2 -----删除执行值
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> SADD set2 1 4 5 6
(integer) 4
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "4"
3) "5"
4) "6"
127.0.0.1:6379> SDIFF set1 set2 -----计算差异
1) "3"
127.0.0.1:6379> SDIFF set2 set1
1) "5"
2) "6"
127.0.0.1:6379> SINTER set1 set2 -----计算交集
1) "1"
2) "4"
127.0.0.1:6379> SUNION set1 set2 -----计算并集
1) "1"
2) "3"
3) "4"
4) "5"
5) "6"
4、Redis 持久化
4.1、持久化的两种方式
4.1.1、RDB持久化的优缺点和配置参数
可以在指定时间内生成数据集的时间点快照 (point-in-time snapshot)
优点:速度快,适合于备份,主从复制也是基于RDB持久化功能实现的
缺点:会有数据丢失
rdb 持久化核心配置参数
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
save 900 1 #900 秒(15 分钟)内有 1 个更改
save 300 10 #300 秒(5 分钟)内有 10 个更改
save 60 10000 #60 秒内有 10000 个更改
4.1.2、AOF持久化的优缺点和配置参数
记录服务器执行的所有写操作命令,并在服务器重新启动时,通过重新执行这些命令来还原数据集。
AOF文件中的命令全部以 redis 协议的格式来保存,新命令会被追加到文件末尾
优点:可以最大程度保证数据不丢失
缺点:速度慢,日志记录量级比较大
AOF持久化配置:
vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
appendonly yes #是否打开 aof 日志功能
appendfsync always #每 1 个命令,都立即同步到 aof
appendfsync everysec #每秒写 1 次
appendfsync no #写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到 aof.
4.2、面试题:Redis 持久化方式有哪些?有什么区别
持久化方式:RDB和AOF
区别:
rdb是基于快照的持久化,速度更快,一般用于备份,主从复制也是基于rdb持久化功能
aof是以追加的方式操作redis 日志的文件,可以最大成都保证数据的安全,类似于mysql的Binlog
5、Redis 安全认证
1)防火墙开放指定端口
2)更改默认端口
3)增加密码认证
[root@db01 ~]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
requirepass 123456
4)指定IP进行监听
[root@db01 ~]# vim /opt/redis_cluster/redis_6379/conf/redis_6379.conf
bind 10.0.0.51 127.0.0.1
6、Redis 主从复制
复制功能是高可用 redis 的基础
后面的哨兵和集群都是在复制的基础上实现高可用的
6.1、主从复制的原理
1)从库向主库发起同步请求
2)主库接收到从库的同步请求
3)主库开始bgsave生成rdb文件
4)主库生成完成之后保存在磁盘
5)主库将rdb文件发送给从库
6)从库接收主库的rdb文件
7)从库清空自己的数据
8)从库将接收的rdb文件载入到内存中
危险操作:主库不小心同步空的从库,会导致主库数据全部丢失
谨慎的操作流程:
1.在配置文件中加入slaveof IP 端口号,不要热更新配置
2.主库主动执行bgsave保存rdb文件,然后备份一份rdb文件
恢复操作:
1.主库停止复制关系,注释掉aof相关参数
2.停止主库
3.删除原有的rdb数据,重命名备份的rdb文件
4.重新启动数据库,将rdb文件导入到内存中
6.2、建立复制和断开复制
slaveof masterIP masterPORT
INFO repliaction 查看复制状态信息
slaveof no one
提示:线上操作要小心,切主后会清空之前所有的数据
7、Redis Sentinel (哨兵)
7.1、哨兵的介绍
Redis 主从复制模式下,主节点一但发生故障,需要人工干预将从节点晋升为主节点,很多应用场景无法接受
哨兵架构解决了redis人工干预的问题
7.2、哨兵主要功能
1)监控
Sentinel会不断的定期检查你的主从服务器是否运行
2)提醒
当监控到某个服务器出问题的时候,会发送通知
3)自动故障迁移
Sentinel会将失效的主服务器的其中的一个从节点升级成主服务器,并让失效服务器的其他从服务器改为复制新的主服务器
image.png
7.3、哨兵安装步骤
1)所有节点安装步骤:
mkdir -p /data/redis_cluster/redis_26379
mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
cat > /opt/redis_cluster/redis_26379/conf/redis_26379.conf<<EOF
bind $(hostname -i)
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
EOF
2)构建主从关系:
从库执行:
SLAVEOF 10.0.0.51 6379
3)所有节点启动哨兵:
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
4)所有节点检查服务
ps -ef|grep redis
5)查看哨兵配置文件
cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 10.0.0.51
port 26379
daemonize yes
logfile "/opt/redis_cluster/redis_26379/logs/redis_26379.log"
dir "/data/redis_cluster/redis_26379"
sentinel myid b853fb1cab74290fbf6b93cfc21eb05b5dd6e394
sentinel monitor mymaster 10.0.0.51 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 18000
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 2
sentinel leader-epoch mymaster 2
sentinel known-slave mymaster 10.0.0.53 6379
sentinel known-slave mymaster 10.0.0.52 6379
sentinel known-sentinel mymaster 10.0.0.53 26379 3d00754b3640bb499b353137e66e9339345558b0
sentinel known-sentinel mymaster 10.0.0.52 26379 a0c309af744faaedb91a7c31833b4b13b9081317
sentinel current-epoch 2
注意:
不要自己去改动哨兵的配置文件
7.3.1、哨兵配置文件解释
sentinel monitor mymaster 10.0.0.51 6379 2
#mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个 sentinel 节点同意
sentinel down-after-milliseconds mymaster 3000
#选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
sentinel parallel-syncs mymaster 1
#向新的主节点发起复制操作的从节点个数,1 轮询发起复制
sentinel failover-timeout mymaster 18000
#故障转移超时时间
7.4、哨兵故障恢复
1.先启动db01
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
2.启动哨兵
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf
3.从节点设置权重
db02和db03调权重
CONFIG SET slave-priority 0
4.重新发起选举
在db01上的26379节点执行
redis-cli -h 10.0.0.51 -p 26379 Sentinel failover mymaster
5.观察主从复制是否常
CONFIG SET slaveof
6.db01恢复权重
CONFIG SET slave-priority 100