Redis面试篇

目录

1.缓存穿透

2.缓存击穿

3.缓存雪崩

 4.数据的持久化


1.缓存穿透

发送一个get请求,我们会先去redis缓存中去查询该数据是否存在,如果不存在则去查询数据库,但是如果发送的是一个不存在的数据,数据库中查询不到,也不会直接写入缓存,如果有人恶意攻击,一直发送get请求来查询一个不存在的数据,会导致数据库压力过大而宕机。

解决方案:
1.在查询数据库为空时,向缓存中写入空数据,把null进行缓存。

这种处理方式的优点是处理简单,缺点是如果大量id都是null,缓存压力大,而且如果这个id后来被添加进来,而缓存中的数据还是null,就查询不到该数据(数据不一致问题)。

2.布隆过滤器:用于检索一个元素是否在一个集合中

 布隆过滤器也会存在误判,一般将误判率设置在5%左右,数组越大误判率越低。

2.缓存击穿

在某个key过期时间刚到的时候,在该时刻突然有大量的并发请求进来,这些请求在redis中查不到信息,便会大量访问数据库,把数据库压垮。

解决方案:

1.互斥锁:一个线程在请求数据时,查询缓存如果未命中,则会获取互斥锁,查询数据库,在数据库中查询到并写入缓存后再释放锁,在释放锁之前其他线程请求锁失败会一直休眠重试,直到数据写入缓存释放锁。

2.逻辑过期:数据永不过期,用一个字段来描述数据是否过期,线程1去访问该数据,如果已经逻辑过期,获取互斥锁,开启新线程2,用于缓存重建,从数据库中查询数据写入缓存,重置过期时间,线程1返回过期数据,线程3获取数据发现数据过期,获取锁失败,但是仍然返回过期的数据,知道线程2重建完,释放互斥锁,新的线程可以获取到最新的数据。

互斥锁可以保证数据强一致性,但是性能较差,逻辑过期高可用,性能好,但是不能保证数据的强一致性。

3.缓存雪崩

指的是在同一时段内大量的key同时失效或者redis服务器宕机。导致大量请求到达数据库,造成巨大压力。

1.大量key导致的,解决方法是给不同的key设置不同的过期时间,添加随机值。1~5分钟随机

2.redis服务器宕机导致:利用Redis集群提高服务的高可用性,哨兵模式,集群模式

3.给缓存业务添加降级限流的策略。 ngxin,spring cloud gateway(可作为保底策略)

4.给业务添加多级缓存

 4.双写一致性(mysql中的数据如何与redis进行同步)

双写一致性:修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据保持一致。

写操作:延迟双删  先删除缓存,修改数据库之后再删除一次缓存

解决方法:
1.分布式锁:读写都加锁

2.如果读多写少,缓存用的多,读数据时加共享锁,写数据时加排他锁。

如果允许数据短暂不一致:

1.异步通知:保证数据的最终一致性,MQ,cannal等中间件

 4.数据的持久化

1.RDB(Redis Database Backup file)Rdis数据备份文件,也被叫做Redis数据快照,把内存中的所有数据都记录到磁盘中,Redis实例故障重启之后,读取磁盘中的快照文件,恢复数据

执行原理:

2.AOF Append Only File(追加文件)

每个写命令都会记录到AOF文件中,可以看作是命令日志文件。

AOF是默认关闭的 需要在redis.conf文件中开启

每条改写操作都会写入AOF,但是通常只有最后一次改写是有效的,可以通过bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值