面试 Redis 八股文十问十答第四期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)redis 的订阅发布功能有了解过吗?
Redis的订阅发布功能是一种消息通信模式,其中订阅者(subscriber)可以订阅频道(channel),发布者(publisher)向频道发布消息,订阅该频道的所有订阅者都会收到这条消息。这种模式可以用于实现实时消息传递、事件通知等功能。在Redis中,可以使用SUBSCRIBE
命令订阅频道,使用PUBLISH
命令向频道发布消息。
2)redis 如何实现分布式锁?
Redis可以通过SET命令的NX(如果键不存在则设置)或者XX(如果键存在则设置)选项来实现分布式锁。具体实现方法是,利用SET命令尝试在Redis中设置一个特定的键值对(锁),如果设置成功,则表示获取到了锁;如果设置失败,则表示锁已经被其他客户端获取,此时可以选择等待重试或者放弃获取锁。
3)分布式锁在未执行完逻辑之前就过期了怎么办?
如果分布式锁在未执行完逻辑之前就过期了,可以考虑使用带有自动续期功能的分布式锁实现。例如,在Redis中可以使用SET命令的EX选项(设置键的过期时间)来为锁设置一个合适的过期时间,并在每次自动续期时更新过期时间,确保逻辑执行完成前锁不会过期。同时,可以使用Lua脚本来保证获取锁和自动续期操作的原子性,避免出现竞争条件。
4)redis 的 red lock 有了解过吗?
Redlock是一个由Redis作者Salvatore Sanfilippo提出的分布式锁算法,旨在解决Redis单节点故障引发的分布式锁失效问题。Redlock使用多个独立的Redis实例来实现分布式锁,并在多个实例上进行协调来确保锁的可靠性。具体来说,Redlock通过在不同的Redis节点上尝试获取锁,并在大多数节点上成功获取锁时才认为获取成功,以此来保证锁的可靠性。
5)redis 实现分布式锁有什么问题?
尽管Redis可以通过各种方式实现分布式锁,但仍然存在一些潜在的问题:
- 单点故障: 如果Redis节点发生故障,可能导致分布式锁失效。
- 网络分区: 在网络分区情况下,可能导致分布式锁的不一致性。
- 死锁: 如果获取锁的客户端在执行业务逻辑时发生了异常或者意外退出,可能导致锁无法释放,造成死锁。
- 性能: 使用Redis分布式锁可能会增加系统的网络开销和延迟,尤其是在高并发情况下。
6)什么是缓存击穿、缓存穿透、缓存雪崩?
- 缓存击穿: 缓存击穿是指一个存在的key在缓存失效的时刻,同时有大量的并发请求访问这个key,这些请求会击穿缓存直接访问数据库,导致数据库压力过大。
- 缓存穿透: 缓存穿透是指查询一个不存在的数据,由于缓存没有命中,导致请求直接访问数据库。这种情况通常是因为恶意攻击或者错误的业务逻辑导致的。
- 缓存雪崩: 缓存雪崩是指在某个时间段,大量的缓存数据同时失效,导致大量的请求直接访问数据库,造成数据库压力过大,甚至宕机的现象。
这些问题在缓存系统设计中都是需要考虑和预防的。常见的解决方案包括设置合适的缓存失效时间、使用分布式锁来保护热点数据、使用备份缓存等。
7)如何解决数据一致性问题?有哪些方案?
解决数据一致性的问题可以采用多种策略,具体取决于系统的需求和架构。以下是一些常见的方案:
- 强一致性: 通过使用分布式事务管理,例如两阶段提交(2PC)或三阶段提交(3PC),确保数据在所有节点上同时更新。
- 最终一致性: 采用异步复制和事件驱动的更新策略,如使用消息队列来处理数据的复制和同步。
- 使用乐观锁或悲观锁: 通过数据库的锁机制来控制并发更新,乐观锁通常用于冲突较少的环境,而悲观锁适用于高冲突环境。
- CRDTs(冲突无关数据类型): 特别适合无中心化的分布式系统,能够在不需要锁和同步操作的情况下合并冲突数据。
8)redis 为什么不复用 c 语言的字符串?
Redis不复用C语言的标准字符串,主要是因为它需要更多的灵活性来处理字符串以及更多的功能。Redis使用自己的字符串实现(简称SDS, Simple Dynamic String),原因包括:
- 二进制安全: SDS支持任意二进制数据,包括空字符’\0’,而C语言字符串以’\0’作为终结符,这限制了其能存储的数据类型。
- 避免缓冲区溢出: SDS通过记录字符串的实际长度来避免溢出,提高安全性。
- 减少修改字符串时的内存重分配: SDS预留额外空间来优化字符串的追加操作,减少频繁的内存分配和复制。
- 快速长度计算: SDS存储了字符串的长度,可以在O(1)时间内获取,而C字符串需要遍历整个字符串计算长度。
9)如何快速的实现一个排行榜?
在Redis中,可以使用有序集合(sorted set)来快速实现排行榜。有序集合可以根据分数排序存储唯一元素,提供高效的插入、删除、更新和排名操作。例如,你可以使用ZADD
命令添加成员和分数,使用ZRANK
或ZREVRANK
获取成员排名,使用ZRANGE
或ZREVRANGE
获取排行榜上的一段列表。
10)如何快速实现一个布隆过滤器?
Redis从5.0版本开始内置了布隆过滤器的支持,通过RedisBloom模块实现。首先需要在Redis服务器上安装RedisBloom模块。一旦安装完成,你可以使用如下命令来使用布隆过滤器:
-
BF.ADD
命令添加元素。 -
BF.EXISTS
命令检查元素是否存在。 -
BF.MADD
和BF.MEXISTS
命令可以分别添加和检查多个元素。
这些命令允许你高效地实现布隆过滤器的基本操作,有效地避免缓存穿透问题。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 1300+ Star,2W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐