1、什么是缓存穿透?
缓存穿透是指查询一定某个key是否存在,每次不存在都查询DB会把DB压垮。
解决方案的话,我们通常都会用布隆过滤器来解决。
布隆过滤器:在查找一个数是否在一个集合中使用的,通过对数组长度取模,判断其是否在数组中来判断一个数是否存在,比如用3个数组,这样查找成功的概率大概是95%,就不用这么多数来存。
2、什么是缓存击穿,如何解决?
指的是在某一个时间节点,有一个过期的key,突然有大量的访问,这样会因为没有设置缓存而全都去查询后端的DB了。这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。
解决方案:可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法。
redis中,setnx的含义,就如下:
- SETNX():含义就是SET if Not Exists,有两个参数 setnx(key, value),该方法是原子的,如果key不存在,则设置当前key成功,返回1;如果当前key已经存在,则设置当前key失败,返回0。
3、什么是缓存雪崩,如何解决?
击穿是指一个key击穿,雪崩是指某个时间段,有大量的请求到redis当中,redis当中这些key都失效了,然后都访问后端的DB。
解决方案:可以将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样key就不在某一个时刻上了。
4、如何实现缓存数据与DB的数据一致性。
Redis通过多种策略和机制来保证缓存和数据库的一致性。
Cache Aside模式:这是最常见的策略,读操作时先查询缓存,如果缓存命中则返回数据;如果缓存未命中,则从数据库读取数据并写入缓存。写操作时,先更新数据库,然后删除缓存,确保缓存中的数据无效化。
异步更新和同步机制:Redis可以通过异步更新机制减少对数据库性能的影响,但可能带来一定的延迟。使用Redis事务可以将多个操作封装为一个原子操作,确保它们要么全部成功,要么全部失败。
分布式锁与事务:使用分布式锁确保操作的原子性和互斥性,防止多个客户端同时更新同一数据导致的冲突。
主从同步:在Redis Cluster中,主节点的数据变化会同步到从节点,保证数据的一致性。
实际项目中,当时采用的阿里的canal组件实现数据同步:不需要更改业务代码,部署一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数据更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,更新缓存即可。
5、Redis的持久化方式。
Redis有两种持久化的方式,RDB和AOF两种。一种是快照模式,一种是追加到文件上的模式。
6、什么是Redis的主从结构?
Redis主从结构是一种数据复制模式,其中一个Redis服务器(主节点)与其他Redis服务器(从节点)进行数据同步。主从结构可以提供以下功能:
数据冗余存储:主从结构可以用于数据冗余存储,以防止数据丢失。
读写分离:主节点负责处理写操作,从节点可以用于处理读操作,分担主节点压力。
高可用和故障转移:当主节点出现故障时,可以有一个或多个从节点提升为新的主节点,维护服务的可用性。
7、关于如何实现共享资源被互斥访问,就会用到分布式锁,什么是分布式锁?
在本地场景中,使用JDK自带的synchronized可以实现本地加锁。在商品抢购的场景中,一个商品为了防止超卖,就设定了分布式锁这么一个概念,多个线程中,只有一个线程可以拿到对应的锁。
8、redis如何实现分布式锁?
在 Redis 中, SETNX
命令是可以帮助我们实现互斥。基础命令,释放锁的话,直接通过 DEL
命令删除对应的 key。
9、Redis集群有几种方案。
主从复制、哨兵模式、Redis分片集群.
主从复制:一主多从,主负责写,从负责读。写后同步给从节点。
哨兵模式:定期检查主节点是否故障,如果故障,从节点升为主节点继续提供服务。
Redis分片集群:Redis集群引入了哈希槽,将数组分散在不同节点中,通过hash去找。
10、Redis是单线程的,但是为什么还那么快?
1、Redis是用C语言写的,比较快。
2、Redis是单线程服务,所以比较快。
11、Redis给缓存数据设置过期时间有什么用?
内存是很珍贵的资源,一般设置时间为1、5、15分钟的过期时间,具体视业务来定。
12、什么是Redis事务,保证一次执行的命令。
Redis 事务提供了一种将多个命令请求打包的功能。然后,再按顺序执行打包的所有命令,并且不会被中途打断,用得非常少。
13、什么是hotkey?
指有一些key,访问次数很多。通过拆分hotkey的方式,使得key落在不同的redis集群中,防止redis性能下降。