摘要: 咱们的课程已经更新9讲了,这段时间,我收到了很多留言。很多同学都认真地回答了课后思考题,有些回答甚至可以说是标准答案。另外,还有很多同学针对Redis的基本原理和关键机制,提出了非常好的问题,值得好好讨论一下。 今天,我就和你聊一聊课后题答案,并且挑选一些典型问题,集中进行一次讲解,希望可以解决你的 阅读全文
posted @ 2021-08-11 22:28 brady-wang 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 在Web和移动应用的业务场景中,我们经常需要保存这样一种信息:一个key对应了一个数据集合。我举几个例子。 手机App中的每天的用户登录信息:一天对应一系列用户ID或移动设备ID; 电商网站上商品的用户评论列表:一个商品对应了一系列的评论; 用户在手机App上的签到打卡信息:一天对应一系列用户的签到 阅读全文
posted @ 2021-08-11 22:27 brady-wang 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 在第2讲中,我们学习了Redis的5大基本数据类型:String、List、Hash、Set和Sorted Set,它们可以满足大多数的数据存储需求,但是在面对海量数据统计时,它们的内存开销很大,而且对于一些特殊的场景,它们是无法支持的。所以,Redis还提供了3种扩展数据类型,分别是Bitmap、 阅读全文
posted @ 2021-08-11 22:27 brady-wang 阅读(207) 评论(0) 推荐(0) 编辑
摘要: 从今天开始,我们就要进入“实践篇”了。接下来,我们会用5节课的时间学习“数据结构”。我会介绍节省内存开销以及保存和统计海量数据的数据类型及其底层数据结构,还会围绕典型的应用场景(例如地址位置查询、时间序列数据库读写和消息队列存取),跟你分享使用Redis的数据类型和module扩展功能来满足需求的具 阅读全文
posted @ 2021-08-11 22:25 brady-wang 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 我曾遇到过这么一个需求:要用Redis保存5000万个键值对,每个键值对大约是512B,为了能快速部署并对外提供服务,我们采用云主机来运行Redis实例,那么,该如何选择云主机的内存容量呢? 我粗略地计算了一下,这些键值对所占的内存空间大约是25GB(5000万*512B)。所以,当时,我想到的第一 阅读全文
posted @ 2021-08-11 18:41 brady-wang 阅读(103) 评论(0) 推荐(0) 编辑
摘要: 上节课,我们学习了哨兵机制,它可以实现主从库的自动切换。通过部署多个实例,就形成了一个哨兵集群。哨兵集群中的多个实例共同判断,可以降低对主库下线的误判率。 但是,我们还是要考虑一个问题:如果有哨兵实例在运行时发生了故障,主从库还能正常切换吗? 实际上,一旦多个实例组成了哨兵集群,即使有哨兵实例出现故 阅读全文
posted @ 2021-08-11 18:31 brady-wang 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 上节课,我们学习了主从库集群模式。在这个模式下,如果从库发生故障了,客户端可以继续向主库或其他从库发送请求,进行相关的操作,但是如果主库发生故障了,那就直接会影响到从库的同步,因为从库没有相应的主库可以进行数据复制操作了。 而且,如果客户端发送的都是读操作请求,那还可以由从库继续提供服务,这在纯读的 阅读全文
posted @ 2021-08-11 18:27 brady-wang 阅读(399) 评论(0) 推荐(0) 编辑
摘要: 前两节课,我们学习了AOF和RDB,如果Redis发生了宕机,它们可以分别通过回放日志和重新读入RDB文件的方式恢复数据,从而保证尽量少丢失数据,提升可靠性。 不过,即使用了这两种方法,也依然存在服务不可用的问题。比如说,我们在实际使用时只运行了一个Redis实例,那么,如果这个实例宕机了,它在恢复 阅读全文
posted @ 2021-08-11 18:06 brady-wang 阅读(279) 评论(0) 推荐(0) 编辑
摘要: 上节课,我们学习了Redis避免数据丢失的AOF方法。这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大。一般而言,只要你采用的不是always的持久化策略,就不会对性能造成太大影响。 但是,也正因为记录的是操作命令,而不是实际的数据,所以,用AOF方法进行故障恢复的时候,需要逐一 阅读全文
posted @ 2021-08-11 17:34 brady-wang 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 如果有人问你:“你会把Redis用在什么业务场景下?”我想你大概率会说:“我会把它当作缓存使用,因为它把后端数据库中的数据存储在内存中,然后直接从内存中读取数据,响应速度会非常快。”没错,这确实是Redis的一个普遍使用场景,但是,这里也有一个绝对不能忽略的问题:一旦服务器宕机,内存中的数据将全部丢 阅读全文
posted @ 2021-08-11 16:11 brady-wang 阅读(362) 评论(0) 推荐(0) 编辑
摘要: 今天,我们来探讨一个很多人都很关心的问题:“为什么单线程的Redis能那么快?” 首先,我要和你厘清一个事实,我们通常说,Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,这也是Redis对外提供键值存储服务的主要流程。但Redis的其他功能,比如持久化、异步删除、集 阅读全文
posted @ 2021-08-11 15:53 brady-wang 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 一提到Redis,我们的脑子里马上就会出现一个词:“快。”但是你有没有想过,Redis的快,到底是快在哪里呢?实际上,这里有一个重要的表现:它接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。 数据库这么多,为啥Redis能有这么突出的表现呢?一方面,这是因为它是内存数据库,所有操 阅读全文
posted @ 2021-08-11 15:20 brady-wang 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 我们知道,Redis是典型的键值数据库,所以今天,我准备手把手地带你构建一个简单的键值数据库。为啥要这么做呢? 还记得我在开篇词说过吗?Redis本身比较复杂,如果我们一上来就直接研究一个个具体的技术点,比如“单线程”“缓存”等,虽然可以直接学习到具体的内容,甚至立马就能解决一些小问题,但是这样学, 阅读全文
posted @ 2021-08-11 15:14 brady-wang 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中,我和你介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题。 我们在上一篇文章中提到的一主多从的结构,其实就是读写分离的基本结构了。这里,我再把这张图贴过来,方便你理解。 图1 读写分离基本结构 读写分离的主要目 阅读全文
posted @ 2021-08-11 11:58 brady-wang 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 在前面的第24、25和26篇文章中,我和你介绍了MySQL主备复制的基础结构,但这些都是一主一备的结构。 大多数的互联网应用场景都是读多写少,因此你负责的业务,在发展过程中很可能先会遇到读性能的问题。而在数据库层解决读性能问题,就要涉及到接下来两篇文章要讨论的架构:一主多从。 今天这篇文章,我们就先 阅读全文
posted @ 2021-08-11 11:56 brady-wang 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因。你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。 但是,如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主 阅读全文
posted @ 2021-08-11 11:55 brady-wang 阅读(100) 评论(0) 推荐(0) 编辑
摘要: MySQL里有很多自增的id,每个自增id都是定义了初始值,然后不停地往上加步长。虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限。比如,无符号整型(unsigned int)是4个字节,上限就是232-1。 既然自增id有上限,就有可能被用完。但是,自增id用完 阅读全文
posted @ 2021-08-11 11:53 brady-wang 阅读(219) 评论(0) 推荐(0) 编辑
摘要: 不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环境的MySQL压力太大,没法正常响应,需要短期内、临时性地提升一些性能。 我以前做业务护航的时候,就偶尔会碰上这种场景。用户的开发负责人说,不管你用什么方案,让业务先跑起来再说。 但,如果是无损方案的话,肯定不需要等到这个时候才上场。今 阅读全文
posted @ 2021-08-11 10:59 brady-wang 阅读(47) 评论(0) 推荐(0) 编辑