面试--缓存
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线上部署