|
| 1 | +# Redis 面试场景 |
| 2 | + |
| 3 | +## 1. 考察 Redis 基本数据结构 |
| 4 | +- **面试官**:Redis 都有哪些数据结构? |
| 5 | + |
| 6 | +- **候选人**:(小 case,很自信地回答)Redis 有 5 种数据结构,分别是 `String`、`List`、`Hash`、`Set`、`Sorted Set`,其中 `Sorted Set` 是有序集合。 |
| 7 | + |
| 8 | +- **面试官**:(没了??)就这些吗? |
| 9 | + |
| 10 | +- **候选人**:(心里突然有点慌)好像...没有其他数据结构了吧,我知道的就这些..... |
| 11 | + |
| 12 | +**分析**:这其实是一个很基础的问题,相信绝大部分同学都能回答出以上 5 种数据结构,但是,如果你对 Redis 有更加深入的了解,那么你应该回答 Redis 还有 `HyperLogLog`、`Bitmap`、`Geo`、`Pub/Sub` 等数据结构,甚至还可以回答你玩儿过 `Redis Module`,像 `BloomFilter`、`RedisSearch`、`Redis-ML`,想必面试官会眼前一亮,嗯,这小伙子还不错嘛,知道这么多。 |
| 13 | + |
| 14 | +## 2. 考察 Redis 分布式锁 |
| 15 | +- **面试官**:那你有没有用过 Redis 分布式锁? |
| 16 | + |
| 17 | +- **候选人**:用过的。 |
| 18 | + |
| 19 | +- **面试官**:说一下你是怎么用 Redis 来实现分布式锁的。 |
| 20 | + |
| 21 | +- **候选人**:就是用 `setnx` 命令来争夺锁,如果抢到了,再用 `expire` 给锁加上一个过期时间,防止锁忘记释放。 |
| 22 | + |
| 23 | +- **面试官**:那如果在 `setnx` 之后执行 `expire` 之前进程意外 `crash` 或者要重启维护了,要怎么做? |
| 24 | + |
| 25 | +- **候选人**:啊,还有这种情况吗?我就是在系统中简单用用,没有考虑那么多...... |
| 26 | + |
| 27 | +- **面试官**:那就算没有发生意外 `crash`,有没有可能出现不安全的问题,比如,锁的超时?导致多个线程执行顺序错乱? |
| 28 | + |
| 29 | +- **候选人**:应该不会吧...我之前使用过,没遇到这个问题...... |
| 30 | + |
| 31 | +- **面试官**:(心里觉得这小伙子不行,没遇到,也应该考虑到吧)行吧,那你回去之后好好想想。那 Redis 除了这种方式实现分布式锁,还有其他吗? |
| 32 | + |
| 33 | +- **候选人**:好像还有个 RedLock 算法,但是我只听说了,没去研究它(心里很没底)。 |
| 34 | + |
| 35 | +- **面试官**:(我还能说什么呢)... |
| 36 | + |
| 37 | +**分析**:Redis 2.8 版本之后,`setnx` 和 `expire` 可以合并成一条指令执行,锁得不到释放的问题也随着迎刃而解。而超时问题,可以使用"随机值+ Lua 脚本"的方式来处理。以上的一些问题,你都应该考虑到,而不是简单的用用 Redis。而关于 RedLock 算法,也应该去好好了解它的原理和实现方式。 |
0 commit comments