Redis-5-实际应用
一、session丢失
本地请求不同服务器,session会覆盖
二、分布式SpringSession共享
之前的方法:session广播
Spring-Session:把session数据存到redis中,每次getSession不去session中找,去redis中找,就不会丢了
token:客户端携带token,分布式使用
2.1添加依赖
也是个小框架
2.2 使用
在启动类上打个注解即可,会自动将session存入redis
三、Redis秒杀
3.1商品数量:超卖
解决方法:不用加锁,使用redis可以控制数量
3.2防止用户重复下单
3.3抢到后添加商品
四、秒杀测试
4.1控制超卖
单进程本身没问题,多服务器多进程也没问题,不需要控制。下图leftpop为原子操作,一步执行,不会出问题;如果设置个number为5000,抢完了set回去,就会出问题,因为是多步执行,会被打断。
模拟秒杀5000个商品,商品个数可以控制住,但打印“second”会出问题(把下图return换成打印),因为是多步,会被打断,这个无所谓,关键的商品数量控制住了就行。
4.2防止重复下单
4.3抢到后添加商品
商品数量控制住之后,抢商品
模拟服务器处理不过来,把连接池参数调小(电脑性能高,就要调的很小)
50000(电脑性能高,多设数量)个商品抢完了,但是往数据库里添加了三万多条商品
以后用消息队列解决
五、Redis数据持久化
redis会在退出之前把内存中的数据永久保存到磁盘中,每次退出再登进来,redis的数据还在,说明进行了数据持久化
5.1 RDB(redis database)
存储数据本身,照快照的时间长,因为要保存数据,但还原快
5.1.1 save指令
修改一下
默认不用动
快照就在这个地方
查看日志命令,你在另一个会话打的所有命令都会显示在上面,不会关闭窗口,都会显示
保存的意义在于可以还原数据:把存的rdb拷贝一份,数据就回来了
save指令的缺点:
它save是个单线程的,整个保存,别的指令都会等待保存完成,会阻塞在排队的命令
5.1.2 bgsave指令(backgroud后台)
这个会新开一个进程,不会影响原来进程的操作,不会阻塞命令
**redis的默认保存策略:**多少时间内有几个key发生变动,会自动调用bgsave:(可以在配置文件中改,改完重启)
900 1 :15分钟内有1个key发生变动就会自动保存
可以加个10 2 自己测试,界面会自动保存
5.1.3 RDB优缺点(背)
极端情况下还是会丢数据,真正要把数据永久保存还是要靠关系型数据库永久保存在硬盘上
版本不兼容
5.2 AOF(append only file)用的多
存储的是操作指令,要把指令全部执行一遍,所以还原慢
5.2.1概念
不存在版本不兼容的情况,指令都是一样的
5.2.2 三种存储策略
默认不用动
5.2.3 AOF开启
这两个需要修改,appendfsync默认,dir之前配过不用再改
同时有rdb和aof文件,启动时会默认还原aof文件,两个都在就不会发生问题,只有aof文件,之前的rdb文件还是会丢失
5.2.4 AOF重写
bgrewriteaof指令
aof存的都是指令
优化重复指令282—>119,但优化后里面的数据就看不懂了
自动重写:
当新打的指令是原来的100%大写,后台会自动调用bgrewriteaof指令;当写的指令最大到64mb时也会自动调用(默认不用动)
5.3 RDB和AOF的区别
六、主从复制
6.1概念
6.2搭建
搭建前备份之前的配置文件
6381.conf
6.2.1 方式一:客户端发送命令
首先把6379和6380的日志打开,tail -f
- 配置主机密码,注意:这个是从机要配的参数,不要去主机配置文件里配
- 进入6379和6380的客户端,在6380输入命令slaveof ip地址 端口
- 从机只能读不能写
输入info命令查看从机自身信息,也可以查看主机信息
6.2.2 方式二:启动服务器参数
6.2.3 方式三:服务器配置
真正的主从机配置用的就是这种方式,是固定的;不用像上面的方法一退出就没了,每次都要加参数,很麻烦。
此时就不配127.0.0.1了,配置自己的真实ip地址
6.2.4 主机挂了,没有哨兵,自己重新配置主机
主机挂了,从机可以工作,从机只能读不能写,在从机输入命令,它就临时变为主机了,但是一重启又变成从机了,还要去连主机