粉丝8831获赞4.6万

如何安装 redis? 我们是基于 linux 服务器来去讲解这个安装啊,原因呢,有两点,第一呢,大多数企业他在做项目部署时都是基于 linux 服务器。第二呢, redis 的作者根本就没有编写 windows 版的 redis 啊。呃, linus 服务器呢?我们选择的版本呢是 ctrl 七。嗯,然后呢,这个是 reds 官网啊,你可以在这个网站上找到他的一个下载点啊,最新版本 redis, 六点二点六。 好,那第一步呢,我们肯定需要准备一台训练机啊,那么在这里我已经准备好了一台训练机了,然后呢,我们只需要把安装包上传。那要安装瑞斯第一步啊,是要安装他的依赖,因为瑞斯啊, gac 语言编写的,所以我们先必须安装的就是他 gac 依赖了。现在呢,我们 ctrc 好打开这个控制台,咱也粘贴迷你啊,回车, 那么安装就开始了,我们耐心等待一会。好,经过一段时间的安装啊,我们这个依赖已经安装好了啊。接下来我们回到文档第二步呢,我们需要去上传这个安装包,并且对他做解压了啊,六点二零六的安装包,我们把它上传。上传哪里呢啊?我们的这个文档中有说明啊,说上传的这个 user local s c 的这个目录下啊。好,那下面呢,我们找到我的空台,我们需要进入啊,有小 local s r c 的这样一个目录啊,来找到资料,然后呢,直接把这个拖过来就可以了。好,拖完了以后我们对它做一个解压,好,通过一个踏 z x v f 去做一个解压 release。 ok, 回撤。 好,我们可以看到已经解压成功了,对吧?解压以后呢进入,进入以后呢是通过这个 make and make install。 好,我们来运行一下 r c, 回到我们的控制台,暂停命令回车。好,又是一耐心的等待啊,一段时间以后呢,应该就完成成功了, nice。

同学们大家好,今天这节课我们来看一下瑞迪斯的安装与文件介绍,那我们瑞迪斯的安装步骤我在这边列了一下,我们跟同学们去说明一下。首先呢,第一步是下载瑞迪斯, 下载瑞迪斯的话,我们直接可以在命令行窗口使用这样一个命令啊,那这个安装的一个步骤呢,指的是在我们的 minix 操作系统或者说麦克系统上进行一个安装的步骤,那待会我们会讲一下在 windows 这个系统上是如何进行安装的。 好,那第一步的话,就是我们的这个下载啊,可以直接使用 wgame 进行下载,或者说你直接去官网啊,点击下载,然后下载我们 redes 版本啊,那这边呢,下载 的是一个稳定版啊,那第二步呢,下载好之后,我们对我们的这个安装包进行一个解压,那解压好之后呢,我们通常会去创建一个软链接啊,瑞丽, 那创建好软链接之后呢,我们就进入这样一个目录啊, redis 目录,执行这个 mac, 嗯的 macen 丝到进行一个编域啊,编译与安装啊,那接下来的话,我们给同学们去演示一下上述步骤, 那这边呢,我已经把这个安装包啊已经下载好了,因为这个安装包我在下载的时候啊,发现这个比较慢,所以说我事先呢已经把它下载好了,那下载好啊,那所以说这边的 w get 这个我就不演示了, 下载好之后呢,我们需要对这个安装包进行一个解压,我们来看一下。好,那解压好之后呢,我们来创建一个软链接 好,然后我们进入这个 redis 目录, 然后吃进行一个变异。好, 那在编译的过程中呢,我们稍微等待一会。好,那编译好之后呢,我们在这个目录 里面再去执行 max excel。 好,那至此的话,我们的这个瑞丽斯就安装好了,那安装好之后呢,我们来看一下他的这样一个目录,我们进入这个 src 目录, 这里面呢,我们会对里面的一些这个可执行文件啊,跟同学们去介绍一下,我们来看 看一下。这边我们结合着这个 ppt 来看一下,那我们的 redes 在 windows 下的安装啊,还没有跟同学们做介绍,那我们把这边说一下之后呢,再来看一下刚才的这个文件的一个介绍 啊,在我们的官网上面,瑞丽丝并没有提供 windows 版本的一个下载,那原因是在于我们瑞丽丝在实线上,他是依赖于操作系统的一些特性, 那我们的 minix 与 windows 在实现方式上是截然不同的,同时呢,官网也推荐我们在使用 redis 的时候是在 minix 操作系统上去使用啊。 那这边呢,如果同学们一定要在 windows 下去进行一个安装的话啊,有两种方式,那第一种方式呢,是通过刀口进行安装, 那如果说要使用刀客安装的话,那需要同学们具备一定的刀客基础,那这边呢,我们就不去进行一个实际的演示了,这边呢给到大家一个链接,在这个链接里面呢,会有详细的这个 安装步骤。那需要说明的是,刀口安装的话,不是说在 windows 下啊,你才可以去使用刀口安装,那你在 minix 下啊,也可以去使用刀口安装。 那第二种方式呢啊,指的是啊,我们的这个瑞迪斯虽然没有 windows 的版本,但是呢有的人他会把这个瑞迪斯进行一些修改啊,使得他能够在 windows 上 windows 上运行起来。那这边呢我们给了两个链接, 那比如说第二个啊,他就是我们微软提供的一个瑞蒂斯版本,那这个版本呢,相对而言啊比较老,目前呢才到三这样一个版本,那上面这个链接呢是到五这样一个版本,那我们这一套课程呢,介绍的实际上是六这个版本,也就是说他只有等 瑞迪斯的最新版本发布之后呢,才能紧接着根据这个相应的版本进行一个更新啊,所以说相对而言这个版本啊会比较滞后。 好,那以上呢就是我们关于 windows 下安装的这个两种方式啊,同学们可以去尝试一下,那我们在这个课程里面呢就不去做演示了,实际上我是推荐大家在我们的这个学习过程中啊,直接在 minix 上进行安装。 那如果说你的这个电脑上没有拎那个死系统的话啊,如果说你用的是 windows 操作系统,你可以去装一个虚拟机啊, 然后呢安装我们的零零四操作系统啊,或者说你直接在这个阿里云或者腾讯营上直接去购买这样一个这个零零四操作系统啊就可以了, 然后直接在上面进行相关的一些学习也是 ok 的啊。好,那接下来的话,我们来看一下我们刚才所说的这些文件,他表达的含义啊,就是这些我们在 src 目录底下的这个以瑞丽斯 杠这样开头的一些文件啊的含义。首先呢是第一个啊,瑞丽斯杠奔驰 mac, 它呢是用于我们瑞迪斯的基准测试的,这边呢,我们 结合着这个 ppt 来看一下啊,好,然后瑞迪斯刚斯文的,他是用于啊,在这边啊,瑞迪斯刚斯文他是用于我们瑞丽斯服务器的一个启动, 比如说我们可以通过 redis clol 来启动我们的 redis 服务器,那启动好 redis 服务器之后呢,我们就可以通过 把客户端来进行一个连接了,那这边呢, redis 杠 cli, 那 cli 全称呢,就是克拉两者啊,客户端通过这个命令来连接到我们的 redis sorry 上面啊,进行一些数据的操作。然后 这边呢,还有一个 redis 刚 check 类型的一些这个命令啊,一个是 aof, 一个呢是 rdb 啊, 在这边啊,一个是 redisgamchaggradb, 还有一个 redisgagaggaggaggao f。 那这个呢,实际上是我们后面会跟同学们介绍的 redis 数据的一个持久化方案啊,两种方式。 那这个命令是用于做什么的呢?实际上就是对这两种方式啊的对应的文件进行一个修复啊,如果出现一个损坏的话,可以进行一个 文件的修复。那一个指的是 lvf 方式啊,对应的一个文件 lvf 文件进行修复。另一种呢指的是 rdb 文件进行一个修复。 那这边同学们呢啊,首先呢,对他做个了解就可以了,然后呢是我们的这个瑞丽斯三天了啊,三天了呢,指的是哨兵的意思, 那这个是用作啊,什么用途的呢?他是瑞丽斯官方推荐的高可用性解决方案。我们在后面的课程啊,会说到这样一个主重复制,那如果说当我们的主节点挂掉之后呢,这时候啊需要来选举一个这个重节点,那升级为主节点, 那这个时候呢,我们的这个哨兵啊,这个哨兵的时刻来盯着我们的这些节点,那一旦发生这样一个错误的话, 他呢就来进行我们刚才说的这个流程啊,推荐一个这个从节点升级为主节点,那这样一个过程呢,就需要我们的这个 redise 身体呢, 他呢是我们这个官方推荐的一个高可用性解决方案,他的高可用性体现的就是啊,当这个节点挂掉之后呢,他能够迅速的进行一个恢复, 那这个我们后面的课程会进行一个讲解,那这边我们这个瑞丽三天来呢,他就是用来启动这样一个服务的啊。 好,那以上呢就是我们今天介绍的瑞丽斯的安装,同时呢也跟同学们去介绍了一下,安装好之后我们 src 目录里面可执行文件的一个含义。 下节课呢我们将会跟同学们去演示一下我们瑞丽启动的三种方式,那本节课呢就先到这里感谢同学们的收看。


本节课我们将通过具体的实操步骤来演示 radis 的 安装与访问。 radis 是 基于内存的开源 nasco 数据库, radis 的 官方网站提供了不同版本的安装戒指。 这里以 radis 六点二点六为例来进行演示。由于 radis 基于 c 语言开发,因此需要提前安装 g c c 编辑器,它是 g n u compiler collection 的 缩写。它是由 g n u 开发的编辑器, 其中包括 c, c, 加加等语言的翻译环境,也包括了这些语言的库。下面是具体的安装访问步骤。使用 make d i r 命令创建 radis 的 安装目录。使用 tar 命令解压 radis 安装包,并使用 cd 命令进入解压后的目录执行 make 命令翻译 radis。 这里的 making store 命令通过 prefix 参数指定了 radis 的 安装目录。在 radis 安装目录下创建康复目录, 目录用于保存 radis 的 配置文件。通过 c p 拷贝命令将当前目录下的 radis 配置文件拷贝到上面的目录下。 执行 tree 命令。查看 radis 的 安装目录结构。这里展示了 radis 的 命令行客户端和 radis 服务器端的命令脚本,其他脚本会在后续课程中为大家介绍。切换到 radis 安装目录,使用 v i 编辑器编 编辑 cf 目录下的 radis, 点 radis 文件,这里展示了需要修改的参数,其中 protected mode 的 默认值是 yes, 表示禁止外部访问,这里修改为 no。 dimonized 的 默认值是 no, 表示在前台运行 radis 服务器端,这里修改为 yes, 表示将 radis 服务器进程运行在后台。在默认情况下, radis 没有启动系统日制功能。为了能够更好地监控 radis, 建议在生产环境中启用 radis 的 系统日制。因此,修改参数 log file 指定 radis 的 系统日制文件保存并退出该文件。执行并目录下的 radis server 命令脚本, 并指定 radis 的 配置文件。启动 radis 服务器端,执行 cat 命令,查看 radis 的 系统日制。这里可以看到 radis 服务器端已经处于运行的状态。 监听的端口是六三七九。通过执行 ps 命令也可以查看 radis 服务器端的进程信息,这里可以看到 radis 进程号是幺二幺八幺四。执行并目录下的 radis c l i 命令脚本登录 radis 服务器端,这将默认登录到当前主机的六三七九端口。登, 登录后执行 info 命令,查看 radis 的 统计信息。这里为了显示的方便,只展示了 server 端的部分信息。现在你已经掌握如何安装和访问 radis 了。那你知道 radis 基本的建值操作吗?欢迎评论区留言讨论好了,记得点加号关注赵余强老师。

在添加了编辑点还有图的编排之后,我这里引入了真实的 api 接口,有查询实时天气的 api 接口,就是这个 w t t r 点映, 还有查询实时交通事件的 api 接口是高德的,然后还有根据城市交通情况去推荐景点的接口就是 tabl, 然后还有是规划路线的 api 接口,也是高德的。我们首先先看一下天气的这个接口, 在 info factor 这里,因为它是一个实时的信息嘛,所以就放在 info factor 这里,那我们可以看到这里有调用的 get rid to 方法,那这里的 start time 还有 end time 是 因为我这里引入了缓存, 因为天气的话它不会有短时间内的很大的波动,所以完全可以放到缓存里面,只要你这个过期时间不要设置的太长就可以了。然后我这里统计了一下加入缓存之后它的速度快了多少, 那可以看到它是快了四千多倍的,就是你统计一下的话会发现,因为你去调用真实接口还是会比较慢,但你缓存的话,你引入 radis, 那 肯定是查询速度要快很多的。我们来看一下这个 get rid to, 这里就是在 rid ip api 这里, 在这里的话,我们首先先拿到了一个干净的城市名称,然后先查询缓存,如果没有命中的话,如果命中了就直接返回,如果没有命中就去调用真实的 api 接口, 我们可以看到这里这样的 get 方法,然后去解析它的数据,把这个结果缓存到 ready 当中,设置一下过去时间是半个小时就返回就可以了,比较简单。然后其他的也是类似的,其实就是这个,这个跟 agent 没什么关系啊,就是完全就是去引入一些 api 而已,就这些工作都跟这个 agent 没什么关系。 然后继续看这里,这个 traffic api 呢,要因为高德他这个查询实时交通事件 api 他 是商用的,所以就需要提交工单去处理。然后我三天前还是两天前我就提交了这个工单,但是他到现在还没有给我一个答复, 所以呢,我就暂时把它写死了,就是把查询的结果写死了,就是道路畅通,没有重大的事故或者施工。但是我们也可以看一下这个具体的 traffic api, 我们来看一下 traffic api 也差不多就是对着那个高德开发者文档去解析数据就可以了, traffic api 在 下面这里。 好,我们来看一下。就首先呢先去拿到这个城市的 ad code, 就是他必须要求你要给他传一个 ad code, 那 这个 ad code 你 可以从高德的官方去下载,它是一张 excel 的 表,然后那我们这里没办法去读 excel 表的内容,所以呢就先把它转成了这个 字典,那转字典呢,就需要一个脚本,所以我就把它放在了 script 这个文件夹下面,我们可以看到这里的话,就是引入了 pandas code 去把 excel 表转成一个字典,然后转成之后的字典,我就把它放在了 constant 这个文件夹下面, 在这里就这个 c code, 你 看它非常长啊,非常长,因为除了台湾地区之外的城市都包含在里面了,非常长, 这就是 cd 扣的,然后呢你从这个 cd 扣里面就可以拿到这个城市他对应的这个 ad 扣,然后我们再回到这个 traffic api 这里再看一下。 好,我们回到这个 traffic api 这里,拿到这个 ad 扣之后就构建这个缓存的 t, 那 缓存的话我们就统一使用这个名称冒号,然后这个参数就这种这么一种格式,然后肯定是先查缓存,如果查到了就直接返回就可以了, 如果没查到的话就去调用 api, 然后就按照他那个文档里面的说明,去把他那些请求参数组成好,封装好就可以了,比如说这个什么时间戳啊,还有这个健全啊之类的。然后这里的话,因为我并没有真正去调用查询这个接口嘛,所以我就 休眠了两秒钟,就模拟这个查询用时,然后就在这里 get 了一下,但是我们刚刚前面也说了没有真正调动嘛,所以就其实就真正并没有真的走到这一步。 然后这里是解析它的输出,就是从它的这个返回的内容里面去拿出一些比较关键的字段,然后给它返回就可以了。比如说城市是什么,然后有哪些实时的交通事件,就是这个 traffic info, 然后我们再回到这个 info fashion 这里, 那这里的话我们直接把它写死,就是这样的。然后接着是推荐景点,就是这样的 cabli 的 api, 我 们来看一下这个 get attraction recommendation, 这个方法 就是根据城市当地的天气,还有当地的交通情况去推荐景点。我们来看一下,首先也是构建这个缓存的 key, 一 样也是它的这个事件名称,就是景点推荐嘛,就是 spot recommendation, 然后后面跟着这个参数,先查缓存也是一样的, 先查缓存,如果直接命中了就直接返回,然后如果没命中就去查询,调用接口查询就可以了,就调用这个 search 方法,就先出示的话,这个 tabby 的 扣端, 就调用这个 tablie client 这个构造函数,然后去调用它的 search 方法也是一样的,看着那个 tablie 官方的 api 文档去写就可以了,然后给它返回这个 result, 但是也别忘了要先把这个结果缓存到 release 当中,然后就给它返回就可以了,这就是 get attraction recommendation。 那 如果你要查询信息的话呢,这里的话,实际上用户他会说明自己的意图吗?就他要查天气还是查交通还是查这个景点之类的,所以呢, 这里实际上不应该这么写,我应该要根据用户的输入去返回他真正想要的内容。但是的话,目前我想的方法就是使用大元模型吗?但是这里我还没引用大元模型,所以就先把天气情况、交通还有这个景点都给它返回了, 比如是 inflater, 然后我们再看一下这个路径规划,就是另一个节点了,跟 inflater 平行的另一个节点就是 route planning, 我 们可以看一下,先看一下这个 graph 这里, 那经过了这个意图识别的节点之后,就有两个选择,你如果你的这个 intent result 是 curate inflater 这个节点,如果是 plan trip 的 话,那就走这个 route planning 这个节点,那这个 route planning 节点是我在这几个接口里面最后写的,所以呢, 我最终也是走了 plan trip。 实际上我们还是要通过大语言模型去判断它的意图嘛,在这里我就直接写死了,我们可以看一下,在 intent route 这里,我又直接写死的是 plan trip。 好, 我们来看一下,那如果是 plan trip 的 话,就意味着要走这个 route。 制定这些点,我们来看一下 它也是就是从用户的输入当中提取出起点还有终点,然后调用了高德的 api 去获取这个路线的规划。那怎么提取呢?就是最终还是要使用大语言模型,但是这里的话,我就还是把它写死了,还是把它写死了, 然后先输出一下这个日记,然后从这个 state 里面获取用户的输入,然后就提取出起点还有终点, 提取出这个起点还有终点,就调用这个 extract city route 这个方法。前面我们有一个 extract city 嘛,这里的话就是新建了一个文件,就是 extract city route, 就 把它起点还有终点拿到,我们可以看一下,就后续,我这里也说了,后续要接入大约模型去真正进行信息的抽水。在这里我就直接先写死,就从广州到深圳,然后你的出行方式就是 驾车啊,驾,这是什么行车啊?就是驾驶嘛,就是开汽车啊,那这里是一个 normalize travel mode, 这个方法我们可以先不用管它先,然后回到这里, 回到这里,呃,我们来往上看一下,那也是一样的,先去,哦,不是,是这个文件,对,这个 route planning 这个文件就是先拿到它的起点,终点还有它的出行方式,然后去调用这个 get route 方法,就是这个 route api 里面的, 我们先看下入手 api 这个文件吧。首先是 getcity coordinates, 就是 把城市名转换成为经纬度,转换成经纬度也是一样,去调用高德的这个 api 就 可以了。那我因为城市的经纬度是非常稳定的嘛,所以完全可以把它放到缓存里面,甚至你可以把它这个过期时间设置的比较长都没问题, 肯定是要查好,肯定是要放到缓存里面的,如果说你每次都要调用真实接口的话,那很没必要了,因为这个东西它很稳定 好,然后就是一样的,也是去呃调用这个 url 去 get, 就是 看着那个高德的文档去写就可以了,然后得到了它这个城市的坐标 location 好, 然后缓存起来,然后这是 get route 的 方法,也就是我们前面在这个 route landing 界面里面看到的,就真正调用这个 api, 这里 get route 的 这个方法 传的参数就是起点,终点,还有这个你的出行方式,就获得两点之间这个路径规划。那就是首先一样的,也是先构建这个缓存,那我们说缓存的格式就是你的事件,那就是 root 嘛, 然后你的这个参数就这样的,然后先查缓存,如果查到了就直接返回路线信息就可以,那路线信息肯定是把它包装成这个字母串去存进去 read 当中,那如果没有获取的话呢,就调用真实的接口,那也是一样的,要先去获取这个 起点和终点,它的这个经纬度,这是高德要求的。这就是为什么我们前面要写一个 get city coordinates 这个方法, 然后就就调用,根据出行方式去调用不同的 api, 如果你是行车的话,就调用这个 get driving route, 如果你是步行的话,就调用这个 get walking route。 下面这个呃骑自行车还有这个公交车也是一样的,就分别有四个接口,就我们自己写啊,我们自己写。 然后如果说你这个最终这个结果里面没有 error 这个 key 的 话,就最最终这个 result 它是个字典,那我们就给你附一个值,然后就把这个结果缓存进去就可以了。那我们来看一下具体的这个 get 方法, 那 get 方法其实也是没有什么好说的,就是按照这个高德的文档去开发就可以了,然后最终我们要把它的结果解析一下,因为你不可能把所有的数据都保存起来返回给用户,所以这里我们还有个解析的函数。我们再来看一下有个解析的函数, 就是首先先拿到这个 root, root 就是 从这个电台里面得到这个 root 字段,然后再从 root 字段里面得到这个 pass 字段,然后再取缔一条路线,然后再呃解析这个途径的点,就按照这个高德的 api 文档去开发就可以了, 按照它这个文档去开发就可以。所以呢,你会发现其实这个它是非常的重复化的一个工作,所以你完全可以给 ai 去做,我就直接用 cloud code 去做了。然后这里的话,如果你从广州到深圳,那你这个肯定是你这个 就是你开车都怎么着都得一个多小时嘛,对吧?所以呢,你不可能把所有的这个路径都给它返回起来,所以我就呃只返回前十个数据,那下面的这个 passport and result 这些也是一样的,也是一样的,你就直接交给 ai 去做就可以了,你自己 review 一下没什么问题,你自己调用一下就可以了。然后我这里就不展示最终调用的结果了, 反正呢,我们可以发现就是引入缓存之后快了很多,很多,就快了四千多倍,然后整体的这个接口的话都是没什么问题的。

redisk 创始人发明的 redlock 红锁,为什么会被剑桥大学的顶级分布式大佬公开写文章打脸?你能答上来吗?答不上来对吧?别慌,今天咱们对着这张动态图,一次性把这个面试必考的终极底层逻辑给你扒得干干净净。为什么会有 redlock? 因为普通的 radis 锁,主节点一挂,锁就丢了对吧?所以 radis 之父想了个狠招,我不搞主重了,我直接弄五个完全独立的主节点,你要加锁?行,只要你能在这五个节点里成功拿到三个以上的锁,也就是半数以上,就算你加锁成功。听起来是不是完美无瑕,逻辑彻底闭环了对吧?但你想想, 在真正的分布式环境里,真的有这么无懈可击吗?剑桥大学的大佬说了,你忽略了分布式系统里的一座大山,进城暂停。你想啊,咱们写 java 的 最怕什么?是不是负 gc? 你 看图里这个绿色的县城 a, 他 吭哧吭哧好不容易拿到了三个节点的锁, 刚准备去操作数据库,咔嚓, gc 来了,整个县城直接被死死冻结了十秒钟。但是朋友们, reddis 里的锁可是有过期时间的啊,你停顿了十秒,这锁早就超时自动释放了对不对? 这时候看这个蓝色的县城 b, 他 趁虚而入,也去申请锁,哎,他成功了,然后他欢天喜地去改了数据库。就在这个时候,县城 a 的 g c 结束了,他醒了,他完全不知道自己的锁已经过期了,也去改数据库,数据全乱套了, 你说吓人不吓人?那有人肯定不服气了,说,老师,那我不换个语言,我不用加吧?我没有 g c 是 不是就绝对安全了?大家看第三部分,时钟漂移,这又是一个神坑。假设县城 a 刚在节点一二三上加锁成功了,就在这时,节点三的服务器抽风了,时间往前跳跃了那么一点点,就跳这么一下, 导致节点三上的锁瞬间提前过期了。这时候县城 c 跑过来,在节点三四五上加锁,由于节点三没锁了,它居然也凑够了半数以上,也成功了。完了,同一个共享资源被两个县城同时锁住了,说好的互斥性呢?碎了一地啊!这就是大佬说的,把系统的安全性建立在极其不可靠的物理服务器时钟上, 是非常极其危险的。那难不成分布式锁是个伪命题? 大佬给出了真正的绝杀方案,叫做翻新 token, 也就是护栏令牌机制。啥意思呢?你想啊,既然锁有可能自己偷偷过期, 那我们在更新数据的时候加个校验不就行了?你看,每次拿到锁,锁服务不但给你锁,还必须给你一个单调递增的序号。县城 a 拿到了锁和序号三十三,结果他卡住了。县城 b 拿到了锁和序号三十四,去把数据库改了。等县城 a 醒过来,拿着旧序号三十三也想去改数据库的时候,看图上这个红色的盾牌, 数据库保安一看, a a a, 打住,我都已经处理过三十四号了,你个三十三号的过期货还来凑啥热闹,直接给你拦截掉,是不是一下就豁然开朗了? 所以咱们总结一下,讲了这么多,咱们平时到底还要不要用 redis 分 布式锁了?答案是,要用,但你得搞清楚你的场景,如果你用锁只是为了效率,比如防止用户手抖多点了一下,这种场景偶尔锁失效一次,大不了报个错。普通的 redis 单节点锁就完全够用了,连 redo 课都不需要上。 但如果你的场景是为了绝对正确,比如核心交易,一旦所失效就会扣错钱,导致重大资金损失。那听句劝,别迷信 raptor 课了,老老实实用做 keeper, 或者用数据库的乐观索取兜底 技术,永远都在做权衡,没有绝对的完美。下次面试,你把这套底层逻辑给面试官一讲,保证他直接对你刮目相看。本视频的代码笔记,我整理进了两百万字的 java 与 ai 大 模型学习笔记里了,里面包含了三十多个项目场景实战笔记,还有不同工作年限同学的简历模板,以及一份 java 加 ai 的 三十天面试突击学习路线,需要的话直接拿去。

面试官,你用 radis 实现过分布式锁吗?怎么做的?后选人 set next 加锁, expire 设置过期,用 u u i d 防止误删。 面试官,那 s a t n x 和 expire 不是 原子操作怎么办?主从同步延迟导致锁丢失怎么办? red log 有 什么问题?后人可以用撸啊脚本保证原子性?主从,那个没考虑过。这道题从 p 六到 p 八都在考,达到什么级别就定什么级,牛逼 牛逼。今天面一个七年经验的架构师,后选人做过日活千万的系统。我问他高并发症场景下,你怎么做分布式锁? 他用 radis s a t n x 加 expire value 存 u u i d 释放时判断是不是自己的锁。我, s a t n x 和 expire 不是 原子的怎么办?他 radis 二点六之后可以用 s a t n x 一 条命令。我好, 那锁过期了,业务还没执行完怎么办?它可以开启一个守护县城去续期,我那叫锁续期。 reddison 的 watchdog 机制下一个问题, reddison 主从架构下,主节点宕机了, 锁还没同步到从节点怎么办?它可能会有多个客户端拿到锁。我对那 reddison 作者提出的 red lock 能解决吗?有什么问题?他向多个 reddison 提交锁,超过半数成功,就算成功。 我那 martin cleveland 的 批评文章看过吗?说 redlock 有 三大问题你知道吗?他 没看过,这就是典型的会实现,不懂缺陷。 reddis 分 布式锁是架构师的核心能力,但能讲清 redlock 争议的人不到百分之五四个层次。如果这道题目你也不会回答的话。我整理了让大厂 hr 沉默的必考题库,包含 jvm 夺命连环问、 spring 灵魂八谷高并发必杀场景、 radis 深度陷阱点个赞,评论区甩六六六,打包带走 nice。 本质一,基础实现 s e t n 乘 e x 的 四个坑 radis 分 布式锁的标准命令是 sat lock underscore key unique underscore value nxx30。 这条命令的含义是只有当锁 key 不 存在时才能设置成功,同时设置过期时间为三十秒。这个方案存在四个常见的坑,第一个坑是忘记设置过期时间,这样锁永远不会被释放,形成死锁。 第二个坑是过期时间设置太短,比如业务逻辑需要执行五十秒,但锁只有三十秒就会自动释放,其他县城就可能拿到锁,导致病发问题。第三个坑是释放锁时没有判断 value 是 否属于自己。 如果县城 a 的 锁因为业务超时已经自动释放了,县城 b 拿到了锁,此时县城 a 执行完毕去释放锁,如果没有判断,直接 d、 e、 l, 就 会把县城 b 的 锁误删掉。第四个坑是判断 value 和删除操作不是原子的。 即使在释放锁时,先通过 get 命令判断 value 是 否匹配,再执行 get 命令,但这两条命令之间如果有其他县城介入,仍然会出现误删。解决误删问题的方案是使用卢爱脚本,将 get 判断和 d、 e、 l 操作放在一个脚本中执行, radis 会保证整个脚本的原子性。 脚本逻辑是,如果当前锁 key 的 值等于传入的 unique value, 就 删除这个 key, 否则不做任何操作。本质二,锁续期 watchdog 机制锁过期时间设置太短,业务没执行完锁就释放了,这是一个普遍问题。 redison 框架提出的解决方案叫做 watchdog 机制。 watchdog 的 原理是在加锁成功后, redison 会启动一个后台守护县城,这个县城会每隔锁过期时间的三分之一 检查一次业务是否还在执行。如果业务还没有结束,守护县城就会自动把锁的过期时间续期到三十秒。 这个过程会不断重复,直到业务主动释放锁,守护县城才会销毁。这样即使业务执行了一小时,锁也不会因为超时自动释放。使用 redison 实现自动续期的代码非常简单, lock 点 lock 方法默认就会开启 watchdog 机制。 业务逻辑写在 try 块儿中, find 里块儿中调用 lock unlock 释放锁。如果需要手动控制锁的过期时间,也可以使用 lock lock 方法,这样锁会在十秒后自动释放,不会开启 watchdog 进行续期。本质三,储存架构的问题,锁丢失 radis 为了保证高可用,通常会部署主存架构。但主存架构下,分布式锁存在一个严重的安全问题。锁丢失的场景是这样的, 客户端 a 在 master 节点上成功拿到了锁,但是 master 节点还没来得及把这条数据同步到 slave 节点,就突然宕机了。 这时哨兵机制会选举一个 slave 节点成为新的 master。 由于这个新 master 上没有锁的数据,客户端 b 就 可以在新 master 上成功拿到同一个锁。 最终结果是,客户端 a 和客户端 b 同时持有这把锁,分布式锁完全失效。这个问题的根本原因是 radis 的 主从复制是异步的,无法保证强一致性, 而分布式锁需要的是 c p, 但 radis 是 a p 系统,这个锁丢失问题没有完美的解决方案。 业界通常的应对策略有三种,第一,使用 redlock 算法向多个独立的 radis 实利请求锁,而不是依赖主从复制。第二,使用 zooker 或 etcd 这种强一致性的分布式协调服务来替代 radis。 第三,接受极小概率的所丢失,在业务逻辑层面实现密等性来兜底。本质四, red lock 算法及其争议 red lock 是 reddis 作者提出的分布式所算法, 它的设计思路是部署 n 个完全独立的 reddis 实力客户端,加锁时向这 n 个实力都请求锁,请求锁的超时时间要远小于锁的总过期时间。 客户端需要在超过半数的实力上成功拿到锁才算加锁成功,并且从发起请求到最终拿到锁的总耗时必须小于锁的过期时间。 这个算法在业界引发了巨大争议。著名的分布式系统专家 martin claptman 发表了一篇长文批评 redlock, 指出三大问题。第一个问题是依赖系统时钟。 redlock 算法依赖各 reddis 时历的时钟来判断锁是否过期。 如果某个 reddis 实力的时钟发生了漂移,可能导致多个客户端同时持有锁。第二个问题是 gc 停顿, 客户端的垃圾回收会导致长时间 stw, 如果 stw 时间超过了锁的过期时间,客户端自己都不知道锁已经过期了,这时再执行释放锁操作会出现问题。 第三个问题是网络延迟,在复杂的网络环境下无法保证 redlock 算法的正确性。假设目前业界的共识是绝大多数场景下使用单机 readis 加上所需期机制并在业务层做好密等性, 接受极小概率的所丢失,性价比最高。对于需要强一致性的场景,应该直接使用 zokeeper 或 etcd red log 算法,理论意义大于实际价值,很少在生产环境中使用,这个就叫专业。 最后来播灵魂总结,下次面试官问你, radis 分 布式锁,你要讲出基础, s a t n x 原子命令 u u i d 防止误删撸爱脚本,保证释放原子性续期 radison 的 watchdog 机制防止锁过期业务未完成。 主从问题,主从延迟导致所丢失无法完美解决 red lock 争议,时钟漂移, g c 停顿,网络延迟,实际很少用。这道题答透了阿里 p 七的定级就是你了,牛逼牛逼。

说实话,初学者才会觉得,刚靠 register 就 能解决百万人直播间的点赞场景,今天这条一分钟的视频你好好听,会直接把你的架构思维提升一个档次。很多人脑子里的方案特别简单,用户点一次赞,请求发到后端, register 点赞数加一,听起来没毛病,对吧?但问题如果真那么搞,百万直播间一开,你服务器第一个先被点炸。 因为直播间点赞这种场景最最恐怖的地方是请求频率特别离谱,几十万人平时疯狂的戳屏幕,有的人甚至一次请求,这不是纯纯的给服务器上压力吗? 所以真正成熟的系统,第一步优化根本不是 reddit, 而是前端先销疯。什么意思?比如用户一秒钟点了二十次赞,前端根本没有必要发二次请求,而是先攒一会,再一次性的发送加二十,这样请求量就会直接暴跌。很多人天天研究 reddit 集群落脚本 paperline, 结果最最该优化的地方在前端。 然后第二个问题就来了,很多人又会觉得,那 ruby 的 肯定稳了。别急,真正的大坑现在才刚开始。因为如果所有点赞请求全部打在 ruby 的 一个 key 上,比如 le 五零零一 like count, 那 这个可以很容易直接变成热点,一个 ruby 的 节点被疯狂的抗压,别的节点在旁边看戏,最后单节点 cpu 直接打满, 这时候怎么办?针痛!成熟的系统一般会做热点分散,比如按照用户 id 进行分桶, le 五零零一, le 五零零一 like 三,不同用户打到不同的桶上, 这样请求压力就被分散了,查询的时候再做汇总统计,这才是真正的大流量设计。然后还有一个特别经典的问题,很多人一听点赞存在 reddit, 立马开始紧张了, reddit 挂了怎么办?终于问到点子上了。因为点赞这种场景,本来就不是一个强一致性的场景,你真以为用户少点了三个赞,主播会连夜报警? 很多时候,哪怕丢一点数据,业务也是可以接受的。所以真正成熟的系统,一般会 rex 扛高并发,定时任务亦步刷库。比如说每隔几秒把 rex 里的点赞增量同步到 my circle, 这样即使 rex 挂了,最多也就是丢最近几秒的数据,不会全没。这其实就是用少量的数据丢失,换超高并发的能力。这才是真正的互联网架构思维。 很多初学者最大的问题是什么?总想着绝对不能丢一条数据,结果最后系统性能直接被自己干爆。真正成熟的系统设计,从来不是绝对完美,而是业务到底能不能接受什么程度的不一致。 所以最后总结一句,很多人认为百万直播间点赞核心是 reddit 够不够快。但真正成熟的系统,更关心的是前端怎么消风,热点怎么分散,数据到底怎么低成本持久化。因为真正可怕的从来不是高并发,而是所有请求同时打在同一个地方。最后留个问题,如果是你,你会优先优化前端消风, reddit 热点还是数据库落盘呢?

redisk 避坑指南,那些架构师不会告诉你的性能的陷阱?大家好,我是孟哥,做 java 后端这么多年,发现许多同学用 redisk, 只知道调大内存,就会觉得万事大吉了,殊不知踩了许多性能的陷阱,最后系统卡顿,丢数据,甚至线上崩溃。 今天孟哥就给你讲五个 reddit 高频的陷阱,都是架构师不愿多说的干货,面试的时候和工作的时候都能够避坑。另外,我把面试过程中的常见的问题整理了一个文档,只 要你是我的粉丝,留言三个六,就可以打包带走。第一个陷阱, case 命令就是定时的炸弹。许多同学在代码里面写了 case 星 case user 这类的操作看似简单,在生产环境下就是致命的, 它会锁住整个浏览器,导致所有的请求卡住。我有个朋友就是因为这个生产环境挂了二十分钟,直接被领导约谈。正确的方法是用 scan 的 命令代替,它是渐近式的扫描,不会影响阻设。 radis 百万 k 的 实力下, scan 的 命令无感知,完全不影响用户的体验。第二个陷阱还停了。 radis 是 单线城的认知,很多同学都以为 radis 一 直是单线城, 其实 reddit 从六点零开始,官方引入了多线城的 i o 模型,所以核心的命令执行还是单线城。多线城只是用于网络 i o 和命令的解析,开启后性能提升明显。配置也相当简单,修改配置文件,开启 i o thread, 设置 i o thread 的 number 一 般设置成 cpu 核心数的两倍。我之前在高病发的项目里面就是这样配的, k p s 从十万提升到十六万,延迟还降低了。第三个陷阱,不用 paypal 就是 浪费生命, 如果需要一次执行多个命令,还一条一条的发送,就纯粹是浪费网络的延迟。我之前做批量导入系统,用了批量之后,吞吐量从每秒两千提升到一万六, 直接发到八倍,积少成多,让批量的操作一定要用批量 and get 这类方式。第四个陷阱,分不清缓存的三大问题,缓存穿透即穿血崩,很多同学傻傻的分不清,最后数据库 被打挂了。缓存穿透就是查不到存在的 key, 直接打到数据库,用缓存空值或者是布隆过滤器来解决。缓存击穿就是热点的 key 过期,大量的请求打到数据库,用护视锁或提前更新进行解决。缓存雪崩就是大量的 key 同时过期,给过期的 时间加上随机数,能够避坑。我在电商秒杀项目里面就是这样做的,系统它的链接从八百降到五十以内,服务稳如老狗。 第五个陷阱,持久化的策略选的不对,丢数据又丢钱。 ide 执行的持久化由 r d b 和 a o f ide 性能好,但是可能丢数据, a o f 可靠,但性能稍差。现在最佳的实践是混合持久化 ide, 四点零以后支持进行开启,既保证了可信,又能够兼顾性能。 我们公司之前用的是纯 a o f ide, 重启需要二十分钟,改成混合持久化以后只需要三分钟,效果立竿见影。 所以在实际的应用中,这五个陷阱一定要避开,用 scan 代替 case, 合理的开启多县城的 i o 批量的操作,用 paper lab 防范缓存的三大问题,选对持久化的策略,做好这几点,你的 register 应用就又快又稳。

什么是 radis? 它为什么这么厉害?大家好,今天我们来聊一个在互联网系统里几乎无处不在的工具。 radis 你 可能没有直接接触过它,但你每天刷朋友圈、逛电商、玩游戏,其实都在用它。 先搞清楚 radius 的 身份, radius 的 全称是 remote dictionary server, 翻译过来是远程字典服务。听起来有点复杂,但你可以把它简单理解为一个速度极快的内存数据库。这里有两个关键词,内存加数据库。先说内存, 我们平时的数据大多存在硬盘里,比如照片、文件这些。硬盘的优点是容量大,但缺点是读写速度慢。而 radis 把数据放在内存里,内存的速度比硬盘快很多倍。 你可以这样理解,硬盘就像仓库,取东西要跑过去找内存就像你面前的桌子,伸手就能拿。这就是 radis 最核心的优势,快! 再说数据库,既然是数据库,它就能存数据、取数据、操作数据。但和传统数据库比如 my sql 不 同, readis 的 数据结构更加灵活。传统数据库更像表格,所有数据都要按固定格式存储。 而 readis 更像一个万能收纳盒,它支持多种数据类型,比如区块、哈希列表集合、 有序集合,不管是简单数据还是复杂结构,都能轻松存储,而且读取非常快。那 readis 到底有多快?官方数据是每秒可以处理十几万到几十万次读写请求, 这是什么概念?比如你刷朋友圈,点一下刷新内容,几乎是瞬间加载出来的,很大一部分原因就是这些高频数据已经提前放在 readis 里了,直接从内存读取,不用走慢吞吞的数据库。如果没有 readis, 很多操作可能都会卡顿好几秒。 除了快, readis 还有几个非常实用的能力。第一个,多数据结构支持,比如电商购物车可以用哈希结构存用户的商品信息,朋友圈点赞可以用有序集合来排序和统计,操作简单又高效。 第二个,持久化能力。你可能会担心,数据都在内存里,断电不就丢了? readis 其实支持持久化,会把数据定期保存到硬盘, 这样即使服务器重启,也能把数据恢复回来,就像你写东西时会定期保存一样,不怕突然断电。第三个,分布式能力。 像淘宝、京东这种大平台,访问量非常大,一台服务器根本扛不住。 radis 可以 把数据分散到多台机器上,比如不同地区的用户访问不同节点分担压力, 就算某一台机器出问题,整体服务也不会崩掉。那 radis 一 般用在哪些地方?最常见的有三个。 第一,缓存,这是 radis 最主要的,用图像、朋友圈、电商商品页、推荐列表这些高频访问内容都会放在 radis 里,提高访问速度。 第二,计数器。比如阅读量、播放量、销量这些需要实时更新的数据。 readis 有 自增自减,操作既快又准确。第三,分布式锁, 比如秒杀场景,很多人同时抢一个商品,用 readis 可以 控制同一时间只有一个人成功,避免超卖。 那 readis 难不难学?其实不难,它的命令非常简单,比如存数据用 set, 取数据用 get, 就 像发消息一样直观。而且现在也有很多格式化工具,不写命令也能操作, 无论你用的是 java、 python 还是 php, 都有现成的 readis 客户端可以直接用。 最后总结一下, readys 是 一个基于内存的高性能数据库,支持多种数据结构,它最大的优势就是快, 也正因为这个特点,它在缓存、计数器、分布式锁这些场景中几乎是不可替代的。可以说,我们日常流畅的互联网体验背后,都有 readys 在 默默支撑。

用本地缓存解决 register key 倾斜的都是初学者,先别着急反驳。我就问你一句,你这个方案是解决问题还是给自己埋坑?很多人一听到 register key 倾斜,第一反应就是加一层本地缓存,理由也很简单,减少 register 压力,提高响应速度。听起来是不是很合理?但如果这样的话,你解决的不是问题,而是引入了新的问题。 我们先说一下什么是 p 倾斜,就是一个或几个 p 占了绝大部分流量,比如热门商品秒杀库存绑单数据,所有请求集中打在端机的集群中的一个分片上,导致这个分片被打爆了。这时候你家本地缓存会发生什么? 表面上反馈更快了,实际上问题更复杂了。最大的问题只有一个,数据一致性,直接出问题。你一台机器一份缓存还好,一旦是多实体集群部署,每台机器都有自己的本地缓存,数据更新不同步,用户看到的数据就不一致。比如 a 用户看到的库存,还有 b 用户看到的库存已经没了,那你这个系统还能用吗? 所以真正的问题在哪?是数据分布不均?那正确的解决思路是什么呢?我跟你猜。三种场景,一、多个热点,譬如说你有多个热门商品, 如果他们刚好录到同一个热点的分片上怎么办?打伞,让他们分布到不同的分片中,核心的目标就是让热点分开成压成点。二、最常见就一个热点替被方方访问,那怎么办?比如 iphone 十七单品秒杀, 答案是加后缀打伞。比如 prada 幺零零幺杠幺, prada 幺零零幺杠二, prada 幺零零幺杠三,把一个热点拆分成多个,这样的话请求会随机命中,从一个点放大变成多个点均摊 场景三大 key, 一个 key 数据量特别大,比如说带详情介绍的公开课列表,每次操作都很重,那怎么办?拆分,把这些公开课分段存储,分段查询,避免单个 key 成为性能瓶颈。看到没有,真正的优化思路是让数据分散,而不是对缓存。 那本地缓存到底能不能用呢?可以,但前提是你能接受数据不一致的风险,否则它不是优化,是隐患。最后给你一个面试加分。总结, t 倾斜的本质是数据分布不均。对于多个热点 t, 应该通过分片打散,对于单个热点 t, 应该通过加后缀来分摊压力。对于大 t 应该进行拆分。本地缓存虽然可以缓解压力,但会引入数据不一致的问题,不能作为核心解决方案。 最后一句话,真正的优化是让系统更稳定,而不是更复杂。有个讨论话题,在你的项目中,能接受本地缓存带来的数据不一致问题吗?什么场景下能接受,什么场景下绝对不行?为什么?

如果我问你在你的系统里 reddis 是 干嘛的,我相信百分之九十九的人第一反应就是,那还用问吗?缓存呢?挡在 macbook 前面防止流量冲击啊,给数据库续命用的? 没错,这是过去十年的标准答案。要是你身边有一个同事告诉你,还没听说过什么缓存穿透啊,缓存击穿啊,缓存血崩这些套路的话,我估计你都会瞪大眼睛觉得难以置信吧。 那么今天我直接问你个更刺激的,在如今这个动不动就千万级流量的高病发场景下,可不可以完全把麦穗口踢掉,就让 radis 自己做主库的?你不妨把视频暂停两秒,在评论区说说你觉得可以还是不可以,并简单说说你的理由。 我猜啊,肯定有朋友要做,没了,这博主喝多了吧, radis 不 可靠啊,基于内存工作断电就会丢失啊,还有内存那么贵,烧得起吗? 我可以很负责任的告诉你,在高并发的核心交易场景下, reddis 不 仅能够替代卖手口,而且很多你手机里装的大厂 app, 他 们的核心内容早就是这么干的了。 但是这个但是很关键,如果你听完我刚才那句话,回去就把 jdbc 连接直接改成 reddis, 以为这样就是所谓的架构升级了,那我劝你趁早把辞职报告也一起写好, 因为要用 radis 替换 my circle, 绝对不是简单的换个库就完了,甚至都不是说把一个关系型数据库换成 no circle 数据库那么简单,它是一场思维方式的革命,它需要一套严密的体系来支撑。今天我就带大家把这套 radis 上位的架构逻辑彻底的拆解清楚。 这期内容比较干,说实话,我也很难保证你一次就能听懂。如果你真的希望吃透这个视频,不妨点赞收藏,回头可以多看两遍。我是洛兰系好安全带,咱们 radis 走起! 我们先来说说为什么要冒这个险?那麦穗会用的好好的,你瞎折腾个啥呀?原因很简单,因为现在的流量环境变了,传统的开启了 side 旁路缓存的模式,在高病发的场景下,简直就是一致性地域了。 你可以想想,为了用好 radis, 加上 micro 这对组合,你背了多少无脑的面试题了?到底是先删缓存还是先删库啊?数据组重延迟了怎么办呢? 缓存延时双删到底要设置多少毫秒啊?怎么用不隆过滤器过滤掉无效请求啊?为了填补这些坑,我们后面还要逐渐引入什么消息队列? canal, 一个简单的数据持久化开始变得越来越复杂。 如果我们可以直接用 radis 做主库,最大的诱惑也就在这里。极简架构带来的极致性能,第一,彻底消灭了数据一致性的梦魇。只要是缓存加数据库,两套存储就一定会有不一致。 如果 radis 直接成了主库,数据员只有一个,那什么缓存穿透、缓存血崩,数据不一致这些概念直接就消失了,你的代码逻辑会变得异常的干净。第二,性能维度的降维打击, 麦斯口再怎么优化,哪怕你上了最好的 ssd, 它终究是基于 b 加速的磁盘 o, 而 radis 是 纯内存操作加上精心设计的数据结构,它俩的吞吐量根本不在一个数量级, 在高病发的场景下,非要把这俩绑在一起,这就像要把 f 一 赛车和拖拉机组队,谁的优势都无法发挥到极致。 现在直接把麦这款拿掉, radis 你 能跑多快就跑多快,这样听起来是不是很爽?但为什么只有大厂敢这么干呢? 因为要让 radis 真正去坐稳主库的位置,有三个要命的拦路虎,你不得不去先解决掉。 第一,数据到底安不安全?第二,复杂的业务逻辑应该怎么搞?第三,内存这么贵,成本怎么算?只要解决了这三个问题, reddit 上位就是水到渠成的事情。接下来咱们一个一个来破解。 第一, reddit 保存数据不安全。曾经啊, reddit 基于内存工作,数据断电就容易丢失,但到了现在,这已经是一个最大的谎言了。很多人觉得 reddit 不 安全,是因为默认它是一步刷盘的,但只要配置得当, reddit 的 数据安全性是不输慢缩口的。 给 reddit 加上 a o f 持久化,把 append f sync 配置成 always 或者是 every second, 再配上 class 的 集群,配合多副本。 这就好比现代的分布式数据库了,主节点挂了,虽然提到哨兵或者 class 的 集群也能迅速切换,重节点立马顶上。要是再不放心,再上个 reddit 企业版,所有你要担心的运维问题全部都给承包了。 实战里,只要不是机房被炸了,这种物理毁灭, reddit 的 数据可能性完全是企业级的。 第二, reddis 无法兼容复杂的查询业务。 reddis 是 key value 型的数据,没有 circle 无法做复杂查询。 如果你还这么想,那你真的是落伍了。现在 reddis stack 扩展包都已经完全集成到 reddis 里了, reddis stack 中就提供了 search 搜索模块,它内置了倒排缩影。你以前在 my circle 里写 circle 语句,现在换个形式,在 reddis search 里一样能查,而且支持权威解锁。 更刺激的是,因为数据全在内存做复杂聚合分析时,它的速度是 micro 的 十几倍,这不是妥协,是进化。 第三,内存成本高,内存比硬盘贵啊,这是个最现实的问题,业务量大了以后,全内存确实非常烧钱,但是作为一个聪明的架构师,你不需要把所有数据都放到内存里啊。这里就需要引入一种非常重要,也是非常常见的思想冷热分离。 举个例子,一个社交 app, 大家最关心的其实就是最近三天的动态,这叫做热数据,把它放内存里没毛病, 但三天前的动态,谁没事天天去翻呢?这叫冷数据,这就别在内存里占位置了。现在有很多技术,比如 reddit on flash 或者兼容协议的 kvrocks, 都可以自动把冷数据承降到 ssd 硬盘上。 这样一来,你的成本可能只比纯 micro 高出百分之二十,但性能却提升了一百倍,这笔账老板肯定是算的过来的。想明白了上面那三个问题,恭喜你啊,你还只是刚刚入门 真正的高手。用 radis 替换 micro, 看中的还不仅仅是存取速度,而是在于它能带来更灵活的架构设计,能让我们打破很多传统架构的束缚。这里呢,我只给你举一个例子,原子计算前置 radis 有 着极高的病发能力,单节点轻松十万加 qps, 在 大部分的业务场景当中,是很难触碰到 radis 的 天花板的。这决定了我们不需要像保护莫斯科那样层层设防,甚至可以让 radis 的 架构的更前端发挥作用。 咱们拿最简单的秒杀场景来说,要问秒杀最怕的是什么,你肯定会说,怕超卖啊!所以你已经习惯了在 reddison 里去完成库存扣减,但除此之外,其实还能让 reddison 作为第一道流量的闸门。传统做法是怎样的呢? 用户请求进来之后,先过网关,再到加把后端服务,然后调用 reddit 路亚脚本进行库存检查,如果库存充足,就在 reddit 里扣减库存,返回成功。如果 reddit 里商品库存没了,那就表示这个商品被抢完了直接返回。 为什么是 u r 呢?因为它是原子性的,一个 u r 脚本在 radis 里是原子执行的,没有任何并发症问题,连分布式锁都省了。但是商品被抢完之后呢?大量抢不到商品的请求还是会打到你的后端服务上,让你的 cpu 继续狂飙。 如果用 radis 做主导的架构,我们就可以换个玩法。因为 radis 的 性能是游刃有余的,所以我们可以把 radis 中一些业务直接提前到网关中,让网关也来参与分担业务压力。 我们可以在 radis 里设置一个简单的 key, 比如 product 幺零零幺 status 等于 finished, 表示这个商品已经受庆了。 这时候重点来了,我们不需要等到请求进了后端服务才去查这个 key, 我 们直接在 ingx 网关层配合 openrest, 在 ingx 网关中直接调起路由脚本,去读 radis 的 这个标志位, 只要读到这个已受庆的标志位, ingx 在 最外层就可以返回抢购失败。流程就变成了这样,用户请求一道网关,网关里的路由脚本毫秒即读取 radis, 发现是已受庆了,网关直接返回抢购失败,大家看懂了吗? 这部分流量根本就没有进入你的 java 后端,你的后端服务安安静静,完全没有负债。这就是架构设计的艺术, 打破数据隔离,让计算向前移动。在传统架构里,网关不应该直接触碰数据库,但在 radis 高并发架构里,这种网关加 radis 的 直连配合,能把并发拦截在最外层。 而且在这种模式下,还可以将 reddit 的 重节点和 nxt 网关保持部署在同一个节点下,利用 reddit 的 集群机制,将主节点写入的库存数据同步到重节点,这样 nxt 读取 reddit 数据的时候,连网络 i o 的 性能消耗都可以压缩到极致。 如果再把这样的节点进行扩展,扩展成一个大的集群,那这个架构是什么样的?是不是非常精彩?这才是 ratis 上位的真正威力。最后,聊了那么多技术,我们再回过头来聊聊人。 我今天分享这个话题,哦,不是为了让你明天就把公司的 micro 全删了。 micro 在 强以至信,在复杂报表分析领域依然是王者。我想传达的是,在 ai 时代,在流量爆表的时代,程序员不能只有一把锤子。 我们今天聊的 reddit 替换 micro, 表面上是在换工具,实际上是要告诉你,人生和工作也一样,不是只有一种工具。 当你习惯了 micro 这个锤子,为了满足各种需求费尽精力的找钉子的时候,不妨偶尔试试放下锤子,去看看外面的世界,去尝试一下那些让你觉得危险但充满可能性的新工具。 这个时候, ai 不 再是你的敌人,而是你的工具。你有一个成熟的想法,但是苦于无法说服你的老板跟你一起冒险,不妨试试让 ai 来帮你梳理一下思路。 当你对于在 openrest 你 去写很长的 lua 脚本感到畏手畏脚时, ai 能帮你写出很完美的脚本,敢于打破常规,根据场景选择更合适的工具。这是人类架构式的特权,也是你的护城河。 如果你对我刚刚提到的 ngx 加 lua 加 radis 网关拦截代码感兴趣,或者是想看看这套秒杀场景当中如何进一步地通过集群机制极致地挖掘 radis 的 病发性能,在评论区扣个六六六, 人多的话,我下期直接给你手势,一套应对海量并发的秒杀架构。当然,和秒杀架构类似的直播带货也是没问题的。我是楼兰,关注我, it 路上,我们一起进步!

兄弟们,锐志之父啊,搓出 deepsea v 四专属推理引擎啊!项目已开园了,这个 d s 四呢,让 mac 上的这个 deepsea v 四 fit 版呢跑到极致啊! 使用 c 结合 metal 开发呀! metal 呢,是苹果的 gpu 框架啊,一百二十八 g 的 这个 macbook pro m 三 max 上啊,升程速度能到二十六点六八 to 每秒啊。 一是使用非对称量化两比特呢,质量化 moe 漏油专家,其他权重都是 q 八精度哈。二是呢, qv 缓存呢,会保存到磁盘上啊!三是支持 open io 和 cloud api 兼容接口啊。