粉丝3141获赞1.1万

我们再看这个问题,瑞迪斯如何设置 k 的有效过期时间?他的实现原理是什么?其实这个问题就是可以衍生出很多很多类似的问题来, 因为其实你像呃瑞迪斯的这个过期时间是很基础的,设置过期时间是很基础的东西,对吧?我们大部分人都用的时候都没有什么问题,但是啊,这个问题就是促使你对瑞迪斯这些机制能够加入一些思考, 其实这也是面试官希望看到的,由此可以引出很多很多的问题,比如说瑞迪斯的数据,呃,各种数据类型,有几种数据类型啊?他们底层的实现机制是什么样的,对吧?或者像瑞迪斯的跳表啊,底层这些实现机制是什么样的?很多很多问题, 重要的是你要体现你对这些知识点能够有一定的思考。那我们来看这个问题, red 设置 k 的过期时间 有哪些方式啊?那比如最简单的我们使用一个是拍二指令吗?对吧?他也提供了 ex 拍二指令,这是也是最常用的一个方式。另外呢,对于支付率,还有像 csitex 也可以设置一个有效时长, 这就是他们基本上 red 始终实现可以有效过期时间的这样两种配置的方式。主要就这两种,那我们在想他怎么实现这个原理呢? 那就对于已经失效的这个 k, 那是不是肯定要有一个主动删除啊?对不对?所以我们通常想到的是,呃实现机制 有两种,一种是什么呢?一种是定期删除,定期删除就相当于每隔一段时间, 一段时间执行一次,呃,执行一次这个删除过期 k 的操作, 这是我们捡到最简单的,对吧? 其实也是最有效的一种方式啊。我每隔一段时间,我来扫描一下,把所有这种删除已经过期了的 t, 把它删除掉, 你起个后台进程,对吧?那另外一种方式呢?就是懒汉式删除什么呢?就用到的时候再删除。 当使用 get、 get 晒他等指令去获取数据时, 判断 t 是否过期, 过期后, 过期后就执行,就先把 k 删除,再执行后面的操作。 就相当于一种是什么主动的去删除,另外一种是被动的删除,用到的时候我再去删除。 而 redis, 他的实际问题是什么样呢? redis 是使用将两种方式结合来使用, 有时候瑞士他有这种以懒汉式的删除为主,就是当你使用就要获取这些数据的时候, 我来,哎,来检查你这个 t 是否过期,如果过期呢,就删除这个 t, 然后再进行后面的相应的操作, 如果没有过期,直接执行相应的操作好。然后呢,他有一个定期删除的一个机制, 定期定期删除。只是呢,在定期删除的时候,我们想一下定期删除的时候要注意什么事情啊? 平衡执行效率 和执行时长啊?执行频率, 这个才是一个关键,对不对?整个机制其实是比较简单的,但是这其中你定期删除了这个, 这两个参数是需要考量的,因为什么呢?执行频率过高肯定不行,因为你要去扫描所有的 t, 对吧?你要扫描所有的 t, 这个任务其实是很重的, 那你一直在执行,没经常的执行的话,对你的这个资源性能肯定是很大的消耗,所以肯定是不行的,对吧?然后再看执行时长, 执行,如果我一个一个这个删除的时间就要很长很长了,要一分钟了,那这是我可能一个还没有结束,另一个又要起起来了,那这样的话整个就乱掉了,对吧?所以呢, red 史当中实际上是对这个执行频率和执行时长呢,是有一个综合考量的, 那简单来说就是什么呢?他的机制就是在执行时长时候对你控制进行控制,控制执行时长,那他怎么控制呢? 他定期删除的时候 会首先是便利每一个带头 boss。 red 式当中带头 boss 默认是 就是在瑞士的康复中配置的那个数据库的个数,对吧?默认默认是十六个。 首先便利每个 beat bos, 但是他在便利每个 beat bos 的过程中呢,不会去扫描下面所有的 t, 他是检查当前库中指定个数的 t, 默认是二十个, 目的是二十个,他就只检查随机的检查二十个,这二十个呢? 然后呢,检查这些啊,随机抽查这些 t, 抽查这些 t, 如果有过期的就删除,如果没有就放过,就到下一个了呗。并且啊,在程序中 有一个程序中有一个呃变量全局变亮记录扫描到了哪一个数据库, 总共十六个库,那就相当于是说总共十六个库,我每次只按我的这个时长指定随机抽二十个,并且呢,我也并不是说一次就要把所有的库都抽完,我也只是随机抽几个库,具体呢,就是根据我的这个执行时长来定, 其实这种方式也是极的值得我们借鉴的,对吧?在我们自己实现的过程当中,比如说我们要对数据库进行一些这种过期策略,或者是我们别的数据员进行一些过期策略的时候,也可以借鉴他这种方式,对吧?就重点就是什么呢? 控制这个执行频率和执行时长,所以这能看到其实分布式场景下很多问题他是相通的啊,当你对一个组件了解很清的时候,他的很多思想都可以拿来借鉴过来解决其他的些问题。 所以呢,这个就是关于 redis 的这个过期时间啊,我之前也提到了,还有很多这种其他类似的问题,也可以从一个简单的机制开始往外去扩散,你要重点是要加入自己的思考。 好,那这这这一类的题目呢,也希望大家能够自己回头再看一看瑞丽斯的知识,同时呢去思考一下怎么样去解释他其他的这些机制的一些直线原理。好,那就是关于这个问题。


分钟背会一道家网面试题, redis 单线程为什么速度这么快? redis 并不是所有地方都是单线成 redis 四点零之后,大数据的异步删除功能使用了多线程,比如弗拉什奥的命令。 redis 六点零之后, 网络 io 线程也采用了多个线程来处理请求,但执行命令仍然是单线程 release 单线程还能每秒钟处理几万的 qps。 性能高有几个原因, 第一, reds 全部操作都是基于内存的,并且使用了哈西表和跳表的数据结构,查询减速非常快。第二,单线程不会有线程之间的切换,没有锁竞争所带来的性能的问题。另外, red 爱丽丝采用了多路复用的非主色 io 模型,也大大提高了网络访问请求的性能。你被会了吗?关注我,一个分享干货的技术博主。

所以,勤奋、重复大量的练习,是给每一个普通人成才的机会。