面试官:分布式锁都没能搞清楚,还能叫熟悉Redis?

面试官:分布式锁都没能搞清楚,还能叫熟悉Redis?

面试官:Redis 的优势有哪些?

程序员阿里:

速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O(1)。


支持丰富的数据类型,支持 string,list,set,zset 和 hash。


支持事务性。操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。(这块需要注意与之前 MySQL 不同)


丰富的特性,可用于缓存,消息队列,按 key 设置过期时间,过期后将自动删除。

面试官:Redis 的数据结构都有哪些?

程序员阿里:

Redis 支持五种 Value Type,其底层实现的编码数据结构有 8 种:

  • SDS - simple synamic string - 支持自动动态扩容的字节数组
  • list - 平平无奇的链表
  • dict - 使用双哈希表实现的, 支持平滑扩容的字典
  • zskiplist - 附加了后向指针的跳跃表
  • intset - 用于存储整数数值集合的自有结构
  • ziplist - 一种实现上类似于 TLV,但比 TLV 复杂的,用于存储任意数据的有序序列的数据结构
  • quicklist - 一种以 ziplist 作为结点的双链表结构
  • zipmap - 一种用于在小规模场合使用的轻量级字典结构衔接"底层数据结构"与"Value Type"的桥梁的,则是 Redis 实现的另外一种数据结构:redisObject

Redis 中的 Key 与 Value 在表层都是一个 redisObject 实例,故该结构有所谓的" 类型",即是ValueType。对于每一种 Value Type 类型的 redisObject,其底层至少支持两种不同的底层数据结构来实现。以应对在不同的应用场景中,Redis 的运行效率,或内存占用。

面试官:Redis 适合于哪些场景?

程序员阿里:

Session 共享(单点登陆)、页面缓存、队列(比如项目中用到的异步队列)、排行榜/计数器、发布/订阅(实现消息流)

  • Redis 的使用要注意什么?
  • Redis 的事务性
  • 当前 Redis cluster 集群有哪些方式,各自优缺点,场景
  • Memcache 的原理,哪些数据适合放在缓存中?
  • Redis 相比 memcached 有哪些优势?两者的主要区别?
  • Redis 的并发竞争问题如何解决,了解 Redis 事务的 CAS 操作吗?
  • Redis 持久化的机制,AOF 和 RDB 的区别
  • Redis 对象的内存回收
  • 知道哪些 Redis 的优化操作
  • Redis 的主从复制机制原理
  • Redis 的线程模型是什么?
  • Redis 中 set 和 zset 的区别
  • 分布式使用场景(存储 session)
  • 怎么保证缓存和数据库的一致性?
  • Redis 为什么用 skiplist 而不用平衡树?
  • Redis 分布式锁的实现方式

第一种,使用 redis 的 watch 命令进行实现。

watch 指令在 redis 事物中提供了 CAS 的行为。为了检测被 watch 的 keys 在是否有多个 clients 同时改变引起冲突,这些 keys 将会被监控。如果至少有一个被监控的 key 在执行 exec 命令前被其他客户端修改,整个事务将会回滚,不执行任何动作,从而保证原子性操作,并且执行 exec 会得到 null 的回复。

具体工作机制:watch 命令会监视给定的每一个 key,当 exec 时如果监视的任一个 key 自从调用 watch 后发生过变化,则整个事务会回滚,不执行任何动作。 注意 watch 的 key 是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。

第二种,使用 redis 的 setnx 命令进行实现。

先看一下这个相关的命令。

<code> SETNX key value /<code>

如果 key 不存在,就设置 key 对应字符串 value。在这种情况下,该命令和 SET 一样。当 key 已经存在时,就不做任何操作。SETNX 是”SET if Not eXists”。

<code>expire KEY seconds /<code>

设置 key 的过期时间。如果 key 已过期,将会被自动删除。

<code>del KEY /<code>

删除 key

由于当某个 key 不存在的时候,SETNX 才会设置该 key。且由于 Redis 采用单进行单线程模型,所以,不需要担心并发问题。那么,就可以利用 SETNX 的特性维护一个 key,存在的时候,即锁被某个线程持有;不存在的时候,没有线程持有锁。

并且还可以设置 key 的过期时间当作锁的超时时间,释放锁就直接可以将 key 删除即可。

  • Redis 遇到的问题和缺点
  • Redis 各个数据类型的使用场景
  • Redis 数据淘汰策略
  • Redis 哈希槽的概念
  • Redis 的缓存雪崩
  • Redis 的缓存穿透
  • Redis 的 SDS 相比 char[]的优点
面试官:分布式锁都没能搞清楚,还能叫熟悉Redis?

面试官:分布式锁都没能搞清楚,还能叫熟悉Redis?

面试官:分布式锁都没能搞清楚,还能叫熟悉Redis?

面试官:分布式锁都没能搞清楚,还能叫熟悉Redis?

后台私信【面试】免费领取全套面试资料!


分享到:


相關文章: