如果我问你在你的系统里 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 路上,我们一起进步!
粉丝7272获赞2.2万

你好,我是 redis, 一个叫 enter res 的男人把我带到了这个世界上。说起我的诞生跟关系数据库 my s q l 还挺有渊源的。在我还没来到这个世界上的时候, my s q l 过得很辛苦。互联网发展的越来越快,他容纳的数据也越来越多,用户请求也随之暴涨, 而每一个用户请求都变成了对他的一个又一个读写操作。 mysql 是苦不堪言,尤其是到双十一六幺八这种全民购物狂欢的日子,都是 mysql 受苦受难的日子。据后来他告诉我说,其实有一大半的用户请求都是毒操作, 而且经常都是重复查询一个东西,浪费他很多时间去进行磁盘 io。 后来有人就琢磨是不是可以学学 cpu, 给数据库也加一个缓存呢?于是我就诞生了。出生不久,我就和 mysql 成为了好朋友,我们俩常常携手出现在后端 服务器中,应用程序们从 misql 查询到的数据在我这里登记一下,后面在需要用到的时候就先找我要。我这里没有在找 misql 要。为了方便使用,我支持好几种数据结构的存储, 因为我把登记的数据都记录在内存中,不用去执行漫如蜗牛的 io 操作,所以找我要比找 mysql 要省去了不少的时间呢。可别小瞧这简单的一个改变,我可为 mysql 减轻了不小的负担。 随着程序的运行,我缓存的数据越来越多,有相当部分时间我都给他挡住了用户请求。不过很快我发现事情不妙了,我缓存的数据都是在内存中,不能无节制的这么存下去,我得想个办法,不然迟早要完。 不久,我想到了一个办法,给缓存内容设置一个超时时间,具体设置多少时间我不管,交给应用程序自己来。我要做到 就是把过期了的内容从我里面删除掉。其实腾出空间就行了,我决定一百毫秒就做一次,一秒钟就是十次,我清理的时候也不能一口气把所有过期的都给删除掉。我这里面存了大量的数据,要全面扫一遍的话,那不知道要花多久时间,会严重影响我接待新的客户请求的 时间紧,任务重,我只好随机选择一部分,能缓解内存压力就行了。就这样过了一段日子,我发现有些个兼职运气比较好, 每次都没有被我的随机算法选中,这可不行,于是在原来定期删除的基础上,又加了一招。 那些原来逃脱我随机选择算法的兼职,一旦遇到查询请求被我发现已经超期了,那我就绝不客气立即删除。这种方式因为是被动式触发的,不查询就不会发生,所以也叫惰性删除。可是 还是有部分兼职既逃脱了我的随机选择算法,又一直没有被查询,导致他们一直逍遥法外。而与此同时,可以使用的内存空间却越来越少。而且就算退一步讲,我能够把过期的数据都删除掉, 那万一过期时间设置的很长,还没等到我去清理内存就吃满了一样,要吃早要晚,所以我还得想个办法。我苦思良久,终于憋出了个大招,内存淘汰策略。这一次我要彻底解决问题,我提供了八种策略,供应用程序选择, 用于我遇到内存不足时该如何决策?有了上面几套组合权,我再也不用担心过期数据多了,把空间充满的问题了。我的日子过得还挺舒坦,不过 my s q l 大哥就没我这么舒坦了。有时候遇到些烦人的请求,查询的数据不存在, my s q l 就要白忙活一场。不仅如此,因为不存 在,我也没法缓存啊,导致同样的请求来了,每次都要去让 mysql 白忙活一场,我作为缓存的价值就没得到体现了,这就是人们常说的缓存穿透。有一次 mysql 那家伙正悠哉悠哉的摸鱼,突然一大堆请求给他兑了过去,给他打了一个措手不及。 一阵忙活之后, misql 怒气冲冲的找到了我兄弟,嗯?咋回事啊,怎么一下子来的这么猛?我查看了日志,赶紧解释道,大哥,实在不好意思,刚刚有一个热点数据到了过期时间被我删掉了,不巧的是,随后就有对这个数据的大量查询请求来了,我这里已经删了, 所以请求都发到你那里来了,你这担子叫啥事,下次注意点啊。 mysql 大哥一脸不高兴的离开了,这一件小事我也没怎么放在心上,随后就抛之脑后了,却没曾想几天之后,竟 捅了更大的篓子。那一天又出现了大量的网络请求发到了 mysql 那边,上一次的规模大得多, mysql 大堆,一会功夫就给干趴下了,好几次等了好半天,这一波流量才算过去, mysql 才缓过神来。 老弟,这一次又是什么原因? mysql 大哥累的没了力气,这一次比上一次更不巧,这一次是一大批数据几乎同时过了有效期,然后又发生了很多对这些数据的请求,所以比起上一次,这规模更大了。 msql 大哥听了眉头一皱,那你倒是想个办法呀,三天两头折磨我,这谁顶得住啊?其实我也很无奈,这个时间也不是我设置的, 要不我去找应用程序说说,让他把缓存过期时间设置的均匀一些,至少别让大量数据集体失效。走,咱俩一起去。后来我俩去找应用程序商量了, 不仅把兼职的过期时间随机了一下,还设置了热点数据永不过期。这个问题缓解了不少,我们终于又过上了舒坦的日子。哦,对了,我们还把这两次发生的问题分别取了个名字,缓存击穿和缓存雪崩。有一天,我正在努力工作中,不小心出了错,整个进程都崩溃了。 当我再次启动后,之前缓存的数据全都没了,暴风雨式的请求再一次全都兑到了 misql 大哥那里,被他喷了个狗血淋头,哎,要是我能够记住崩溃前缓存的内容就好了。

每天一个 java 面试题,今天我们要讲的是 read 篇题目, read 和 sql 如何保证数据一致性? read 和 sql 保证数据一致性是面试必考题,也是分布式系统的一个经典难题。 我们追求的是最终一致性,而不是强一致性。核心思路是尽量让 sql 作为唯一可信的数据源,让缓存 read 处于从属地位。最常用也最推荐的方案叫做先更新数据库,再删除缓存。 具体操作分两步,第一步,先更新 my sql 数据库,第二步,紧接着删除 reds 中对应的缓存数据。为什么是删除缓存而不是更新缓存呢?因为在病发写入多的场景下,直接更新缓存可能导致数据错乱,而删除操作是密等的,更简单可靠。这个方案有一个小概率的缺陷, 如果第二步删除缓存失败了,就会导致数据库是新数据,缓存里还是旧数据。所以我们通常需要搭配一个易步的重试机制,比如把删除失败的任务丢到消息队列里,确保最终能删掉。对于一致性要求极高的场景,还有一种更彻底的方案,订阅麦 c 酷的冰 log 日制, 通过 canal 这样的中间键,实时监听数据库的数据变更,然后自动一步地去更新或删除 reds 缓存。这种方案对业务代码无侵入,但架构会更复杂一些, 所以简单总结就是,首选先更新数据库,再删除缓存,并做好失败重试。对一致性有极致要求,再考虑监听 blog 的 方案。记住,没有完美的方案,只有根据业务场景的权衡。

兄弟们,听我一句劝,如果灭世官再问你如何保证 my circle 和 reddis 中的数据一致性?千万不要再说加分布式锁了,否则灭世官非常可能让你出门右转。 我们可以想一想,系统中引入 reddis 是 为了什么?不就是为了能抗住更大的病发,难道程序运行得更快吗?但是他锁是做什么的呢? 所本身是具备隔离性的,它的隔离性能让程序的病发没有那么高,能让程序运行的没有那么快,那不就失去了我们加 release 作为缓存的初衷了吗?面试官肯定不会对这个答案满意的,对不对?其实保证 mysco 和 release 一 致性一共有四种方案, 第一种发是先更新 reddit, 再更新 mac 口。第二种是先更新 mac 口,再更新 reddit。 第三种是先删除 reddit, 再更新 mac 口。第四种是先更新 mac 口,再删除 reddit。 其实这四种发在日常当中用哪一种都行,出现问题的概率极低,真的很低。只不过在面试过程中,面试官会有一个吹毛求疵的过程。 举例来讲,跟面试官说中,先更新 reddit, 再更新 mac 口,面试官可能会挑战,你说如果先更新 reddit, 成功了再更新 mac 口,失败了怎么办?然后你可能会说, 可以经重试,验证管肯定会问,需要重试几次,重试间隔是多少?你可能会说,重试三次,间隔是五十毫秒。验证管可能会接着问,为什么不是重试两次,不是重试四次?为什么间隔时间不是二十毫秒,不是一百毫秒?验证是怎么得出来的?为什么它是最优解? 这种问题很尴尬,很难继续往下回答下去,所以第一个,先更新 reddit, 再更新 my circle, 这个答案先 pass 掉了。第二个,先更新 my circle, 再更新 reddit, 也会遇上同样的问题,也把这个答案 pass 掉,包括第四种,先更新 my circle, 再删除 reddit, 也是一样的,也把这个答案 pass 掉。 接下来我们重点的来看一看先删除 database, 再更新 my sql 这个方案。为什么这个方案是最优解呢?我们来讲一下,你可以这么回答面试官,但凡在 my sql 和 database 之中各存储一份数据,它就一定会有所谓的数据一致性问题。但是当先删除数据库里数据那一刻起,两份数据就变成了一份,那就没有了所谓的数据一致性问题,对不对? 但面试官可能会问,如果先删除专利词成功了再更新 mysco, 失败了怎么办?失败了就失败了,直接给用户返回失败就可以了。因为这个时候只在 mysco 中有一份数据,那就没有了所谓的数据一致性问题了,对不对? 面试官可能会接着问,如果先删除专利词,失败了怎么办?很好处理,如果失败了,也直接给用户返回失败就好了,因为这时候系统没有做任何事情,数据也是一致的状态,对不对? 那这个方案也会有一点小问题,就是在所谓的高应发场景下,如果先参照 reis 成功了,还没有更新 mysq 的 时候,此时正好有一个县城读取了 mysq 的 老数据,并重新加载到了 reis 中,然后再更新 mysq 成功了,此时又会出现所谓的数据不一致的情况, 那么就需要通过延时双删的方式来解决,也就是我们说进行二次参照 reis 中的数据才可以。当然,此时鸡贼的面试官可能会问,如果二次参照 reis 失败了怎么办? 你还是可以很坦诚的告诉面官,失败了就失败了,因为在分布式系统中,没有任何一个解决方案能够摆正百分之百的。比如说系统中有几十万上百万的数据,恰好有一个数据在几毫秒钟内出现了并发症问题, 而且这个数据在几毫秒之前删除 ready 成功了,几毫秒后再删除 ready 又不成功了,这种概率真的是非常非常非常低了。如果出现了就认了,不要再把方案复杂化了。当然还有另外一个坑点就是如果二次删除 ready 的 时候,一定不要引入中间键,比如说引入开导同步 vlog, 或者引入消息队列来同步数据, 千万不要这么做,否则面试官接着会问,如果开导或者消息队列挂了怎么办?这一样是很麻烦的一个问题,一样不好回答,听明白我的意思了吗?

那么,既然瑞迪斯这么快买收购这么慢,为什么买收口没有被彻底的取代呢?今天聊一聊瑞迪斯科买收购的区别,因为今天在公司正好发生了一个实际的案例,可以说明这两种数据库的区别,当然,这个对于老手来说都是小儿科的知识。 嗯,但是我还是想讲一下,因为很多新手可能并不明白,而且呢,因为他们没有遇到过实际的案例和经验,所以只看书呢,可能体会没有那么深刻。 那我们先说他最直接的区别,当然是一个快一个慢嘛,买这个这种磁盘数据库,每一步操作都要直接落地到硬盘里面去 lo 操作,当然就是慢消耗性能, 所以他很有可能成为系统的瓶颈。而瑞迪斯这种内存数据库,数据加载到内存里面操作,所以当然是非常快。那么既然瑞迪斯这么快,埋收口这么慢,为什么埋收口没有被彻底的取代呢? 当然是因为在有些场合,有些功能 radio 是做不了的,没什么可能做,因为他是关系型数据库,而瑞迪是非关系型数据库。那么什么是关系型数据库?什么是非关系型数据库呢?呃,就今天下午,嗯,刚刚也就是一个 几个小时前吧。呃,产品的人过来给程序提供统计数据的需求啊,之前我们说过吗?我们有一个后台的监控网站,当然这个网站不只是监控技术上的数据,也会监控产品上的数据啊,比如说之前,呃,会监控实时在线多少人 啊,实时副本多少人啊,实时副本多少个,以及 dau 啊,四牛、三牛等等等等,每天新增多少等等。但是这些呢,其实用瑞典词和用白色的区别不大,为了图块,直接存在瑞典词里面就可以了。这里说的图块,一个是代码写的快,一个是 性能快,性能快的意思就是读取写入比较快。但是当产品运营的需求记忆变化时,我们就会发现,有的需求就只能用埋收款来做了。比如说他需要统计当天新增的用户里面,女用户是多少,男用户是多少,小孩多少,老人多少, 甚至还有一些更特别的需求,比如说年轻的女用户是多少。当然还有更变态的,比如说在某个时间段内,低于十八岁的女性用户,有多少人打了三把以上游戏,并且选择消费的某些英雄或者消费的多少多少钱以上,而且当年聊天超过了一百句啊。 为什么这种类型的需求只有买车的能做呢?就是因为买车的是关系型数据库,它里面的数据是以行业表的形式存储的,所以可以根据各种各样的花式的条件去组合去查询。而 radios 或者说非关系型数据库,他们所有的数据都可以理解为是 p v i 六的兼职队 啊,数据和数据之间没有关系,所以你不能通过各种条件组合查询啊。说完这个之后呢,我去网上搜了一下,发现我的说法也不并不完备啊,其实是有一点漏洞的,比如说有一些非关键型数据库也支持条件查询,但是他们都不够主流,有兴趣的小伙伴可以自己上网去搜搜看。最后大家记得点赞、关注、收藏,谢谢!

每天进步一点点,那么今天呢,给大家分享一个经常被问到的一个面试题啊, redis 与 mysoco 的区别到底在哪里?那么面试官呢,问这个问题啊,主要考量你在公司能不能在合理的场景下面用 redis。 那么我们都知道 redis 呢,当时啊,作者出来啊,就是去写这个东西啊,就是为了解决 卖搜口满足不了它的性能需求,所以开发了一个 redis, 那么它最大的区别在哪里呢?其实啊,就是 redis 要比卖搜索快那么快,主要体现在以下几个点。那么第一个卖搜口呢,它是属于一种关系型数据库, 它的数据关系啊,是基于表,而 redis 呢,只是一个 k v 结构,只不过支持不同的 value 类型,比如像 string 类型, list 等等。那么 k v 结构呢,那么它的查询速度相对来讲就会快很多,那么接近于 o e。 第二点,那么数据落 落地,它是 mysoke 的话,是存储在磁盘里面的,虽然啊,有些存储引擎它会有一些内存缓存,比如 in the d b, the buff four, 但是呢,最终也会通过 redo log 进行磁盘同步。而 redis 呢,则是基于内存去进行操作的,并且提供一些持久化的方案。 第三点,那么 reds 啊,不同的数据类型,它会有不同的数据结构去支持它快,那么这些数据结构呢,就是会去牺牲一些空间来换时间,比如 s d s, 比如 they set 类型里面的跳表结构,那么他们的思想其实跟卖搜口的 b 价数是很类似的,都是用空间换时间,只不过他们的场景不一样,而用到的数据结构不一样。第四点,那么 redis 呢,是基于内存去操作的,所以他单次执行指令的时间会非常快,瓶颈不再 cpu, 所以呢,它的命令执行它是单线程的,避免了线程切换带来的消耗。那么第五点,那么 redis 采用的是一个多路复用的网络模型, 所以上续五点,就是 redis 要比卖搜狗快,所以为了快呢,很多事情是一步的,比如说像持久化啊,如同同步啊,那么这个时候呢,就会牺牲数据的可靠性,会有很多的异常场景,导致数据丢失啊。那么 redis 呢,也就是我们 c a p 模型里面的 a p 模型, 这也是为什么 redis 它一直替代不了麦搜口的原因,因为它的安全性要比麦搜口低很多,所以我们在真实的项目中,一般会作为麦搜口数据的前置缓存来使用,对于敏感数据我们是不建议只放在 redis 里面的。 ok, 那么今天呢,是给大家简单的分享一下 mysoco 与 redis 的区别,希望大家在工作中去用到 redis 的时候有一定的帮助。