面试官:分布式锁都没能搞清楚,还能叫熟悉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 命令进行实现。

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

 SETNX key value 

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

expire KEY seconds 

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

del KEY 

删除 key

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

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

  • Redis 遇到的问题和缺点
  • Redis 各个数据类型的使用场景
  • Redis 数据淘汰策略
  • Redis 哈希槽的概念
  • Redis 的缓存雪崩
  • Redis 的缓存穿透
  • Redis 的 SDS 相比 char[]的优点

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

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

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

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

文中资料,扫描主页左侧二维码或者点击二维码下方超链接,免费领取!

猜你喜欢

转载自blog.csdn.net/EnjoyEDU/article/details/107766703