面试题之 Redis 篇

本贴最后更新于 440 天前,其中的信息可能已经天翻地覆

Redis 支持哪些数据类型

  • string
  • list
  • set
  • hash
  • zset(sorted set)

list 和 set 数据类型的区别

  • list 有序,set 无序
  • list 可以有重复元素,set 不能有重复元素

用 Redis 实现分布式锁的关键点

  • 加锁用 setnx key thread_id expire 10s,其中:只有 key 不存在时才加锁,实现锁的基本定义,value 中放占用锁的线程 ID,用于解锁时校验,同时设置超时时间,防止代码出问题导致锁一直不释放,一般超时时间要远大于正常程序执行时间;
  • 解锁用 lua 脚本,保证解锁操作的原子性,先判断 key 的 value 是不是当前线程 ID,如果不是,则返回,如果是,才解锁;

zset 的底层数据结构

  • 当元素少,且 zset 总大小比较小的时候,底层用的是 ziplist,压缩列表,压缩列表占用内存少,但插入和查询元素时只能遍历,复杂度为 O(n),在元素少时比较好;
  • 当元素超过一个阈值或大小超过一个阈值时,底层会转成 skiplist,跳表,跳表占用内存比压缩列表多,但插入和查询元素时复杂度为 O(logn),性能更好,且相比于红黑树,跳表实现更简单,这也是 redis 选择跳表的原因之一。

Redis 过期键的清理策略

  • Redis 有两种清理策略:惰性清理和定期清理;
  • 惰性清理是指在查询元素时先检查元素是否过期,如果过期了,就删除元素并返回不存在;
  • 定期清理是指后台定期启动子线程去执行清理过期键的逻辑,并且清理时会采用随机抽取元素,检查是否过期,如果过期,则清理,同时,检查这次抽取的元素过期比例,如果比例大于某个阈值,则继续清理过程,如果小于阈值,则停止清理。

为什么要使用两种清理策略

  • 惰性清理对 cpu 友好,对内存不友好,如果只使用惰性清理,可能会浪费内存;
  • 定期清理对内存友好,对 cpu 不友好;如果只使用定期清理,可能会导致清理时 redis 反应慢,甚至卡死;
  • 两种策略结合,可以在保证清理逻辑不影响业务使用的同时,避免过期键占用过多内存。
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    317 引用 • 1392 回帖 • 2 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    272 引用 • 245 回帖 • 447 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...