Q:Redis三剑客(缓存穿透,缓存击穿,缓存雪崩)
1.缓存穿透
缓存穿透:是指用户查询的数据,在数据库和Redis中都没有记录,然后就会一直查询数据库,增加对数据库的访问压力。
解决方案
- 缓存空对象:代码维护较简单,但是效果不好。
- 布隆过滤器:代码维护复杂,效果很好
扩展:什么是布隆过滤器?
布隆过滤器是一个很长的二进制向量和一系列随机映射函数
布隆过滤器的优点:
- 时间复杂度低,增加和查询元素的时间复杂为O(N),(N为哈希函数的个数,通常情况比较小)
- 保密性强,布隆过滤器不存储元素本身
- 存储空间小,如果允许存在一定的误判,布隆过滤器是非常节省空间的(相比其他数据结构如Set集合)
布隆过滤器的缺点:
- 有点一定的误判率,但是可以通过调整参数来降低
- 无法获取元素本身
- 很难删除元素
2.缓存击穿
缓存击穿:就是热点数据在高并发的时候,数据到期,此时大量的访问同时访问数据库,导致数据库的压力剧增
解决方案
- 热点数据提前预热
- 设置热点数据永远不过期。
- 加锁 , 限流
3.缓存雪崩
缓存雪崩:既多个热点数据的缓存在同一时期失效,导致大量的用户访问到数据库,造成数据库压力飙升
解决方案
- 在缓存数据的Key设置随机值,使缓存不会同时失效
- 可以设置熔断机制,既当用户的流量达到一定阈值时,对后来请求到数据库的用户直接返回系统繁忙,防止过多的数据直接访问数据库
Q:Redis的数据持久化策略有哪些 ?
- RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。
- AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作
Q:Redis常用的数据类型
基础数据类型
- String:比如存储商品库存、万能的就可以用string结构
- Hash:像我过去存储一些对象结构,比如购物车这种,也用过hash
- List: 一些列表的场景,比如用户浏览历史,我之前都是用的list
- Set: 而对于一些高并发的点赞、收藏,我之前的技术方案用的是set
- ZSet:一些需要排行的场景,我们可以用zset,因为他的底层是压缩列表、跳表和哈希表
高级数据类型
- bitmap :用来签到的
- hyperloglog:做网站点击、访问量统计的
- geo :用来做地理坐标检索的
Q:Redis的数据过期策略
1.定期删除
操作:每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。
优缺点
- 优点:主动清理部分过期键,减少内存占用,且通过随机抽样和比例控制,避免频繁全量扫描导致的 CPU 消耗过高。
- 缺点:可能存在 “漏网之鱼”—— 部分过期键未被抽查到,会继续占用内存。
扩展
默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”即可,默认的值为hz 10定期删除的扫描并不是遍历所有的键值对,这样的话比较费时且太消耗系统资源。Redis 服务器采用的是随机抽取形式,每次从过期字典中,取出 20 个键进行过期检测,过期字典中存储的是所有设置了过期时间的键值对。如果这批随机检查的数据中有 25% 的比例过期,那么会再抽取 20 个随机键值进行检测和删除,并且会循环执行这个流程,直到抽取的这批数据中过期键值小于 25%,此次检测才算完成Redis 服务器为了保证过期删除策略不会导致线程卡死,会给过期扫描增加了最大执行时间为 25ms
2.惰性删除
操作:只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。
优缺点:
- 优点:只在访问时校验,无需额外 CPU 资源监控过期键,避免了对未被访问的过期键的无效处理。
- 缺点:若过期键长期未被访问,会一直占用内存(例如一个过期的冷数据键,始终无人访问,就会成为 “内存僵尸”)。
3.内存淘汰机制
操作:当 Redis 内存使用达到配置的maxmemory阈值时,即使存在未过期的键或未被清理的过期键,也会触发内存淘汰机制,删除部分键以释放内存。