REDIS面试题
1、redis的持久化方式有哪些?
RDB(Redis Database) AOF(Append Only File) 其实 RDB 和 AOF 两种方式也可以同时使用,在这种情况下,如果 redis 重启的话,则会优先采用 AOF 方式来进行数据恢复,这是因为 AOF 方式的数据恢复完整度更高。
2、Redis 集群为什么是16384槽位
消息大小考虑:尽管crc16能得到65535个值,但redis选择16384个slot,是因为16384的消息只占用了2k,而65535则需要8k。
集群规模设计考虑:集群设计最多支持1000个分片,16384是相对比较好的选择,需要保证在最大集群规模下,slot均匀分布场景下,每个分片平均分到的slot不至于太小
3、ziplist的优缺点
省内存:
ziplist节省内存是相对于普通的list来说的,如果是普通的数组,那么它每个元素占用的内存是一样的且取决于最大的那个元素(很明显它是需要预留空间的)
所以ziplist在设计时就很容易想到要尽量让每个元素按照实际的内容大小存储,所以增加encoding字段,针对不同的encoding来细化存储大小
这时候还需要解决的一个问题是遍历元素时如何定位下一个元素呢?在普通数组中每个元素定长,所以不需要考虑这个问题;但是ziplist中每个data占据的内存不一样,所以为了解决遍历,需要增加记录上一个元素的length,所以增加了prelen字段
频繁申请释放内存:
ziplist 不预留额外的内存空间,在写操作时可能需要频繁进行内存分配和释放操作,影响性能
在移除节点后,ziplist 立即缩容,可能导致频繁的内存分配和释放操作
节点如果扩容,可能导致节点占用的内存增长,并且在超过一定字节后,可能会导致链式扩容。链式扩容的时间复杂度为 O(N)
,虽然在大多数情况下概率较小,但在恶劣情况下会导致性能下降
4、为什么z有序集合同时使用字典和跳跃表实现 有序集合使用字典和跳跃表是为了提高数据的查找和插入效率。字典可以快速查找元素,跳跃表可以快速进行排序等操作。通过将这两个数据结构结合起来,可以实现对有序集合的高效操作。
5、过期键删除策略
1、惰性删除:当访问一个key时,判断key是否过期,如果过期则删除该key。优点是简单易实现,缺点是会增加每次访问的开销,如果key的过期时间很长,那么在访问时会频繁判断key是否过期,从而降低性能。
2、定期删除:定期扫描整个数据库,找出过期的key,然后删除。优点是避免了每次访问都判断key是否过期,缺点是需要定时扫描整个数据库,如果数据库很大,可能会导致性能下降。
3、定时删除:在设置key的过期时间时,将过期时间保存到一个单独的数据结构中,然后定期扫描这个数据结构,找出过期的key,然后删除。优点是可以精确控制过期时间,缺点是需要维护一个额外的数据结构,增加了内存开销。
6、redis客户端退出情况
1、主动退出或被杀死
2、客户端向服务器发送了不符合协议格式的命令请求
3、client kill的目标
4、用户为服务器设置了timeout
5、客户端发送的请求超过了输入缓冲区大小 最大1GB
6、发送给客户端的命令回复炒股个哦了输出缓冲区的限制大小
7、redis脑裂 https://cloud.tencent.com/developer/article/2314905
8、redis 大key问题
- 拆分多个小key
- 优化数据结构
- 设置合理过期时间
- 启用内存淘汰策略
- 删除大key
- 增加内容容量