java面经查缺补漏之三十八天(今天来学习redis)

本文参考:https://blog.****.net/qq939419061/article/details/105102777/

挑出其中一些我目前还未掌握的知识点,进行研究,详情更加具体的复习,可参考上面的链接,我认为这篇redis总结的还是很全很清楚的。

1.什么是缓存雪崩?

java面经查缺补漏之三十八天(今天来学习redis)

另外对于 “Redis 挂掉了,请求全部走数据库” 这样的情况,我们还可以有如下的思路:

事发前:实现 Redis 的高可用(主从架构 + Sentinel 或者 Redis Cluster),尽量避免 Redis 挂掉这种情况发生。
事发中:万一 Redis 真的挂了,我们可以设置本地缓存(ehcache) + 限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:Redis 持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

2. 什么是缓存穿透?

java面经查缺补漏之三十八天(今天来学习redis)

3.什么是缓存与数据库双写一致问题?

java面经查缺补漏之三十八天(今天来学习redis)

 一般缓存更新操作比删除操作代价更大,还不如直接删除缓存的好。

4.redis过期建的删除策略?

先抛开 Redis 想一下几种可能的删除策略:

定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

在上述的三种策略中定时删除和定期删除属于不同时间粒度的 主动删除,惰性删除属于 被动删除。

三种策略的优缺点:

  1. 定时删除对内存使用率有优势,但是对 CPU 不友好;
  2. 惰性删除对内存不友好,如果某些键值对一直不被使用,那么会造成一定量的内存浪费;
  3. 定期删除是定时删除和惰性删除的折中。

Reids 采用的是 惰性删除和定时删除 的结合。

实际上 redis 是每隔 100ms 随机抽取一些 key 来检查和删除的。但是问题是,定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢?所以就是惰性删除了。获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。

但是实际上这还是有问题的,如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,咋整?
答案是:走内存淘汰机制。

5.redis的淘汰策略?

 

当内存不足以容纳新写入数据时,进行内存淘汰策略。


volatile-lru
从已设置过期时间的 KV 集中优先对最近最少使用(less recently used)的数据淘汰


volitile-ttl
从已设置过期时间的 KV 集中优先对剩余时间短(time to live)的数据淘汰


volitile-random
从已设置过期时间的 KV 集中随机选择数据淘汰


allkeys-lru
从所有 KV 集中优先对最近最少使用(less recently used)的数据淘汰


allKeys-random
从所有 KV 集中随机选择数据淘汰


noeviction
不淘汰策略,若超过最大内存,返回错误信息