Redis在大数据面试中的实际应用

发表时间: 2023-10-19 13:53

Redis 缓存穿透、缓存雪崩、缓存击穿

(1)缓存穿透是指查询一个一定不存在的数据。由于缓存命不中时会去查询数据库,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

解决方案:

①是将空对象也缓存起来,并给它设置一个很短的过期时间,最长不超过 5 分钟。

②采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。

(2)如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,就会造成缓存雪崩。

解决方案:尽量让失效的时间点不分布在同一个时间点。

(3)缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:可以设置 key 永不过期。

Redis 哨兵模式

(1)主从复制中反客为主的自动版,如果主机 Down 掉,哨兵会从从机中选择一台作为主机,并将它设置为其他从机的主机,而且如果原来的主机再次启动的话也会成为从机。

(2)哨兵模式是一种特殊的模式,首先 Redis 提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它独立运行。其原理是哨兵通过发送命令,等待 Redis 服务器响应,从而监控运行的多个 Redis 实例。

(3)当哨兵监测到 Redis 主机宕机,会自动将 Slave 切换成 Master,然后通过发布订阅模式通知其他服务器,修改配置文件,让他们换主机。

(4)当一个哨兵进程对 Redis 服务器进行监控,可能会出现问题,为此可以使用哨兵进行监控, 各个哨兵之间还会进行监控,这就形成了多哨兵模式。

Redis 数据类型

 String:字符串

 List:可以重复的集合

 Set:不可以重复的集合

 Hash:类似于 Map<String,String>

 Zser(sorted set):带分数的 set

热数据通过什么样的方式导入 Redis

提供一种简单实现缓存失效的思路:LRU(最近少用的淘汰)。

即 Redis 的缓存每命中一次,就给命中的缓存增加一定 TTL(过期时间)(根据具体情况来设定, 比如 10 分钟)。

一段时间后,热数据的 TTL 都会较大,不会自动失效,而冷数据基本上过了设定的 TTL就马上失效了。

Redis 的存储模式 RDB,AOF

Redis 默认开启 RDB 持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。

RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。

Redis 需要手动开启 AOF 持久化方式,默认是每秒将写操作日志追加到 AOF 文件中。

AOF 的数据完整性比 RDB 高,但记录内容多了,会影响数据恢复的效率。

Redis 针对 AOF 文件大的问题,提供重写的瘦身机制。

若只打算用 Redis 做缓存,可以关闭持久化。

若打算使用 Redis 的持久化。建议 RDB 和 AOF 都开启。其实 RDB 更适合做数据的备份,留一后手。AOF 出问题了,还有 RDB。

Redis 存储的是 k-v 类型,为什么还会有 Hash?

Redis 的 hash 数据结构是一个键值对(key-value)集合,他是一个 String 类型的 field和 value 的映射表,Redis 本身就是一个 key-value 类型的数据库,因此 Hash 数据结构等于在原来的 value 上又套了一层 key-vlaue 型数据。所以 Redis 的 hash 数据类型特别适合存储关系型对象。