文章目录

  • 1.什么是缓存穿透,怎么解决
  • 2.什么是缓存击穿,怎么解决
  • 3.什么是缓存雪崩,怎么解决
  • 4.双写一致性问题
  • 5.redisson添加的排他锁是如何保证读写、读读互斥的
  • 6.为什么不使用延迟双删
  • 7.redis做为缓存,数据的持久化是怎么做的
  • 8.redis的数据过期策略
  • 9.redis的数据淘汰策略


1.什么是缓存穿透,怎么解决

缓存穿透:查询一个不存在的数据,MySQL查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库

解决方案一:缓存空数据

当查询到一个不存在的数据,返回缓存空数据,但是当数据真正有的时候,缓存中还是空数据,就会导致数据不一致

解决方案二:布隆过滤器

redis 缓存是什么转码 redis缓存有什么作用_java

位图的思路:通过hash运算三次得到三个对应的值,如果三个值都为1即存在,如果其中一个不为1即不存在,存在一定的误判率,但完全可以接受

2.什么是缓存击穿,怎么解决

缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间吧DB压垮

解决方案一:互斥锁,强一致,性能差

解决方案二:逻辑过期,高可用,性能优,不能保证数据绝对一致

redis 缓存是什么转码 redis缓存有什么作用_缓存_02

3.什么是缓存雪崩,怎么解决

缓存雪崩:同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力
解决方案:
● 给不同的key的TTL添加随机值
● 利用Redis集群提高服务的可用性
● 给缓存业务添加降级限流策略 降级可做为系统的保底策略,适用于穿透、击穿、雪崩
● 给业务添加多级缓存

4.双写一致性问题

采用redisson实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读读,读写都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一锁才行。
注意:这种情况只有必须保证强一致性的时候才会使用

开发中大部分是允许短暂的不一致的,这个时候采用异步的方案
● 使用MQ中间件,更新数据之后,通知缓存删除
● 利用canal中间件,不需要修改业务代码,伪装为MySQL的一个从节点,canal通过读取binlog数据更新缓存

5.redisson添加的排他锁是如何保证读写、读读互斥的

排他锁底层使用也是setnx,保证了同时只能由一个线程操作锁住的方法

6.为什么不使用延迟双删

延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据,其中这个延时多久不太好确定,在演示的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用

7.redis做为缓存,数据的持久化是怎么做的

有两种方式,一种是RDB,一种是AOF

RDB是一个快照文件,它是把 redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据

AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据

redis 缓存是什么转码 redis缓存有什么作用_数据_03

RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令

8.redis的数据过期策略

第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key
第二种是定期删除,每隔一段时间,我们就对一些Key进行检查,删除里面过期的key
定期清理的两种模式:
● SLOW模式是定时任务,执行频率默认是10HZ,每次不超过25MS,以通过修改配置文件redis.conf的HZ选项来调整这个次数
● FAST模式执行频率不固定,每次时间循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms
Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用

9.redis的数据淘汰策略

  1. Redis提供了8种不同的数据淘汰策略,默认是noeviction不删除任何数据,内存不足直接报错
  2. LRU:最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高
  3. LFU:最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高
    平时开发过程种用的比较多的就是allkeys-lru,挑选最近最少使用的数据淘汰,把一些经常访问的key留在redis中

数据库有1000万数据,Redis只能缓存20W数据,如何保证Redis中的数据都是热点数据
回答:使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据