java面经查缺补漏之三十八天(今天来学习redis)
本文参考:https://blog.****.net/qq939419061/article/details/105102777/
挑出其中一些我目前还未掌握的知识点,进行研究,详情更加具体的复习,可参考上面的链接,我认为这篇redis总结的还是很全很清楚的。
1.什么是缓存雪崩?
另外对于 “Redis 挂掉了,请求全部走数据库” 这样的情况,我们还可以有如下的思路:
事发前:实现 Redis 的高可用(主从架构 + Sentinel 或者 Redis Cluster),尽量避免 Redis 挂掉这种情况发生。
事发中:万一 Redis 真的挂了,我们可以设置本地缓存(ehcache) + 限流(hystrix),尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)
事发后:Redis 持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。
2. 什么是缓存穿透?
3.什么是缓存与数据库双写一致问题?
一般缓存更新操作比删除操作代价更大,还不如直接删除缓存的好。
4.redis过期建的删除策略?
先抛开 Redis 想一下几种可能的删除策略:
定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。
在上述的三种策略中定时删除和定期删除属于不同时间粒度的 主动删除,惰性删除属于 被动删除。
三种策略的优缺点:
- 定时删除对内存使用率有优势,但是对 CPU 不友好;
- 惰性删除对内存不友好,如果某些键值对一直不被使用,那么会造成一定量的内存浪费;
- 定期删除是定时删除和惰性删除的折中。
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
不淘汰策略,若超过最大内存,返回错误信息