Redis使用2

Redis使用2

1.发布订阅模式

例子:比如说你有一个收音机,你收听了xxxx频道,那么只要你你打开这个频道,你就能听到这个频道的所有内容
你的收音机 ----接收方(订阅方)
频道的内容发送方---内容的发布者
subscribe 订阅的频道的名称
publish 频道名称 内容
场景: 这个功能实际上就是MQ中的功能(消息中间件)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4s53BMll-1597687034043)(../../../qq截图/1587657198949.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mpsrh7E1-1597687034045)(../../../qq截图/1587657221283.png)]

2.Redis中事务问题

事务是具有原子性的,要么同时成功,要么同时失败

但是Redis没有事务

multi 开启事务  
exec  提交事务

3. rdb模式实现持久化

Redis是基于内存的,所以速度快,但是Redis的数据放在内存里面,当Redis重启的时候,这个数据就会丢失
 
假设我们把数据写入到内存的数据,持久化到硬盘,那是不是能保证我们的数据即使发生丢失,也不会全部丢失,或者说全部不丢失 ?

Redis的持久化就产生了---默认情况下 Redis本身也是有持久化策略的,我们即使不配置,Redis的持久化依然是存在的

rdb是数据库默认的持久化模式--又称为快照模式
这个模式是将内存的数据内容直接保存到dump.rdb这样的一个二进制文件中  在/usr/local/redis/bin目录下
特点: 因为保存的是二进制文件,所以做数据的恢复是相当快的---适合做数据的备份
rdb到底是如何保存数据的,rdb每一次保存数据的时候,首先会清空原有的dump.rdb文件,然后将整个内存中的数据全部写入到这个文件中
rdb保存的是redis某一时刻的数据(适合备份,不适合开发)
		比如说。刚好清空rdb文件,此时出现断电,宕机---数据就会全部丢失

什么时候,rdb模式会触发内存的数据与硬盘同步呢?(redis.conf)
save 900  1  在900秒的时间内如果有一个key发生变化,那么将触发内存与硬盘同步
save 300 10  在300秒的时间内如果有10个key发生改变,那么将会触发内存和硬盘同步
save 60 10000 在60秒的时间内如果有10000个key发生改变,那么将会触发内存和硬盘同步
rdb模式是不用开启的,这个模式的redis自动开启的

4.aof实现持久化

aof模式是在redis1.1的版本的时候,才增加的一种持久化模式
aof模式在使用的时候,保存的不是数据,是我们操作的时候的一条又一条的命令
只要调用了Redis,那么只要有命令的使用,都会被记录到aof文件中
aof---记录的是操作的命令,不记录实际的数据
aof模式如果是在数据恢复还原的时候,效率并不高,数据恢复一般采用rdb文件恢复是最快的

aof的使用
cd /usr/local/redis/etc/
vim redis.conf 
appendonly no 改为 appendonly yes
重启redis服务器,在/usr/local/redis/bin目录下会生成一个appendonly.aof 文件

appendonly.aof文件解析
*3   *代表的是命令的开始   3 :这个表示的是命令中一共有3块内容
$3   $使用修饰命令中的每一个参数的 3代表的是下面的这个命令一共有3个字符
set
$5
email
$5
xxxxx

aof的触发策略:
appendfsync always:只要有键发生改变,立马同步(每次都出发OI操作,速度就会慢下来,这种情况是不会丢数据)但是一般不用,因为效率太低了
appendfsync everysec:每一秒钟进行数据同步一次,(开发的时候,一般采用这个,速度也比较快,即使出现数据丢失,也只会丢失1秒钟的数据)
appendfsync no:永不同步,数据只是放到缓存里面,速度快,但是数据容易丢失

aof是如何实现数据同步的呢?
每一次在进行数据同步的时候,使用的是追加的模式,以前的数据不用删除,只需要追加新的数据

aof模式消息重写
no-appendfsync-on-rewrite no  :关闭自动重写
auto-aof-rewrite-percentage 100  (这个表示的是必须达到100%的增加才重写  64M+64M=128M )
auto-aof-rewrite-min-size 64mb   aof文件(简单的说就是至少aof文件达到64M才重写)
手动重写:
bgrewriteaof :这个命令就是手动重写(需要关闭混合持久化的功能)
aof-use-rdb-preamble no
重写的好处就是对aof文件进行优化,最终的结果都是一样的

如果同时开启rdb模式和aof模式,会以aof优先

5.混合持久化

我们在开发的时候,到底选择什么rdb还是aof?
如果关心的只是数据,但是仍然接受在一段时间内一些数据的丢失,那么使用rdb模式,速度快
如果在4.0版本以前,开发的时候,基本上都使用aof模式,在4.0以后,出现了一种新的持久化模式,混合持久化
混合持久化,具有rdb和aof的所有优点
aof-use-rdb-preamble yes

rdb:每一次出现重写的时候它会将aof的所有命令写成二进制
aof:每一次在追加的时候,他会直接写成命令的形式

6.Redis的缓存淘汰策略

maxmemory-policy volatile-lru :这个就是配置缓存淘汰策略
maxmemory <bytes> :这个是配置Redis的缓存的大小
noeviction: 只要缓存满了,那么就不会继续服务器里面的请求,读的请求是可以完成的,这种模式缓存里面的数据都不会丢失,但是会导致Redis的业务失败
volatile-lru (least recently used):最近最少使用算法:从设置了过期时间的key中选择空转时间最长的键值对清理掉
volatile-lfu(least frequently used):最近不经常使用算法:从设置了过期时间的key中,选中某一个时间段使用频率最小的键值对清理掉
volatile-ttl:从设置了过期时间的键中选择过期时间最早的键值对清除;
volatile-random:从设置了过期时间的键中,随机选择键进行清除;
allkeys-lru:最近最少使用算法,从所有的键中选择空转时间最长的键值对清除;
allkeys-lfu:最近最不经常使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除;
allkeys-random:所有的键中,随机选择键进行删除;

7 如何给Redis设置密码

打开redis.conf文件
requirepass foobared 修改foobared这个值
eg requirepass chaochao 那么密码就是chaochao

使用密码登录
auth chaochao

8.主从复制问题

场景: 一个redis服务器可以处理3000个请求,假设有5000个请求并发到来,这个服务器显然是不能承载的,这个时候,我们有这样一个思路:
就是将这5000个请求的读和写能够分离开,写的请求放到一台服务其上 ,读的请求放到另一台服务器上,也达到了解决问题的目的
读写分离:在进行写的操作的时候,在主服务器上进行,在执行读的操作的时候,在从服务器上进行
主从复制--就解决了读写分离的问题

1.主从复制的配置

1.准备两台或者更多的服务器
2.在两台服务器下的/usr/local/下创建一个文件夹
3.将redis解压目录的根目录下的redis.conf文件移动到创建的文件夹中
4.修改这个配置文件
主服务器 Master
daemonize yes    //后台启动
bind 0.0.0.0     //表示的是允许所有人访问
从服务器 Slaver
daemonize yes    //后台启动
bind 0.0.0.0     //表示的是允许所有人访问
添加一行配置
slaveof 主服务器的ip地址  主服务器端口
5.检查主从配置是否配置完成
./redis-server /usr/local/../redis.conf ..表示创建的文件夹名字
./redis-cli
info

9.哨兵模式

哨兵是安装在任意一台服务器上,跟主服务器没有任何关系
Redis2.0出现了哨兵模式,是为了解决单点问题
什么是单点问题:
在上面我们配置了主动复制,但是当主服务器崩溃,整个服务器就没办法访问的现象,就成为单点问题

哨兵具有监听程序的功能,简单来说,就是看监听主程序是否崩溃,如果主服务器在规定的时间内,没有给哨兵发送确认信息,那么哨兵就认为主服务器崩溃,哨兵就开始投票进行选举,选举一个从服务器作为新的主服务器,这样Redis依然可以正常提供功能
心跳信号:就是没过一段时间,就向服务器发送请求
哨兵的配置
1. 将Redis解压目录下的sentinal.xml文件复制到 /usr/local/../目录下 ..表示配置主从复制时放入redis.conf文件的目录
2.配置sentinal.xml文件
#配置的是配置文件的目录
dir /usr/local/../
#配置的是监听主服务器信息  最后一个参数很重要 一般设置为1  多少票通过
sentinel monitor mymaster 39.99.200.54(主服务器ip) 6379(端口号) 1
#配置的是意思是心跳信号发给你了 多久没回应就认为主服务器死了 单位(ms)...
sentinel down-after-milliseconds mymaster 5000

哨兵的启动命令
./redis-server /usr/local/../sentinel.conf  --sentinel &

10.集群模式

场景:随着系统并发量不停的增加(写的请求达到了5000,服务器支持的并发访问量只有3000),这时候,主从复制架构模式已经不能满足要求,这时候,集群模式就应运而生
集群模式具有主从复制和哨兵模式的优点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8TA4yhKP-1597687034047)(../../../qq截图/1587703084341.png)]

10.1 集群的实操

1. 因为使用同一台服务器来模拟集群,因此,先创建一个文件夹,在/usr/local目录下
mkdir /usr/local/redis-clusterl
2.在redis-clusterl下创建6个文件夹,分别模拟六台服务器
[root@iz2ze3nurz2xyybhmzu6s6z redis-clusterl]# mkdir 7001
[root@iz2ze3nurz2xyybhmzu6s6z redis-clusterl]# mkdir 7002
[root@iz2ze3nurz2xyybhmzu6s6z redis-clusterl]# mkdir 7003
[root@iz2ze3nurz2xyybhmzu6s6z redis-clusterl]# mkdir 7004
[root@iz2ze3nurz2xyybhmzu6s6z redis-clusterl]# mkdir 7005
[root@iz2ze3nurz2xyybhmzu6s6z redis-clusterl]# mkdir 7006
//这里文件夹的名字表示我们六台服务器的端口号
3.将redis解压目录下的redis.conf文件复制到7001中
cd /usr/local/redis-5.0.7
cp redis.conf /usr/local/redis-clusterl/7001
4.修改配置文件
cd /usr/local/redis-clusterl/7001
vim redis.conf

daemonize yes   	//修改后台启动
port 7001       	//修改redis的端口号为7001
bind 0.0.0.0		//允许所有机器访问
dir /usr/local/redis-clusterl/7001/  //修改配置文件的位置
appendonly yes      // 开启aof持久化模式
cluster-enabled yes		//开启集群模式
cluster-config-file nodes-7001.conf		//集群的配置
cluster-node-timeout 15000 			//超时时间
5.将修改后的配置文件分别给7002…7006复制一份
[root@iz2ze3nurz2xyybhmzu6s6z 7001]# cp redis.conf /usr/local/redis-clusterl/7002
[root@iz2ze3nurz2xyybhmzu6s6z 7001]# cp redis.conf /usr/local/redis-clusterl/7003
[root@iz2ze3nurz2xyybhmzu6s6z 7001]# cp redis.conf /usr/local/redis-clusterl/7004
[root@iz2ze3nurz2xyybhmzu6s6z 7001]# cp redis.conf /usr/local/redis-clusterl/7005
[root@iz2ze3nurz2xyybhmzu6s6z 7001]# cp redis.conf /usr/local/redis-clusterl/7006
6.将redis.conf文件中的7001修改为对应的端口号即可
cd /usr/local/redis-clusterl/7002
port 7002
cluster-config-file nodes-7002.conf
dir /usr/local/redis-clusterl/7002/
......
7、安装ruby的相关的工具(5.0的时候没有使用ruby去创建集群这个步骤可省略)
yum install ruby 
yum install rubygems
gem install redis
安装最后一个工具就出错了....
(centos7 安装较高版本ruby2.2/2.3/2.4+)按照步骤玩一次就对了
8.开启每一个服务
cd /usr/local/redis/bin/
./redis-server /usr/local/redis-clusterl/7001/redis.conf
./redis-server /usr/local/redis-clusterl/7002/redis.conf
./redis-server /usr/local/redis-clusterl/7003/redis.conf
./redis-server /usr/local/redis-clusterl/7004/redis.conf
./redis-server /usr/local/redis-clusterl/7005/redis.conf
./redis-server /usr/local/redis-clusterl/7006/redis.conf
9.创建集群
5.0以上的版本
redis-cli --cluster create 101.200.149.246:7001 101.200.149.246:7002 101.200.149.246:7003 101.200.149.246:7004 101.200.149.246:7005 101.200.149.246:7006 --cluster-replicas 1

注意:询问的时候要输入yes

低版本
./redis-trib.rb ./redis-trib.rb create --replicas 1 101.200.149.246:7001 101.200.149.246:7002 101.200.149.246:7003 101.200.149.246:7004 101.200.149.246:7005 101.200.149.246:7006

101.200.149.246:服务器的ip

登录集群某一个客户端的命令
./redis-cli -c -h 101.200.149.246 -p 7001
10 .面试题
1、如果集群中一个主服务器死了  那么整个集群的数据是否是完整的?
肯定是、因为主服务器死了之后会选举他自己原来的从服务器来完成接班操作
2、当死了的服务器从新启动之后 主服务器会自动的将数据同步给从服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值