Redis-5-实际应用

一、session丢失

本地请求不同服务器,session会覆盖

image-20201102100217410

二、分布式SpringSession共享

之前的方法:session广播

Spring-Session:把session数据存到redis中,每次getSession不去session中找,去redis中找,就不会丢了

token:客户端携带token,分布式使用

2.1添加依赖

也是个小框架

image-20201102100751870

2.2 使用

在启动类上打个注解即可,会自动将session存入redis

image-20201102100819542

image-20201102101026838

三、Redis秒杀

3.1商品数量:超卖

image-20201102101951954

解决方法:不用加锁,使用redis可以控制数量

3.2防止用户重复下单

image-20201102103901921

3.3抢到后添加商品

四、秒杀测试

4.1控制超卖

单进程本身没问题,多服务器多进程也没问题,不需要控制。下图leftpop为原子操作,一步执行,不会出问题;如果设置个number为5000,抢完了set回去,就会出问题,因为是多步执行,会被打断。

模拟秒杀5000个商品,商品个数可以控制住,但打印“second”会出问题(把下图return换成打印),因为是多步,会被打断,这个无所谓,关键的商品数量控制住了就行。

image-20201102104919670

4.2防止重复下单

4.3抢到后添加商品

商品数量控制住之后,抢商品

image-20201102140750107

模拟服务器处理不过来,把连接池参数调小(电脑性能高,就要调的很小)

image-20201102140728940

50000(电脑性能高,多设数量)个商品抢完了,但是往数据库里添加了三万多条商品

image-20201102140819593

以后用消息队列解决

五、Redis数据持久化

redis会在退出之前把内存中的数据永久保存到磁盘中,每次退出再登进来,redis的数据还在,说明进行了数据持久化

image-20201102141254766

5.1 RDB(redis database)

存储数据本身,照快照的时间长,因为要保存数据,但还原快

5.1.1 save指令

image-20201102143340230

image-20201102142221716

修改一下

image-20201102164903589

默认不用动

image-20201102165842965

快照就在这个地方

image-20201102142638485

查看日志命令,你在另一个会话打的所有命令都会显示在上面,不会关闭窗口,都会显示

image-20201102142835499

保存的意义在于可以还原数据:把存的rdb拷贝一份,数据就回来了

save指令的缺点:

image-20201102143437081

它save是个单线程的,整个保存,别的指令都会等待保存完成,会阻塞在排队的命令

image-20201102143612640

5.1.2 bgsave指令(backgroud后台)

这个会新开一个进程,不会影响原来进程的操作,不会阻塞命令

image-20201102143659329

image-20201102144126121

image-20201102144012119

**redis的默认保存策略:**多少时间内有几个key发生变动,会自动调用bgsave:(可以在配置文件中改,改完重启)

image-20201102144727535

900 1 :15分钟内有1个key发生变动就会自动保存

image-20201102144432105

可以加个10 2 自己测试,界面会自动保存

5.1.3 RDB优缺点(背)

极端情况下还是会丢数据,真正要把数据永久保存还是要靠关系型数据库永久保存在硬盘上

版本不兼容

image-20201102144956273

5.2 AOF(append only file)用的多

存储的是操作指令,要把指令全部执行一遍,所以还原慢

5.2.1概念

不存在版本不兼容的情况,指令都是一样的

image-20201102145346556

5.2.2 三种存储策略

image-20201102173654530

默认不用动

image-20201102145759741

5.2.3 AOF开启

image-20201102173742043

这两个需要修改,appendfsync默认,dir之前配过不用再改

image-20201102174217580

同时有rdb和aof文件,启动时会默认还原aof文件,两个都在就不会发生问题,只有aof文件,之前的rdb文件还是会丢失

image-20201102150014822

5.2.4 AOF重写

bgrewriteaof指令

aof存的都是指令

image-20201102150237370

优化重复指令282—>119,但优化后里面的数据就看不懂了

image-20201102150400069

自动重写:

当新打的指令是原来的100%大写,后台会自动调用bgrewriteaof指令;当写的指令最大到64mb时也会自动调用(默认不用动)

image-20201102150520345

5.3 RDB和AOF的区别

image-20201102173958465

image-20201102174008467

六、主从复制

6.1概念

image-20201102153243854 image-20201102194238268

6.2搭建

搭建前备份之前的配置文件

image-20201102154439155

6381.conf

image-20201102154640544

6.2.1 方式一:客户端发送命令

首先把6379和6380的日志打开,tail -f

  1. 配置主机密码,注意:这个是从机要配的参数,不要去主机配置文件里配

image-20201102155157855

image-20201102154729363

  1. 进入6379和6380的客户端,在6380输入命令slaveof ip地址 端口

image-20201102155441703

image-20201102155517549

  1. 从机只能读不能写

image-20201102155540399

输入info命令查看从机自身信息,也可以查看主机信息

image-20201102155708935

6.2.2 方式二:启动服务器参数

image-20201102160201909

image-20201102160305503

6.2.3 方式三:服务器配置

真正的主从机配置用的就是这种方式,是固定的;不用像上面的方法一退出就没了,每次都要加参数,很麻烦。

此时就不配127.0.0.1了,配置自己的真实ip地址

image-20201102160924857

image-20201102160546637

6.2.4 主机挂了,没有哨兵,自己重新配置主机

主机挂了,从机可以工作,从机只能读不能写,在从机输入命令,它就临时变为主机了,但是一重启又变成从机了,还要去连主机

image-20201102161253812

七、哨兵模式