redis复习篇(1)

大家好我是小明,今天不谈学习,准备面试。


文章目录

  • 1.缓存穿透
  • 2.缓存击穿
  • 3.缓存雪崩
  • [4. 双写一致(数据和缓存数据一致性)](#4. 双写一致(数据和缓存数据一致性))
    • [4.1 数据一致性高](#4.1 数据一致性高)
    • [4.2 允许数据延迟一致性,保证高性能](#4.2 允许数据延迟一致性,保证高性能)
  • [5. redis持久化(rdb, aof)](#5. redis持久化(rdb, aof))
    • [5.1 RDB运行原理](#5.1 RDB运行原理)
    • [5.2 AOF运行原理](#5.2 AOF运行原理)
  • 6.数据过期策略
    • [6.1 惰性删除](#6.1 惰性删除)
    • [6.2 定期删除](#6.2 定期删除)
  • 7.数据淘汰策略(内存被占满)
  • [8. 分布式锁](#8. 分布式锁)
    • [8.1 分布式锁的使用场景分析题](#8.1 分布式锁的使用场景分析题)
    • [8.2 redis的分布式锁的实现](#8.2 redis的分布式锁的实现)

1.缓存穿透

缓存穿透:查询一个不存在的数据,mysql查询不到也不会写入redis缓存,会导致每次请求都命中(查询)数据库。

解决:

方案一:

缓存空数据,mysql查询不到,返回空数据(null),把这个空结果进行缓存。

方案二:

使用布隆过滤器

缓存预热布隆过滤器,请求到布隆过滤器查询,不存在,直接返回。

redis内部也实现了布隆过滤器。


2.缓存击穿

缓存击穿:给每一个key设置一个过期时间,当key过期的时候,恰好这个时间点对这个key有大量的请求并发过来,这些请求瞬间把db压垮。

原因:

解决方案:

方案一:

互斥锁:

数据强一致性,性能差,适合和钱相关的业务逻辑。

方案二:

不设置过期时间

高可用,性能优。

3.缓存雪崩

缓存雪崩:在同一时间大量缓存key同时失效或者redis服务器宕机,带来的巨大压力。

解决方案:

  • 给不同的key添加TTL的随机值
  • 使用redis集群模式提高服务器可用性(哨兵,集群模式)
  • 给业务流程添加降级限流策略(保底策略)
  • 给业务添加多级缓存

4. 双写一致(数据和缓存数据一致性)

这个面试题回答的时候**一定**要回答前提(数据一致性高,允许延迟一致性)

4.1 数据一致性高

使用分布式锁:

使用读写锁

代码:

读锁

写锁:

4.2 允许数据延迟一致性,保证高性能

异步通知保证数据最终的一致性

需要保证mq的可靠性

面试回答:

5. redis持久化(rdb, aof)

redis提供了两种持久化的方式rdb和aof。

面试背景:

redis的数据是缓存在内存上的,redis重启后的数据是缓存在redis快照(在硬盘上面)。

主动备份

配置自动备份

5.1 RDB运行原理

bgsave开始时会frok(复制)一个子进程 ,子进程共享内存数据,完成frork后读取内存数据并写入RDB文件。

5.2 AOF运行原理

AOF是一个追加文件,redis处理每一个命令都会记录在AOF文件,可以看做是命令执行的日志文件。

从写策略


面试回答参考:

6.数据过期策略

redis数据过期删除策略有两种惰性删除定期删除

6.1 惰性删除

惰性删除:设置改该key过期时间后,我们不管它,当需要该key的时候。我们在检查是否过期,如果过期,我们就删除掉他,反之返回该key。

优点:对cpu友好

缺点:对内存不友好

6.2 定期删除

定期删除 :每隔一段时间,我们对一些key进行检查,删除里面过期的key。

定期清理有两种模式:

  • SLOW模式是定时任务,执行频率默认为10hz,每次执行不超过25ms,通过修改配置文件redis.conf的hz选项来调整
  • FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms。

优点 :可以通过限制删除操作执行的时长和频率来减少删除操作对cpu的影响。另外定期删除,也能有效释放过期键占用的内存。
缺点:难以确定删除操作执行的时长和频率。

redis过期策略:惰性删除+定期删除两种策略进行配合。

面试回答参考:

7.数据淘汰策略(内存被占满)

数据淘汰策略:当redis内存不够用时,此时redis在向内存添加新的key时,那么redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称为内存的淘汰策略。

一定要了解LFU,LRU的面试淘汰策略


8. 分布式锁

常见的使用场景:

抢卷,秒杀。

8.1 分布式锁的使用场景分析题

但是这种情况只能是单体服务下才行通,但是一个项目往往的是集群的,像下面这样子。

上面的代码就不合适了,这时候使用redis分布式锁。

8.2 redis的分布式锁的实现

命令

上锁命令可以简化成

java 复制代码
setnx lock value ex 10

redis如何合理设置锁的有效时长?

这点redis已经实现了,redis采用看门狗的机制,给锁添加执行时间。

实现代码

redisson分布式锁是否是可重入?

解释:

redisson是java封装的redis接口,redisson实现的时候是支持可重入的,但是redis的分布式锁是不可重入的。

实现原理和java的锁一样,即:

java在同一个线程里面,线程id是一样的,使用线程来id来判断是否为同一个线程,是同一个线程就可以获取锁,获取到锁,程序会使用一个hash结构记录线程id和重入次数,加锁的时候重入次数+1,解锁的时候-1。

redisson实现分布式锁主从一致性

现象:

加锁的逻辑没有同步到从节点,这个时候又有其他客户端执行加锁逻辑,这就不行了。

可以使用redisson红锁

能解决主从数据强一致性,但是性能太低了,建一采用zookeeper实现的分布式锁实现数据的强一致性。


好了,这次就到这里,小伙伴们再见。

相关推荐
施嘉伟16 小时前
一次生产环境 SQL 不走索引的排查过程
数据库·sql
踏浪无痕16 小时前
SQLInsight:从JDBC底层到API调用的零侵入SQL监控方案
数据库·后端·开源
小宇的天下16 小时前
Calibre nmDRC Results(19-1)
服务器·数据库·oracle
Web项目开发17 小时前
Mysql创建索引的SQL脚本,复制粘贴即可使用
数据库·sql·mysql
晴天¥18 小时前
Oracle如何在DBeaver上进行登录
数据库·oracle
2301_8002561118 小时前
事务处理-同步与调度-两阶段锁-隔离级别
数据库·oracle
小罗和阿泽18 小时前
MySql数据库系列 数据库基础操作
数据库·mysql
周末吃鱼18 小时前
mysql8.0支持CURRENT_DATE如何写
数据库·sql·mysql
kaico201818 小时前
MySQL的窗口函数
数据库·mysql
luming-0218 小时前
报错解决:IDEA终端输出和CMD终端输出Maven版本不一致
java·缓存·bug·intellij-idea