营销型网站手机端,聋哑工作设计做网站,中医药文化建设网站,怎样建个小公司的网站目录 Redis面试常见问题
如果发生了缓存穿透、击穿、雪崩#xff0c;该如何解决#xff1f;
缓存穿透
什么是布隆过滤器#xff1f;
缓存击穿
缓存雪崩
双写一致性#xff08;redis做为缓存#xff0c;mysql的数据如何与redis进行同步呢#xff1f;#xff09;
…目录 Redis面试常见问题
如果发生了缓存穿透、击穿、雪崩该如何解决
缓存穿透
什么是布隆过滤器
缓存击穿
缓存雪崩
双写一致性redis做为缓存mysql的数据如何与redis进行同步呢
1.若一致性要求高强一致方案分布式锁
2.延时双删
数据的持久化
Redis持久化
RDB的执行原理
AOF执行原理
RDB与AOF对比
编辑
Redis的数据过期策略有哪些
Redis数据删除策略-惰性删除
Redis数据删除策略-定期删除
Redis的数据淘汰策略有哪些
数据淘汰策略
数据淘汰策略-使用建议 Redis面试常见问题 Redis面试八股主要分为使用场景问题和如何保障高并发问题。其中使用场景问题包括
Redis的数据持久化策略有哪些什么是缓存穿透怎么解决什么是布隆过滤器什么是缓存击穿怎么解决什么是缓存雪崩怎么解决redis双写问题Redis分布式锁如何实现Redis实现分布式锁如何合理的控制锁的有效时长Redis的数据过期策略有哪些Redis的数据淘汰策略有哪些 高并发问题包括
Redis集群有哪些方案什么是 Redis 主从同步场景使用Redis是单点还是集群 ? 哪种集群Redis分片集群中数据是怎么存储和读取的redis集群脑裂怎么保证redis的高并发高可用事务的命令有哪些Redis是单线程的但是为什么还那么快
如果发生了缓存穿透、击穿、雪崩该如何解决
缓存穿透 缓存穿透是指查询一个一定不存在的数据由于存储层查不到数据因此不写入缓存这将导致这个不存在的数据每次请求都要到 DB 去查询可能导致 DB 挂掉。这种情况大概率是遭到了攻击。解决方案的话我们通常都会用布隆过滤器来解决它。 解决方案一缓存空数据查询返回的数据为空仍把这个空结果进行缓存但可能会发生数据库和Redis不一致的问题
解决方案二布隆过滤器
什么是布隆过滤器 布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是Redisson实现的布隆过滤器。它的底层原理是先初始化一个比较大的数组里面存放的是二进制0或1。一开始都是0当一个key来了之后经过3次hash计算模数组长度找到数据的下标然后把数组中原来的0改为1。这样三个数组的位置就能标明一个key的存在。查找的过程也是一样的。 布隆过滤器有可能会产生一定的误判我们一般可以设置这个误判率大概不会超过5%。其实这个误判是必然存在的要不就得增加数组的长度。5%以内的误判率一般的项目也能接受不至于高并发下压倒数据库。 缓存击穿 缓存击穿的意思是:redis某个热点key过期或者刚开始但是此时有大量的用户访问该过期key或者大并发场景下刚开始这个数据只在数据库里不在缓存里这个时候大并发的请求可能会瞬间把 DB 压垮。 解决方案有两种方式
第一可以使用互斥锁当缓存失效时不立即去load db先使用如 Redis 的 SETNX 去设置一个互斥锁。当操作成功返回时再进行 load db的操作并回设缓存否则重试get缓存的方法。 第二种方案是设置当前key逻辑过期大概思路如下
1) 在设置key的时候设置一个过期时间字段一块存入缓存中不给当前key设置过期时间
2) 当查询的时候从redis取出数据后判断时间是否过期
3) 如果过期则开通另外一个线程进行数据同步当前线程正常返回数据这个数据可能不是最新的。
总结两种方案各有利弊如果选择数据的强一致性建议使用分布式锁的方案但性能上可能没那么高且有可能产生死锁的问题。如果选择key的逻辑删除则优先考虑高可用性性能比较高但数据同步这块做不到强一致。 缓存雪崩 缓存雪崩是设置缓存时采用了相同的过期时间导致缓存在某一时刻同时失效请求全部转发到DBDB瞬时压力过重而雪崩。与缓存击穿的区别是雪崩是很多key而击穿是某一个key缓存。 解决方案主要是给缓存业务添加降级限流策略或者给业务添加多级缓存。可以将缓存失效时间分散开。比如可以在原有的失效时间基础上增加一个随机值比如1-5分钟随机。这样每一个缓存的过期时间的重复率就会降低就很难引发集体失效的事件。
双写一致性redis做为缓存mysql的数据如何与redis进行同步呢
不同的业务场景有不同的策略面试时一定要根据业务实际情况回答。
双写一致性当修改了数据库的数据也要同时更新缓存的数据缓存和数据库的数据要保持一致 1.若一致性要求高强一致方案分布式锁
采用redisson实现的读写锁。 在读的时候添加共享锁可以保证读读不互斥读写互斥(其他线程可以一起读但是不能写)。当我们更新数据的时候添加排他锁它是读写读读都互斥其他线程不能读也不能写这样就能保证在写数据的同时是不会让其他线程读数据的避免了脏数据。排他锁底层使用也是setnx保证了同时只能有一个线程操作锁住的方法。
共享锁读锁readLock加锁之后其他线程可以共享读操作。
排他锁独占锁writeLock也叫加锁之后阻塞其他线程读写操作。 2.延时双删
策略原理延时双删策略的核心是在写库操作的前后分别进行删除缓存操作并设定合理的超时时间来确保读请求结束写请求可以删除可能产生的缓存脏数据。具体步骤先删除缓存再写数据库然后线程休眠一段时间比如500毫秒最后再次删除缓存。休眠时间的确定需要评估项目读数据业务逻辑的耗时并考虑Redis和数据库主从同步的耗时。优缺点这种策略能在一定程度上解决数据不一致的问题但增加了写请求的耗时并且在最差的超时时间内数据仍可能存在不一致性。 延时删除的具体方案异步通知保证数据的最终一致性 基于Canal的异步通知 总结 允许延时一致的业务采用异步通知 使用MQ中间中间件更新数据之后通知缓存删除 利用canal中间件不需要修改业务代码伪装为mysql的一个从节点canal通过读取binlog数据更新缓存。强一致性的采用Redisson提供的读写锁 共享锁读锁readLock加锁之后其他线程可以共享读操作 排他锁独占锁writeLock也叫加锁之后阻塞其他线程读写操作 数据的持久化
在Redis中提供了两种数据持久化的方式1、RDB 2、AOF
Redis持久化 RDB全称Redis Database Backup fileRedis数据备份文件也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后从磁盘读取快照文件恢复数据。
RDB的执行原理 bgsave开始时会fork主进程得到子进程子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术 当主进程执行读操作时访问共享内存 当主进程执行写操作时则会拷贝一份数据执行写操作。 AOF执行原理 AOF全称为Append Only File追加文件。Redis处理的每一个写命令都会记录在AOF文件可以看做是命令日志文件。 因为是记录命令AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作但只有最后一次写操作才有意义。通过执行bgrewriteaof命令可以让AOF文件执行重写功能用最少的命令达到相同效果。Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置。
RDB与AOF对比 Redis的数据过期策略有哪些
Redis数据删除策略-惰性删除 惰性删除设置该key过期时间后我们不去管它当需要该key时我们在检查其是否过期如果过期我们就删掉它反之返回该key。
优点 对CPU友好只会在使用该key时才会进行过期检查对于很多用不到的key不用浪费时间进行过期检查。
缺点 对内存不友好如果一个key已经过期但是一直没有使用那么该key就会一直存在内存中内存永远不会释放。
Redis数据删除策略-定期删除 定期删除每隔一段时间我们就对一些key进行检查删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查并删除其中的过期key)。
定期清理有两种模式
SLOW模式是定时任务执行频率默认为10hz每次不超过25ms以通过修改配置文件redis.conf 的hz 选项来调整这个次数FAST模式执行频率不固定但两次间隔不低于2ms每次耗时不超过1ms
优点可以通过限制删除操作执行的时长和频率来减少删除操作对 CPU 的影响。另外定期删除也能有效释放过期键占用的内存。 缺点难以确定删除操作执行的时长和频率。
Redis的过期删除策略惰性删除 定期删除两种策略进行配合使用。
Redis的数据淘汰策略有哪些
数据淘汰策略 数据的淘汰策略当Redis中的内存不够用时此时在向Redis中添加新的key那么Redis就会按照某一种规则将内存中的数据删除掉这种数据的删除规则被称之为内存的淘汰策略。
Redis支持8种不同策略来选择要删除的key
noeviction 不淘汰任何key但是内存满时不允许写入新数据默认就是这种策略。volatile-ttl 对设置了TTL的key比较key的剩余TTL值TTL越小越先被淘汰allkeys-random对全体key 随机进行淘汰。volatile-random对设置了TTL的key 随机进行淘汰。allkeys-lru 对全体key基于LRU算法进行淘汰volatile-lru 对设置了TTL的key基于LRU算法进行淘汰allkeys-lfu 对全体key基于LFU算法进行淘汰volatile-lfu 对设置了TTL的key基于LFU算法进行淘汰 LRULeast Recently Used最近最少使用。用当前时间减去最后一次访问时间这个值越大则淘汰优先级越高。 LFULeast Frequently Used最少频率使用。会统计每个key的访问频率值越小淘汰优先级越高。 数据淘汰策略-使用建议 优先使用 allkeys-lru 策略。充分利用 LRU 算法的优势把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分建议使用。如果业务中数据访问频率差别不大没有明显冷热数据区分建议使用 allkeys-random随机选择淘汰。如果业务中有置顶的需求可以使用 volatile-lru 策略同时置顶数据不设置过期时间这些数据就一直不被删除会淘汰其他设置过期时间的数据。如果业务中有短时高频访问的数据可以使用 allkeys-lfu 或 volatile-lfu 策略。 选用Redis八股Docs