2022-06-06

1.Springmvc执行流程
几个组件名称:
1.前端控制器DispatcherServlet
2.处理器映射器HandlerMapping
3.处理器适配器HandlerAdapter
4.视图解析器ViewReslover

  1. 浏览器发送请求到DispatcherServlet;
  2. DispatcherServlet收到请求后调用HandlerMapping
  3. HandlerMapping找到对应的处理器,生成处理器对象交还给DispatcherServlet;
  4. DispatcherServlet调用HandlerAdapter处理器适配器;
  5. HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器);
  6. Controller执行完成返回ModelAndView;
  7. HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet;
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器;
  9. ViewReslover解析后返回具体View;
    10.DispatcherServlet根据View进行渲染视图-将模型数据填充至视图中-DispatcherServlet响应用户 ;
    2.spring的核心IOC和AOP是什么有什么好处
    1.IOC是进行依赖注入后对象控制反转编程思想
    实际商用开发的项目中有很多的类,每个类都有着他自己特有的功能,并且通过类与类之间的协调工作来完成特定的业务逻辑,这时候每个类都需要负责管理与自己有交互的类的引用和依赖,传统编程方式需要将这些类交织在业务层代码里面,代码会变得异常的难以维护和极度的高耦合,而IOC的出现正是为了解决这一问题,我们通过IOC将这些相互依赖对象的创建,之后交给spring去处理,每个对象只需要关心自己的业务逻辑关系即可,从这个角度来说,获取对象的方式发生的反转,变成了由spring容器控制对象,从而实现了类与类之间的解耦合。
    2.AOP面向切面编程思想
    AOP就是通过为项目中某些对象创建动态代理对象通过动态代理对象解决现有项目中通用的问题,例如日志,性能记录,和一些异常处理.AOP代表的是一个横向的关系,程序的执行时顺序执行的,我们可以简单的理解为一个线性执行,自上而下,就像一条线,所谓切面编程,就是说在这条线的某一点处切开,放入另一个程序,这个过程也就是我们所谓的编织, 而被切入处我们可以用几何常识形象的称之为切面.
    3.Redis持久化
    Redis的持久化有两种方式:RDB和AOF,redis默认采用的是RDB的方式。

在默认配置中使用RDB方案,Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中。
可以配置持久化策略:save N M,让redis在“N秒内至少有M个改动”才会触发一次rdb持久化操作。
例如redis的默认策略有:
save 900 1 – 900秒内至少有一个改动
save 300 10 – 300秒内至少有10个改动
save 60 10000 – 60秒内至少有10000个改动
还可以手动执行命令生成RDB快照,进入redis客户端执行命令save或bgsave可以生成dump.rdb文件,
每次命令执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。
RDB方案优缺点:
优点:应为dump.rdb文件是二进制文件,所以当redis服务崩溃恢复的时候,能很快的将文件数据恢复到内存之中
缺点:RDB每次持久化需要将所有内存数据写入文件,然后替换原有文件,当内存数据量很大的时候,频繁的生成快照会很耗性能。如果将生成快照的策略设置的时间间隔很大,会导致redis宕机的时候丢失过的的数据。

AOF持久化方式:
在使用AOF方式时,redis每执行一次修改数据命令,都会将该命令追加到appendonly.aof文件中(先写入os cache,然后通过fsync刷盘)。
可以通过修改配置文件来使用AOF:
appendonly yes
redis重启的时候,会重放appendonly.aof中的命令恢复数据
AOF可以配置三种刷盘策略:
appendfsync always:每次执行写命令都会刷盘,非常慢,也非常安全。
appendfsync everysec:每秒刷盘一次,兼顾性能和安全。
appendfsync no:将刷盘操作交给系统,很快,不安全。
redis重启的时候,会重放appendonly.aof中的命令恢复数据。

优点:可以保持更高的数据完整性,如果设置追加file的时间是1s,如果redis发生故障,最多会丢失1s的数据;且
如果日志写入不完整支持redis-check-aof来进行日志修复;AOF文件没被rewrite之前(文件过大时会对命令进行
合并重写),可以删除其中的某些命令(比如误操作的flushall)。
缺点:AOF文件比RDB文件大,且恢复速度慢。
4.怎么理解redis操作的原子性
对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。

5.并发情况下如何保证redis与数据库数据的一致性
ABC3个线程同时访问数据库和缓存,A做更新数据库操作,BC读数据库操作,出现数据不一致情景:

普通双删策略:(更新数据库操作的这个线程在更新数据库操作前后两次删缓存策略)
A线程做更新操作,先删除redis缓存,在做更新数据库操作之前,B线程进来了,B线程是读操作,首先会去redis缓存中查看是否有缓存,此时缓存已经被A线程删掉,那么B会去数据库读数据,此时A并没有对数据库做更新操作,B从数据库读到的仍然是旧数据,在B更新缓存之前,A线程又抢到线程时间片对数据库做了更新操作,然后立刻删除缓存(普通双删策略),最后B抢到线程时间片将读到的旧数据更新到缓存中,如果再有线程C进来读操作,就会从缓存中拿到旧的数据,就会出现数据库和缓存数据不一致的情况;

延时双删策略:
A线程做更新操作,先删除redis缓存,在做更新数据库操作之前,B线程进来了,B线程是读操作,首先会去redis缓存中查看是否有缓存,此时缓存已经被A线程删掉,那么B会去数据库读数据,此时A并没有对数据库做更新操作,B从数据库读到的仍然是旧数据,在B更新缓存之前,A线程又抢到线程时间片对数据库做了更新操作,并让A线程进入sleep()状态(延迟双删策略),此时B再次抢到线程时间片将读到的旧数据更新到缓存中,最后A线程休眠结束删除缓存,如果再有线程C进来读操作,发现没有缓存,就会去数据库中读数据,此时就能拿到A更新后的最新的数据,保证了数据一致性;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45663840

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值