Loading

面试-redis

为什么快

1.完全基于内存,数据结构类似于HashMap,查找时间复杂度O(1)。
2.单线程,避免上下文切换。不存在各种加锁释放锁。
3.使⽤多路I/O复⽤模型,⾮阻塞IO;

常见数据结构

1.string
2.hash
3.list
4.set
5.sorted set

持久化机制

1.rdb 快照 在redis.conf种配置
save 900 1 #在900秒(15分钟)之后,如果⾄少有1个key发⽣变化,Redis就会⾃动触发BGSAVE命令创建快照。
save 300 10 #在300秒(5分钟)之后,如果⾄少有10个key发⽣变化,Redis就会⾃动触发BGSAVE命令创建快照。
save 60 10000 #在60秒(1分钟)之后,如果⾄少有10000个key发⽣变化,Redis就会⾃动触发BGSAVE命令创建快照
2.aof 追加文件 配置文件
appendfsync always #每次有数据修改发⽣时都会写⼊AOF⽂件,这样会严重降低Redis的速度
appendfsync everysec #每秒钟同步⼀次,显示地将多个写命令同步到硬盘
appendfsync no #让操作系统决定何时进⾏同

缓存雪崩

缓存同⼀时间⼤⾯积的失效,所以,后⾯的请求都会落到数据库上
事前:热点数据永不过期,更新操作时更新缓存;过期时间加随机数;尽量保证整个 redis 集群的⾼可⽤性,发现机器宕机尽快补上。选择合适的内存淘汰策略。
事中:本地ehcache缓存 + hystrix限流&降级,避免MySQL崩掉
事后:利⽤ redis 持久化机制保存的数据尽快恢复缓存

缓存穿透

缓存穿透说简单点就是⼤量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上
1.做好参数校验
2.布隆过滤器
把所有可能存在的请求的值都存放在布隆过滤器中,当⽤户请求过来,我会先判断⽤户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会⾛下⾯的流程。

缓存击穿

非常热点的数据在失效的瞬间大量并发请求进来导致数据库崩溃
热点数据永不过期;加互斥锁

如何保证缓存与数据库双写时的数据⼀致性

一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去

主从同步

master去写,数据通过rdb和aof同步给slave,slave去读

删除策略

定期删除+惰性删除
默认100s就随机抽⼀些设置了过期时间的key,去检查是否过期,过期了就删了。
我等你来查询了我看看你过期没,过期就删了还不给你返回,没过期该怎么样就怎么样

posted @ 2023-06-16 11:37  风萧萧5  阅读(5)  评论(0编辑  收藏  举报