day15(redis 搭建)

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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 标签: redis 缓存 主从 哨兵 集群 本文简单的介绍redis三种模式在linux的安装部署和数据存储的总结...
    luhanlin阅读 9,840评论 0 5
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 9,483评论 2 27
  • 本文将要介绍的哨兵,它基于 Redis 主从复制,主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可...
    java成功之路阅读 6,523评论 0 4
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 10,774评论 0 36
  • 四月桃花依旧 人依旧 转载相逢又十年 曾记否 心与心的敞开 是那般澄澈透明 毫无遮遮挡挡 不失人间烟火气 相互别离...
    周小锦阅读 3,372评论 2 6