赣州新闻网

首页 / 科技

续航超600KM 中国版“特斯拉”轿跑SUV开始量产

2020-02-28 · 赣州新闻网 · 科技

面试开始

一个大腹便便,穿着格子衬衣的中年男子,拿着一个满是划痕的mac向你走来,看着快秃顶的头发,心想着肯定是尼玛顶级架构师吧!但是我们腹有诗书气自华,虚都不虚。(这不是第一篇文~ # L X d J R S章的面试官么?)

小伙子,R d ~ o s / | D你还记得我在第一章z Q Y V i R里面问过你,RediL z ) qs有几种基础数据类型么?

嗯嗯,帅气的面试官,我肯定记得,没齿难忘!!!

我特么谢谢你,都四面了还不给Offer!

阿里面试官:Redis的并发竞争?双写一致性,线程模型说一下

那你能说一下他们的特性,还有分v & 7 h 2 f q别的使用场景么?

行吧,那我先从String说起A & @ R : E P。

String:

这是最简单的类型,就是普通的 set 和 get,做简单的 KV 缓存。

但是真实的开发环境中,很多仔可能会把很多比较复杂的结构也统一转成String去存储使用,比如有的仔他就喜欢把对象或者List转换为JSONString进行存储,拿出来再反序列话啥的。

我在这里就不讨论这样做的对错了,但是我还是希望大R n ;家能在最合适的场景使用最合适的数据结构,对象找不到最合适的但是类型可以选最合适的嘛,之后别人接手你的代码一看这么规范,诶这小伙子有点东西呀,看到你啥都是用的String,垃圾!

阿里面试官:Redis的并发竞争?双写一致性,线程模型说一下

好了这些都是题外话了,道理还是希望大家记在心里,习惯成自然嘛,小习惯成就你。

String的实际应用场景比较广泛的有:

  • 缓存功能:String字符串是最常用的数据类型,不仅仅是Redis,各个语言都是最基本类型,因此,利用Redis作为缓存,配合其它数据库作为存储层,利{ c Q R用Redis支持高并发的特点,可以大大加快系统的读写速度、以D e 8 % K G U =及降低后端数据库的压力。
  • 计数器:许多系统都会使用Redis作为系统的实时计数器,可以快速实现计数和查询的功能b A % H C L { !。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存 H U。
  • 共享用户Session:J b y用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存Cookie,但m + / ] : (是可以利用Redis将用户的Session集中管理,在这种模式只需要保证Redis的高可用,每次用户Session的更新o q Z 8 E和获取都可以快速完成。大大提高效率。

Hash:

这个是类似 Mab 6 R - T xp 的^ A * M [ y Z一种结构,这个一般就[ X W =是可以将结构化的数据,比如一个对象(前提 H,因为现在很多对象都是比较复杂的,比如你的商品对象可能里面就包含了很多属性,其中也有对u ) P i b C ! ^象。我自己使用的场景用得不是那么多。

List:

List 是有序列表,这个还是可以玩I E L ? -儿出很多花样的。

比如可以通过 Lists ( [ h 存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的东西。

比如可以[ z G t i p t N 9通过 lrange 命令,读取某个闭区间内的元素,可以基于 List 实现分页查询,这个是很棒的一个功能,基于 Redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性z Z % q r N能高,就一页一页走。

比如可以搞个简单的消息队/ K 4 3 H ) F列,从 List 头怼进去,从 List 屁股4 Q i q那里弄出来。

List本身就是我们在开发过程中比~ Y :较常用的数据结构了,热点` s D ! L I数据更不用说了。

  • 消息队列:Redis的链表结构,可以轻松实现阻塞队列,可以使用左进右出的命令组成来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,{ K _ { P A H 6多个数据消费者,可以使用BRpop命令阻塞的T 1 v h * ?“抢”列表尾部的数据。
  • 文章列表或者数据分页展示的应用。; ~ q比如,我们常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用y } M B a a DRedis的列表,列i h 7 9表不但有序同时还支持按照范围内获取元9 [ . h d R素,可以完美解决分页查询功能。大大提高m ( - $ i 8 K % [查询效率。

Sw b 0 $ M {et:

Set 是无序集S x y Q n l合,会自动去; b | ; k,重要消息的score为2,然后工作线程可以选择按score的y A w R ( ` -倒序来获取b - = J ; T b工作任务。让重要的任务优先执行。微博热搜榜,就是有个后面的热度值,前面就是名称

小结

Redis基础类型有五种,这个我在基础里面也有提到了,这个问题其实一般都是对P6以下,也就是1-3年左右的小伙伴可能是会问得比较多的问题。

能回答出来五种我想大家都可以,但是不知道- L , : 0 w 大家是否知道,五种类型具体的使用场景,以及什么时候用什么类型最合适呢?

要是你回答的不好,没说出几种 } Y 1 Y R R数据类型,也没说什么场景,A M % W 6你完了] 6 k w ;,面试官对你印象肯定不好,觉得你平时就是做个简单~ c G ] D X的 set 和 get。所以看似很简单的面试题实则最容易看出你的深浅了,大家都} @ 1 z | z要注意打好基础。

你有没有考虑过,如果你多个系统同时操作(I X , l A并发)Redis带来的数V R (据问题?

嗯嗯这T ? ~个问题我以前开发的时候遇到过,其实并发过程中确实会有这样的问题,比如下面这样的情况

阿里面试官:Redis的并发竞争?双写一致性,线程模型说一下

系统A、B、C三个系统,分别去操作Redis的同一个Key,本来顺序是1,2,3是正常的,但是因为系统A网络突然抖动了一下,B,C在他前面操作了Redis,这样数据不就错了么。

就好比下单,支付,退款三个顺序你变了,你先退款,再下单,再支付,那流程就会失败,那数据不就乱了?你v ` w P 3 - ! 9订单还没生成你却支付,退款了?明显走不通了,这在线上是很恐怖的Y T ` H事情。

那: r 0这种情况怎么解决呢?

我们可以找个管家帮我们管理好数据的嘛!

阿里面试官:Redis的并发竞争?双写一致性,线程模型说一下

某个时刻,多个系统实例都去更新某个 key。可以基于e R a f ) 3 q z Zookeeper 实现分布式锁。每个系统通过 Zookeeper 获取分布式锁,确保同一时间,只能有一个系统实例在操作某个 Key,别人都不允许读和写。

你要写入缓存的数据,都是从 MySQL 里查出来的,都得写入 MySQL 中,写入 MySQL 中的时候必须保存一个时间戳,从 MySQL 查出来的时候,时间戳也查出来。

每次要写之前,先判断一下当前这个 Value 的时间戳是否比缓存里的 Value 的时间戳要新。如果是的话,那么可以写,否则* s * n 0is 相比 Mem^ H vcached 来说,拥有更多的数据结构,能支持更丰富的数据操作。如果需要缓存能够支持更复杂的结构和操作, Redis 会是不错的选择。

Redi_ 8 f U ; m x v Us 原生支持集群模式:

在 redis3.x 版本中,便能支持 Cluster 模式,而 Memcached 没h j R有原生的集群H + ~ J 0 D 8 M 模式,需要依靠客户端来实现往集群中分片写入数据。

性能对比:

由于 Redis 只使用单核,而 Memcached 可以使用多R 4 z : e &核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。而在 100k 以上的数X & L X U # #据中,Memcached 性能要高于 Redif 4 ? ! m @ k 6 2s,虽然 Redis 最近也在存储大数据的性能上进行优/ w , 5 V ( : k化,但是比起i ` g P | d Remcached,还是稍有逊色。

Tip:其实面试官这么问,是想看你知道为啥用这个技术栈么?你为啥选这个技术栈,你是否做过技术选型的对比,优缺点你是否了解,你啥都不知道,只是为h & F了用而用,那你可能就差点意思了。

Redis 的线程模型了解么?

Redis 内部使用文G + N z ;件事件处理器 fil8 V W M ~ B = _ 2e eveS p E i L , u ] rnt handler,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复A } C h ? 8 a |用机制同时监听多个 Socket,根据 So0 - bcket 上的L 8 U 6 ( . Q @事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

  • 多个 Socket
  • IO 多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器、m D e p 4 g 3命令请求处理器、命令回复处理器)

多个 Socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 Socket,会将 Socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。

面试结束

小伙子对你面试了四轮,你说话有理有据,逻辑清晰,来公司后肯定是一把好手,我想要不你来当我的V W O j t 0 R GLeaderB a l T吧,哈哈?

面试官别跟我开玩笑了,我跟您这样日积月累的技术专家还是有很多差距的,您的经验和技术上的深度,没有很长时间的磨练是无法达} ^ q I / f到的,我还得多跟您学习。

好的,小伙子有点东西? 2 h K ?,你年少有为不自卑,知道什么是珍贵,就是你了来上班吧。

好的面试官,不过我& a =想我在Java基础,MQ5 / :,Dubbo等等领域还有好多知识点您没问我,要不下次继续面我?

强行,为吊打下一期埋伏笔哈哈,下8 G a w L期写啥你们定!!!

能撑到最后,你自己都忍不住自己给自己点个赞了!

(暗示点赞,每次都看了不点赞,你们想白嫖我么?你们好坏v g $ &喲,不过我喜欢)。


《吊打面试官》Redis系列 ---- 全剧终


总结

既然都说了是Redis的终章我最后也做个Redis方面常见面试题,题目的_ N P总结,答案大家要去思考我前面的文章基本上都提到了Z 6 j F q n E,结果可以去我d P + ) 3 X X F公众号回复【答案】获取,不过我还是希望大家能看到题目就能想到答案,并M 2 K : C = B分布式寻址都有哪些算法?了解一致性 Hash 算法* [ x B吗?

  • 1、使用Redis有哪些好处?
  • 2、Redis相比Memcached有哪些优势?
  • 3、Rx ( P Dedis常见性能问x $ h R e题和解决$ L 8 x : v N o G方案
  • 4、MySQ, j aL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?
  • 5、Memcacz R U u X b e +he与Redis的区别都有哪些?
  • 6、Redis 常见的性能问题都有哪些?如何解决?
  • 7、在什么样的H w ; ^ S f n场景下可以充分的利用Redis的特性,大大提高Redis的效率?
  • 8、RedZ J z p 3 i lis的缓存雪崩、穿透、击穿了解么?有什么异同点?分别怎么解决?
  • 9、Redis的基本类型有哪些F P `?他们的使用场景了g | W t解么?比较高级的用法你使用过么?
  • 10、 g S @止,还是要深究的。

    你永远只会用,不去考虑用了会带来的问题,以及出现问题之后的解决方K e F { [ S案,我觉得你大概率会停滞不前,既然入都入了这行了,为啥不武装一下自己。

    其实学习H E E 6 o I p技术是个反哺的过程,学习的时候可能你只是感觉知识广度、深度上去了,一个知识点你这样,两个、三个知识点你都这样,最后你发现你的技术已经跟身边一样P6的仔0 R Z e K u 不一样了,这样你可能在团队重大项目的贡献都上去了,那P7的晋升几率是不是大了,钱是不是上去了,女朋友是不是好看了,房子是不是大了。

  • 房子确保项目视频工作中国续航量产全南