突击训练第一季--缓存

1.项目中缓存是如果使用的?缓存如果不使用会造成什么后果?

最近项目:案件信息,登录后cms信息,人员信息等作缓存处理,

不使用?查询太慢,体验差,;高峰的时候,数据库连接(4-5千的请求?)承载不了造成奔溃

2. 为啥用缓存?、

作高性能,高并发

高性能:比如之前每次查询都要去连接数据库查询个六百毫秒,作了缓存后直接在缓存中返回,3毫秒搞定,性能提升200倍

高并发:数据库能承受的并发请求是有限的,而缓存走的是内存自然就能承受更好的并发请求。

3.使用缓存面临问题?

缓存和数据库双写不一致

缓存雪崩

缓存穿透

缓存并发竞争

 

4. 为什么redis单线程模型,还可以支持高并发?

纯内存操作,核心是基于非阻塞的IO多路复用机制,单线程反而避免了多线程的频繁上下文切换问题;

 

 

  首先,客户端与redis是通过socket建立通信的,那么在redis中就存在一个server socket,redis的IO多路复用器监听server socket的一个特定事件(AE_READABLE),将它压入到队列中,

然后redis的文件事件分派器,从队列中取出事件分派到相应的处理器(连接应答处理器,命令请求处理器,命令回复处理器)中处理。

有了这么一个通信机制后,客户发送命令请求后。。。。。。

5.redis都有哪些数据类型?分别在那些场景用合适?

string:作简单的set和get

hashmap:缓存结构化数据,比如简单对象

list:文章评论列表,下拉分页

set:无序集合,自动去重的数据

sorted  set:排名

6.redis的过期策略?

定期删除:

 redis每隔100m回随机删除设置过期时间的key,判断是否过期,过期删除

 惰性删除:

在获取数据的时候,检查key是否过期,过期删除

 7.怎么保证redis是高并发以及高可用的?主从复制原理?哨兵原理?

主从架构架构 --> 读写分离架构 --> 可支持水平扩展的读高并发架构

单主用来写数据,单机几万,多从用来读数据,多个实例可以提供每秒10万QPS.

 

 8.redis持久化方式? 

RDB:数据周期性持久化

AOF:指令作日志记录,redis重启后回放AOF日志,重构数据

9.redis的雪崩和穿透?

雪崩:redis挂,导致数据库挂,最后导致系统挂

  • 事前:redis高可用,主从+哨兵,避免全盘奔溃
  • 事中:本地ehcache缓存+hystrix限流&降级,避免mysql被打死
  • 事后:redis持久化,快读恢复数据

穿透:恶意请求,redis中没有,直接查数据库,导致数据库挂了

  • 缓存请求null值,恶意请求再来的时候,缓存中就有了,直接返回。eg:set -11 unknown

10.如何保证缓存与数据库的双写一致性?

读请求和写请求串行化,串行到一个队列中去,这样就可以保证,一定不会出现不一致的情况,但它会导致吞吐量大幅度减低。所以系统不是严格要求必须一致性的化,不建议做这样的方案。

11.redis的并发竞争问题解决方案

redis的分布式锁或者zk的分布式锁,推荐zk,需要value中带有时间戳

12 .redis线上部署

 

posted @ 2020-05-06 22:14  夜未眠shm  阅读(166)  评论(0编辑  收藏  举报