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
  • 增加内容容量

results matching ""

    No results matching ""