Redis面试真题总结(三)
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
文章收录在网站:http://hardyfish.top/
什么是缓存雪崩?该如何解决?
缓存雪崩是指在缓存中大量的缓存数据同时过期或者缓存服务器宕机,导致大量请求直接访问后端数据库
- 造成数据库压力过大,甚至引发系统崩溃。
缓存雪崩可能出现的原因包括:
缓存数据同时过期:
- 在某个时间点,大量的缓存数据同时过期,导致大量请求落到后端数据库。
缓存服务器宕机:
- 缓存服务器突然宕机或者故障,导致所有请求无法访问缓存,直接访问后端数据库。
为了解决缓存雪崩问题,可以采取以下措施:
设置缓存失效时间的随机性:
- 在设置缓存失效时间时,可以为不同的缓存设置不同的失效时间,以避免大量数据在同一时间内同时失效。
- 可以在原有失效时间的基础上加上一个随机的时间,使得失效时间分散化。
使用热点数据永不过期:
- 对于一些热点数据,可以将其缓存设置为永不过期
- 以保证热点数据在任何时候都可以快速访问,避免因过期导致的缓存雪崩。
实时监控和预警:
- 监控缓存系统的状态和数据过期情况,及时发现异常并采取相应的措施
- 例如提前进行缓存的更新操作,或者在缓存失效前主动将其刷新。
备份缓存服务:
- 部署多个独立的缓存服务器,以充分利用缓存的高可用性。
- 如果一个缓存服务器出现故障,其他服务器仍然可以继续提供缓存服务。
数据预热:
- 在系统启动时,将一些常用或重要的数据预先加载到缓存中,提前热身缓存,减少冷启动时缓存雪崩的风险。
限流和熔断机制:
- 对缓存系统进行限流控制,可以设置最大并发数、最大请求时间等
- 以及在缓存故障时启用熔断机制,防止大量请求直接落到后端数据库。
什么是缓存击穿?如何解决?
缓存击穿是指当缓存中没有某个
key
的数据,这当然会导致缓存无法命中,然后请求就会穿透缓存层,直接访问数据库。
- 如果这个不命中的请求不止一个,而是成千上万个同时发生
- 那么就会对数据库形成巨大的访问压力,可能会导致数据库访问瞬间崩溃。
最常见的缓存击穿场景就是有大量请求同时查询一个热点
key
- 但是此时缓存中该key的数据刚好过期,于是大量的请求就会直接穿透到数据库。
针对缓存击穿问题,常见的解决方案有:
设置热点数据永不过期
- 这种方法适用于某些更新不频繁但是访问非常频繁的热点数据。
缓存数据过期时间设置随机
- 防止同一时间大量数据过期现象发生。
使用互斥锁(Mutex key):
- 对于同一个
key
,只允许一个线程去加载数据,其他线程等待加载完成直接使用即可。服务降级与熔断:
- 如果数据库压力过大,可以暂时拒绝部分请求,让系统在承受的压力范围内运行。
布隆过滤器的原理是什么?它的优点是什么?缺陷是什么?
布隆过滤器(
Bloom Filter
)是一种数据结构,用于快速判断一个元素是否属于一个集合它的原理、优点和缺陷如下:
原理:
哈希函数:
- 布隆过滤器使用多个哈希函数(通常是非加密哈希函数),将输入元素映射成多个不同的位数组索引。
位数组:
- 布隆过滤器内部维护一个位数组,所有位的初始值都为0。
添加元素:
- 当要将一个元素添加到布隆过滤器中时,对该元素应用多个哈希函数,然后将相应位数组索引位置的位设置为1。
查询元素:
- 当要查询一个元素是否存在于布隆过滤器中时
- 同样对该元素应用多个哈希函数,检查相应位数组索引位置的位是否都为1。
- 如果所有位都为1,则可能存在;如果有任何一位为0,则一定不存在。
优点:
节省内存:
- 相比于使用散列表或集合等数据结构,布隆过滤器占用的内存较少,因为它只需要维护位数组。
快速查询:
- 布隆过滤器的查询操作非常快速,通常只需要几个哈希函数的计算和位的检查。
可用于大规模数据:
- 适用于处理大规模数据集,尤其是在内存有限的情况下
- 可以快速过滤掉大部分不可能存在的元素,减轻后续查询的压力。
缺陷:
误判率:
- 布隆过滤器可能会产生误判,即判断一个元素存在时,实际上它可能不存在。
- 这是因为多个元素可能映射到相同的位数组索引,导致冲突。
不支持删除:
- 由于布隆过滤器的位数组只能设置为1,不能删除元素。
- 如果需要删除元素,需要重新构建布隆过滤器。
容量不可扩展:
- 一旦位数组的大小确定,就不能动态扩展
- 因此需要在设计时估计好位数组的大小以应对数据规模的增长。
RDB 持久化?
RDB(
Redis Database
)持久化是Redis提供的一种数据持久化方法
- 它可以将内存中的数据以二进制的形式写入磁盘,以保证数据在重启或者异常情况下的持久性。
RDB持久化工作原理:
快照生成:
- 当触发RDB持久化时,Redis会将当前内存中的数据通过
fork()
系统调用创建一个子进程
- 由子进程负责在后台进行快照生成。
数据存储:
- 子进程会将内存中的数据按照指定的数据结构和格式保存到一个临时文件中。
替换原文件:
- 当持久化过程结束后,子进程会将临时文件替换原有的RDB文件。
恢复数据:
- 在Redis重启的时候,会通过加载RDB文件将数据重新读入内存中。
RDB持久化的优点:
性能高:
- 由于是在后台进行持久化操作,不会阻塞主线程,所以对Redis的性能影响较小。
容灾性强:
- 通过RDB文件,可以将数据备份到磁盘中,保证数据在异常情况下的可恢复性。
RDB持久化的缺点:
数据丢失:
- 由于RDB持久化是通过生成快照的方式进行的
- 如果Redis在最后一次持久化之后发生故障,会导致最后一次持久化之后的数据丢失。
时效性:
- RDB持久化是定期执行的,数据的持久化是在配置的时间间隔之后
- 因此在发生故障之前的数据可能会丢失。