事情干的差不多了,开刷面试题和算法,争取在短时间内快速成长,理解java面试的常见题型
一、redis使用场景:
缓存:穿透、击穿、雪崩 双写一致、持久化 数据过期、淘汰策略
分布式锁:setnx、redisson
计数器:
保存token:
消息队列:
延迟队列:
二、其他面试题:
集群:主从 哨兵 集群
事务:
redis为什么快:
(1)、缓存穿透
缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会每次请求都查数据库
解决一:缓存空数据,查询返回的数据为空,仍把这个空结果进行缓存
优点:简单
缺点:小号内存,可能会发生不一致的问题
解决二:布隆过滤器
布隆过滤器的实现方案:redisson,Guava
优点:内存占用较少,没有多余key
缺点:实现复杂,存在误判
(2)缓存击穿
当redis的key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把db压垮
两种,一种是互斥锁恢复数据库数据,一种是逻辑过期
(3)缓存雪崩
缓存雪崩是指同一时段大量的缓存key失效或者redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方案:给不同的key的TTL添加随机值,利用redis集群提高服务的可用性,给缓存业务添加降级限流策略,给业务添加多级缓存
(4)双写一致性
读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间
写操作:延迟双删
不双删的话应对多线程会出现错误
第二种方法:分布式锁
共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
排他锁:独占锁writeLock也叫,枷锁周,阻塞其他线程读写操作
读数据时添加共享锁,读不互斥,写互斥
写数据时添加排他锁,读写互斥
(5)redis持久化
1、RDB
2、AOF
(6)redis过期策略
redis数据删除策略-惰性删除
惰性删除:设置该key过期时间后 ,不管,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key
定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量)
定期清理有两种模式:
SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整这个次数
FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
(7)数据淘汰策略
当redis中的内存不够用时,此时在向redis中添加新的key,那么redis就会按照某一种规则将内存中的数据删掉,这种数据的删除规则被称之为内存的淘汰策略
8种不同策略来选择要了删除的key: