Redis核心技术
文章平均质量分 94
Redis核心技术
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
从微博的Redis实践中,我们可以学到哪些经验?
我们知道,微博内部的业务场景中广泛使用了 Redis,积累了大量的应用和优化经验。微博有位专家曾有过一个,介绍了 Redis 在微博的优化之路,其中有很多的优秀经验。俗话说“他山之石,可以攻玉”,学习掌握这些经验,可以帮助我们在自己的业务场景中更好地应用 Redis。今天这节,就结合微博技术专家的分享,以及我和他们内部专家的交流,聊聊微博对 Redis 的优化以及总结的经验。首先,我们来看下微博业务场景对 Redis 的需求。这些业务需求也就是微博优化和改进 Redis 的出发点。原创 2024-02-27 17:21:02 · 786 阅读 · 0 评论 -
Redis的使用规范小建议
今天,我们来聊一个轻松点儿的话题,来介绍一下 Redis 的使用规范,包括键值对使用、业务数据保存和命令使用规范。毕竟,高性能和节省内存,是我们的两个目标,只有规范地使用 Redis,才能真正实现这两个目标。如果说之前的内容教会了你怎么用,那么今天的内容,就是帮助你用好 Redis,尽量不出错。好了,话不多说,我们来看下键值对的使用规范。原创 2024-02-27 16:38:41 · 796 阅读 · 0 评论 -
Redis有哪些好用的运维工具?
我们在应用 Redis 时,经常会面临的运维工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,我就从这三个方面,给你介绍一些工具。我们先来学习下监控 Redis 实时运行状态的工具,这些工具都用到了 Redis 提供的一个监控命令:INFO。原创 2024-02-27 15:57:17 · 990 阅读 · 0 评论 -
Redis客户端如何与服务器端交换命令和数据?
在前面的课程中,我们主要学习了 Redis 服务器端的机制和关键技术,很少涉及到客户端的问题。但是,Redis 采用的是典型的 client-server(服务器端 - 客户端)架构,客户端会发送请求给服务器端,服务器端会返回响应给客户端。如果要对 Redis 客户端进行二次开发(比如增加新的命令),我们就需要了解请求和响应涉及的命令、数据在客户端和服务器之间传输时,是如何编码的。否则,我们在客户端新增的命令就无法被服务器端识别和处理。原创 2024-02-27 15:14:10 · 819 阅读 · 0 评论 -
如何学习Redis?
在最近的时间里,我的很多工作都是围绕 Redis 展开的。在这期间,遇到了很多 Redis 相关的问题,例如访问延迟变大、部署运维参数配置不合理,等等,也狠狠地恶补了 Redis 方面的知识,看过书,读过源码,出过 Bug,踩过坑,一路走来,逐渐梳理出了一套高效的学习路径,把它分为三大模块:1. 掌握数据结构和缓存的基本使用方法;2. 掌握支撑 Redis 实现高可靠、高性能的技术;3. 精通 Redis 底层实现原理。先和你聊聊“如何高效学习 Redis”,后面会再分享一些学习心得和总结。原创 2024-02-27 14:26:09 · 921 阅读 · 0 评论 -
经典的Redis学习资料有哪些?
咱们的“基础篇”已经结束了。在这个模块,我们学习了 Redis 的系统架构、数据结构、线程模型、持久化、主从复制和切片集群这些核心知识点,相信你已经初步构建了自己的一套基础知识框架。不过,如果想要持续提升自己的技术能力,还需要不断丰富自己的知识体系,那么,阅读就是一个很好的方式。所以,这节就推荐几本优秀的书籍,以及一些拓展知识面的其他资料,希望能够帮助你全面掌握 Redis。原创 2024-02-27 11:37:04 · 743 阅读 · 0 评论 -
41 | 第35~40讲课后思考题答案及常见问题答疑
集群是实际业务应用中很重要的一个需求,在课程的最后,还想再给你提一个小建议。集群部署和运维涉及的工作量非常大,所以,我们一定要重视集群方案的选择。集群的可扩展性是我们评估集群方案的一个重要维度,你一定要关注,集群中元数据是用 Slot 映射表,还是一致性哈希维护的。如果是 Slot 映射表,那么,是用中心化的第三方存储系统来保存,还是由各个实例来扩散保存,这也是需要考虑清楚的。Redis Cluster、Codis 和 Memcached 采用的方式各不相同。原创 2024-02-27 11:29:13 · 826 阅读 · 0 评论 -
40 | Redis的下一步:基于NVM内存的实践
这几年呢,新型非易失存储(Non-Volatile Memory,NVM)器件发展得非常快。NVM 器件具有容量大、性能快、能持久化保存数据的特性,这些刚好就是 Redis 追求的目标。同时,NVM 器件像 DRAM 一样,可以让软件以字节粒度进行寻址访问,所以,在实际应用中,NVM 可以作为内存来使用,我们称为 NVM 内存。你肯定会想到,Redis 作为内存键值数据库,如果能和 NVM 内存结合起来使用,就可以充分享受到这些特性。原创 2024-02-27 10:35:08 · 845 阅读 · 0 评论 -
39 | Redis 6.0的新特性:多线程、客户端缓存与安全
这个版本中有很多的新特性。所以,6.0 刚刚推出,就受到了业界的广泛关注。所以,在课程的最后,这节想来聊聊 Redis 6.0 中的几个关键新特性,分别是面向网络处理的多 IO 线程、客户端缓存、细粒度的权限控制,以及 RESP 3 协议的使用。其中,面向网络处理的多 IO 线程可以提高网络请求处理的速度,而客户端缓存可以让应用直接在客户端本地读取数据,这两个特性可以提升 Redis 的性能。除此之外,细粒度权限控制让 Redis 可以按照命令粒度控制不同用户的访问权限,加强了 Redis 的安全保护。原创 2024-02-26 20:54:45 · 1145 阅读 · 0 评论 -
这些问题,你都答对了吗?
原因是,Redis 的网络连接是由操作系统进行处理的,操作系统内核负责监听网络连接套接字上的连接请求或数据请求,而 Redis 采用了 IO 多路复用机制 epoll,不会阻塞在某一个特定的套接字上。Redis 的 AOF 日志会记录客户端发送给实例的每一次写操作命令,在 Redis 实例恢复时,可以通过重新运行 AOF 文件中的命令,实现恢复数据的目的。在这道题的业务场景中,负载以读为主,因此,写命令不会太多,AOF 日志文件的体量不会太大,即使实例故障了,也可以快速完成恢复。首先来说一下复制缓冲区。原创 2024-02-26 20:13:58 · 800 阅读 · 0 评论 -
38 | 通信开销:限制Redis Cluster规模的关键因素
Redis Cluster 能保存的数据量以及支撑的吞吐量,跟集群的实例规模密切相关。Redis 官方给出了 Redis Cluster 的规模上限,就是一个集群运行 1000 个实例。那么,你可能会问,为什么要限定集群规模呢?其实,这里的一个关键因素就是,,在集群超过一定规模时(比如 800 节点),集群吞吐量反而会下降。所以,集群的实际规模会受到限制。今天这节,我们就来聊聊,集群实例间的通信开销是如何影响 Redis Cluster 规模的,以及如何降低实例间的通信开销。原创 2024-02-26 19:28:45 · 849 阅读 · 0 评论 -
37 | 数据分布优化:如何应对数据倾斜?
在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存。比如,在使用 Redis Cluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模,同时,所有的 Slot 又会由运维管理员分配到不同的实例上。这样,数据就被保存到相应的实例上了。虽然这种方法实现起来比较简单,但是很容易导致一个问题:数据倾斜。数据倾斜有两类。:在某些情况下,实例上的数据分布不均衡,某个实例上的数据特别多。原创 2024-02-26 17:58:20 · 846 阅读 · 0 评论 -
36 | Redis支撑秒杀场景的关键技术和实践都有哪些?
秒杀是一个非常典型的活动场景,比如,在双 11、618 等电商促销活动中,都会有秒杀场景。秒杀场景的业务特点是,业务系统要处理瞬时的大量高并发请求,而 Redis 就经常被用来支撑秒杀活动。不过,秒杀场景包含了多个环节,可以分成秒杀前、秒杀中和秒杀后三个阶段,每个阶段的请求处理需求并不相同,Redis 并不能支撑秒杀场景的每一个环节。那么,Redis 具体是在秒杀场景的哪个环节起到支撑作用的呢?又是如何支持的呢?原创 2024-02-26 17:20:03 · 814 阅读 · 0 评论 -
35 | Codis VS Redis Cluster:我该选择哪一个集群方案?
Redis 的切片集群使用多个实例保存数据,能够很好地应对大数据量的场景。在第 8 讲中,我们学习了 Redis 官方提供的切片集群方案 Redis Cluster,这为你掌握切片集群打下了基础。今天,再来进阶一下,我们来学习下 Redis Cluster 方案正式发布前,业界已经广泛使用的 Codis。会具体讲解 Codis 的关键技术实现原理,同时将 Codis 和 Redis Cluster 进行对比,帮你选出最佳的集群方案。好了,话不多说,我们先来学习下 Codis 的整体架构和流程。原创 2024-02-26 15:24:36 · 759 阅读 · 0 评论 -
34 | 第23~33讲课后思考题答案及常见问题答疑
第一种情况是,对于已经设置了过期时间的 key,主库在 key 快要过期时,使用 expire 命令重置了过期时间,例如,一个 key 原本设置为 10s 后过期,在还剩 1s 就要过期时,主库又用 expire 命令将 key 的过期时间设置为 60s 后。主从切换完成后,数据会丢失吗?例如,主从库上都有 a:stock 的键,客户端 A 给主库发送一个 SET 命令,修改 a:stock 的值,客户端 B 给从库发送了一个 SET 命令,也修改 a:stock 的值,此时,相同键的值就不一样了。原创 2024-02-26 11:02:41 · 702 阅读 · 0 评论 -
33 | 脑裂:一次奇怪的数据丢失
在使用主从集群时,曾遇到过这样一个问题:我们的主从集群有 1 个主库、5 个从库和 3 个哨兵实例,在使用的过程中,我们发现客户端发送的一些数据丢失了,这直接影响到了业务层的数据可靠性。通过一系列的问题排查,我们才知道,这其实是主从集群中的脑裂问题导致的。所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。原创 2024-02-26 08:46:47 · 815 阅读 · 0 评论 -
32 | Redis主从同步与故障切换,有哪些坑?
Redis 的主从同步机制不仅可以让从库服务更多的读请求,分担主库的压力,而且还能在主库发生故障时,进行主从库切换,提供高可靠服务。不过,在实际使用主从机制的时候,我们很容易踩到一些坑。这节课,我就向你介绍 3 个坑,分别是主从数据不一致、读到过期数据,以及配置项设置得不合理从而导致服务挂掉。一旦踩到这些坑,业务应用不仅会读到错误数据,而且很可能会导致 Redis 无法正常使用,我们必须要全面地掌握这些坑的成因,提前准备一套规避方案。不过,即使不小心掉进了陷阱里,也不要担心,会给你介绍相应的解决方案。原创 2024-02-26 01:19:41 · 772 阅读 · 0 评论 -
31 | 事务机制:Redis能实现ACID属性吗?
事务是数据库的一个重要功能。所谓的事务,就是指对数据进行读写的一系列操作。事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),也就是 ACID 属性。这些属性既包括了对事务执行结果的要求,也有对数据库在事务执行前后的数据状态变化的要求。那么,Redis 可以完全保证 ACID 属性吗?原创 2024-02-25 23:57:57 · 890 阅读 · 0 评论 -
30 | 如何使用Redis实现分布式锁?
上节提到,在应对并发问题时,除了原子操作,Redis 客户端还可以通过加锁的方式,来控制并发写操作对共享数据的修改,从而保证数据的正确性。但是,Redis 属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,。否则的话,其它客户端是无法访问这把锁的,当然也就不能获取这把锁了。所以,在分布式系统中,当有多个客户端需要获取锁时,我们需要分布式锁。此时,锁是保存在一个共享存储系统中的,可以被多个客户端共享访问和获取。原创 2024-02-25 21:09:32 · 733 阅读 · 0 评论 -
29 | 无锁的原子操作:Redis如何应对并发访问?
我们在使用 Redis 时,不可避免地会遇到并发访问的问题,比如说如果多个用户同时下单,就会对缓存在 Redis 中的商品库存并发更新。一旦有了并发写操作,数据就会被修改,如果我们没有对并发写请求做好控制,就可能导致数据被改错,影响到业务的正常使用(例如库存数据错误,导致下单异常)。为了保证并发访问的正确性,Redis 提供了两种方法,分别是加锁和原子操作。加锁是一种常用的方法,在读取数据前,客户端需要先获得锁,否则就无法进行操作。原创 2024-02-25 20:32:55 · 911 阅读 · 0 评论 -
28 | Pika:如何基于SSD实现大容量Redis?
我们在应用 Redis 时,随着业务数据的增加(比如说电商业务中,随着用户规模和商品数量的增加),就需要 Redis 能保存更多的数据。你可能会想到使用 Redis 切片集群,把数据分散保存到多个实例上。但是这样做的话,会有一个问题,如果要保存的数据总量很大,但是每个实例保存的数据量较小的话,就会导致集群的实例规模增加,这会让集群的运维管理变得复杂,增加开销。原创 2024-02-25 19:53:13 · 891 阅读 · 0 评论 -
27 | 缓存被污染了,该怎么办?
我们应用 Redis 缓存时,如果能缓存会被反复访问的数据,那就能加速业务应用的访问。但是,如果发生了缓存污染,那么,缓存对业务应用的加速作用就减少了。那什么是缓存污染呢?在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。这种情况,就是缓存污染。当缓存污染不严重时,只有少量数据占据缓存空间,此时,对缓存系统的影响不大。但是,缓存污染一旦变得严重后,就会有大量不再访问的数据滞留在缓存中。原创 2024-02-25 19:07:25 · 844 阅读 · 0 评论 -
26 | 缓存异常(下):如何解决缓存雪崩、击穿、穿透难题?
上节,我们学习了缓存和数据库的数据不一致问题和应对方法。除了数据不一致问题,我们常常还会面临缓存异常的三个问题,分别是缓存雪崩、缓存击穿和缓存穿透。这三个问题一旦发生,会导致大量的请求积压到数据库层。如果请求的并发量很大,就会导致数据库宕机或是故障,这就是很严重的生产事故了。这节,就来聊聊这三个问题的表现、诱发原因以及解决方法。俗话说,知己知彼,百战不殆。了解了问题的成因,我们就能够在应用 Redis 缓存时,进行合理的缓存设置,以及相应的业务应用前端设置,提前做好准备。原创 2024-02-25 18:35:37 · 813 阅读 · 0 评论 -
25 | 缓存异常(上):如何解决缓存和数据库的数据不一致问题?
在实际应用 Redis 缓存时,我们经常会遇到一些异常问题,概括来说有 4 个方面:缓存中的数据和数据库中的不一致;缓存雪崩;缓存击穿和缓存穿透。只要我们使用 Redis 缓存,就必然会面对缓存和数据库间的一致性保证问题,这也算是 Redis 缓存应用中的“必答题”了。最重要的是,如果数据不一致,那么业务应用从缓存中读取的数据就不是最新数据,这会导致严重的错误。比如说,我们把电商商品的库存信息缓存在 Redis 中,如果库存信息不对,那么业务层下单操作就可能出错,这当然是不能接受的。原创 2024-02-25 17:56:16 · 1022 阅读 · 0 评论 -
24 | 替换策略:缓存满了怎么办?
Redis 缓存使用内存来保存数据,避免业务应用从后端数据库中读取数据,可以提升应用的响应速度。那么,如果我们把所有要访问的数据都放入缓存,是不是一个很好的设计选择呢?其实,这样做的性价比反而不高。举个例子吧。MySQL 中有 1TB 的数据,如果我们使用 Redis 把这 1TB 的数据都缓存起来,虽然应用都能在内存中访问数据了,但是,这样配置并不合理,因为性价比很低。一方面,1TB 内存的价格大约是 3.5 万元,而 1TB 磁盘的价格大约是 1000 元。原创 2024-02-25 17:17:14 · 798 阅读 · 0 评论 -
23 | 旁路缓存:Redis是如何工作的?
我们知道,Redis 提供了高性能的数据存取功能,所以广泛应用在缓存场景中,既能有效地提升业务应用的响应速度,还可以避免把高并发大压力的请求发送到数据库层。但是,如果 Redis 做缓存时出现了问题,比如说缓存失效,那么,大量请求就会直接积压到数据库层,必然会给数据库带来巨大的压力,很可能会导致数据库宕机或是故障,那么,业务应用就没有办法存取数据、响应用户请求了。这种生产事故,肯定不是我们希望看到的。原创 2024-02-25 07:33:30 · 808 阅读 · 0 评论 -
22 | 第11~21讲课后思考题答案及常见问题答疑
从第 11 讲到第 21 讲,我们重点介绍的知识点比较多,也比较细。其实,我们可以分成两大部分来掌握:一个是多种多样的数据结构,另一个是如何避免 Redis 性能变慢。原创 2024-02-25 07:32:48 · 865 阅读 · 0 评论 -
21 | 缓冲区:一个可能引发“惨案”的地方
今天,我们一起来学习下 Redis 中缓冲区的用法。缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。但因为缓冲区的内存空间有限,如果往里面写入数据的速度持续地大于从里面读取数据的速度,就会导致缓冲区需要越来越多的内存来暂存数据。当缓冲区占用的内存超出了设定的上限阈值时,就会出现缓冲区溢出。如果发生了溢出,就会丢数据了。那是不是不给缓冲区的大小设置上限,就可以了呢?原创 2024-02-24 23:38:56 · 875 阅读 · 0 评论 -
20 | 删除数据后,为什么内存占用率还是很高?
通常情况下,内存空间闲置,往往是因为操作系统发生了较为严重的内存碎片。那么,什么是内存碎片呢?为了方便理解,还是借助高铁的车厢座位来进行解释。假设一个车厢的座位总共有 60 个,现在已经卖了 57 张票,你和 2 个小伙伴要乘坐高铁出门旅行,刚好需要三张票。不过,你们想要坐在一起,这样可以在路上聊天。但是,在选座位时,你们却发现,已经买不到连续的座位了。于是,你们只好换了一趟车。这样一来,你们需要改变出行时间,而且这趟车就空置了三个座位。原创 2024-02-24 22:33:21 · 848 阅读 · 0 评论 -
19 | 波动的响应延迟:如何应对变慢的Redis?(下)
上节介绍了判断 Redis 变慢的两种方法,分别是响应延迟和基线性能。除此之外,还分享了从 Redis 的自身命令操作层面排查和解决问题的两种方案。但是,如果在排查时,你发现 Redis 没有执行大量的慢查询命令,也没有同时删除大量过期 keys,那么,我们是不是就束手无策了呢?当然不是!还有很多“锦囊妙计”,准备在这节分享给你呢!如果上节的方法不管用,那就说明,你要关注影响性能的其他机制了,也就是文件系统和操作系统。原创 2024-02-24 21:50:13 · 900 阅读 · 0 评论 -
18 | 波动的响应延迟:如何应对变慢的Redis?(上)
在 Redis 的实际部署应用中,有一个非常严重的问题,那就是 Redis 突然变慢了。一旦出现这个问题,不仅会直接影响用户的使用体验,还可能会影响到“旁人”,也就是和 Redis 在同一个业务系统中的其他系统,比如说数据库。举个小例子,在秒杀场景下,一旦 Redis 变慢了,大量的用户下单请求就会被拖慢,也就是说,用户提交了下单申请,却没有收到任何响应,这会给用户带来非常糟糕的使用体验,甚至可能会导致用户流失。原创 2024-02-24 19:02:05 · 901 阅读 · 0 评论 -
17 | 为什么CPU结构也会影响Redis的性能?
很多人都认为 Redis 和 CPU 的关系很简单,就是 Redis 的线程在 CPU 上运行,CPU 快,Redis 处理请求的速度也很快。这种认知其实是片面的。CPU 的多核架构以及多 CPU 架构,也会影响到 Redis 的性能。如果不了解 CPU 对 Redis 的影响,在对 Redis 的性能进行调优时,就可能会遗漏一些调优方法,不能把 Redis 的性能发挥到极限。今天,我们就来学习下目前主流服务器的 CPU 架构,以及基于 CPU 多核架构和多 CPU 架构优化 Redis 性能的方法。原创 2024-02-24 15:07:01 · 864 阅读 · 0 评论 -
16 | 异步机制:如何避免单线程模型的阻塞?
Redis 之所以被广泛应用,很重要的一个原因就是它支持高性能访问。也正因为这样,我们必须要重视所有可能影响 Redis 性能的因素(例如命令操作、系统配置、关键机制、硬件配置等),不仅要知道具体的机制,尽可能避免性能异常的情况出现,还要提前准备好应对异常的方案。所以,从这节开始,会用 6 节的介绍影响 Redis 性能的 5 大方面的潜在因素,分别是:Redis 内部的阻塞式操作;CPU 核和 NUMA 架构的影响;Redis 关键系统配置;Redis 内存碎片;Redis 缓冲区。原创 2024-02-23 20:32:29 · 740 阅读 · 0 评论 -
15 | 消息队列的考验:Redis有哪些解决方案?
现在的互联网应用基本上都是采用分布式系统架构进行设计的,而很多分布式系统必备的一个基础软件就是消息队列。消息队列要能支持组件通信消息的快速读写,而 Redis 本身支持数据的高速访问,正好可以满足消息队列的读写性能需求。不过,除了性能,消息队列还有其他的要求,所以,很多人都很关心一个问题:“Redis 适合做消息队列吗?其实,这个问题的背后,隐含着两方面的核心问题:消息队列的消息存取需求是什么?Redis 如何实现消息队列的需求?这节,我们就来聊一聊消息队列的特征和 Redis 提供的消息队列方案。原创 2024-02-23 18:02:00 · 877 阅读 · 0 评论 -
14 | 如何在Redis中保存时间序列数据?
我们现在做互联网产品的时候,都有这么一个需求:记录用户在网站或者 App 上的点击行为数据,来分析用户行为。之前做过的一个物联网项目的数据存取需求,和这个很相似。这些与发生时间相关的一组数据,就是时间序列数据。(例如,一个设备 ID 对应一条记录),所以,并不需要专门用关系型数据库(例如 MySQL)来保存。而 Redis 的键值数据模型,正好可以满足这里的数据存取需求。Redis 基于自身数据结构以及扩展模块,提供了两种解决方案。原创 2024-02-23 16:59:30 · 964 阅读 · 0 评论 -
13 | GEO是什么?还可以定义新的数据类型吗?
为了实现自定义数据类型,首先,我们需要了解 Redis 的基本对象结构 RedisObject,因为 Redis 键值对中的每一个值都是用 RedisObject 保存的。在第 11 讲中说过,RedisObject 包括元数据和指针。其中,元数据的一个功能就是用来区分不同的数据类型,指针用来指向具体的数据类型的值。所以,要想开发新数据类型,我们就先来了解下 RedisObject 的元数据和指针。原创 2024-02-23 16:01:29 · 733 阅读 · 0 评论 -
12 | 有一亿个keys要统计,应该用哪种集合?
在 Web 和移动应用的业务场景中,我们经常需要保存这样一种信息:一个 key 对应了一个数据集合。举几个例子。手机 App 中的每天的用户登录信息:一天对应一系列用户 ID 或移动设备 ID;电商网站上商品的用户评论列表:一个商品对应了一系列的评论;用户在手机 App 上的签到打卡信息:一天对应一系列用户的签到记录;应用网站上的网页访问信息:一个网页对应一系列的访问点击。我们知道,Redis 集合类型的特点就是一个键对应一系列的数据,所以非常适合用来存取这些数据。原创 2024-02-23 15:12:40 · 862 阅读 · 0 评论 -
11 | “万金油”的String,为什么不好用了?
从今天开始,我们就要进入“实践篇”了。接下来,我们会用 5 节课的时间学习“数据结构”。我会介绍节省内存开销以及保存和统计海量数据的数据类型及其底层数据结构,还会围绕典型的应用场景(例如地址位置查询、时间序列数据库读写和消息队列存取),跟你分享使用 Redis 的数据类型和 module 扩展功能来满足需求的具体方案。今天,我们先了解下 String 类型的内存空间消耗问题,以及选择节省内存开销的数据类型的解决方案。先跟你分享一个曾经遇到的需求。原创 2024-02-23 14:29:40 · 819 阅读 · 0 评论 -
10 | 第1~9讲课后思考题答案及常见问题答疑
问题:和跟 Redis 相比,SimpleKV 还缺少什么?先分享一下两位同学的答案,他们从数据结构到功能扩展,从内存效率到事务性,从高可用集群再到高可扩展集群,对 SimpleKV 和 Redis 进行了详细的对比。而且,他们还从运维使用的角度进行了分析。1. 数据结构:缺乏广泛的数据结构支持,比如支持范围查询的 SkipList 和 Stream 等数据结构。2. 高可用:缺乏哨兵或者 master-slave 模式的高可用设计;3. 横向扩展:缺乏集群和分片功能;原创 2024-02-23 14:29:09 · 834 阅读 · 0 评论 -
09 | 切片集群:数据增多了,是该加内存还是加实例?
今天我们来学习切片集群。曾遇到过这么一个需求:要用 Redis 保存 5000 万个键值对,每个键值对大约是 512B,为了能快速部署并对外提供服务,我们采用云主机来运行 Redis 实例,那么,该如何选择云主机的内存容量呢?粗略地计算了一下,这些键值对所占的内存空间大约是 25GB(5000 万 *512B)。所以,当时,我想到的第一个方案就是:选择一台 32GB 内存的云主机来部署 Redis。因为 32GB 的内存能保存所有数据,而且还留有 7GB,可以保证系统的正常运行。原创 2024-02-23 11:54:48 · 868 阅读 · 0 评论