- 博客(46)
- 收藏
- 关注
原创 06 全局锁和表锁:给表加字段怎么有这么多的障碍?
数据库锁的设计的初衷是为了解决并发问题,根据加锁的范围,Mysql 中的锁可以分为全局锁,表级锁和行锁三种。6.1、全局锁全局锁就是对整个数据库实例进行加锁,Mysql 提供了一个加全局读锁的命令:Flush tables with read lock (FTWRL 用读锁刷新表),当你需要让整个库处于只读状态时,可以使用这个命令,之后会导致其他线程的以下语句被阻塞:数据更语句(数据的增删改),数据定义语句(包括建表,修改表结构等)和更新类事务的提交语句。全局锁的典型的使用场景是做全库逻辑备份,也就
2022-04-12 14:29:57 248
原创 05 深入浅出索引(下)
假设有个表其中主键 ID,表中含有字段 k,k 上添加索引。表中R1~R5的(ID,k)值分别为(100,1)、(200,2)、(300,3)、(500,5)和(600,6),两棵树的示例示意图如下,接下来要使用索引 k 进行查询,其 SQL 语句为:select * from T where k between 3 and 5,要经历几次 B+树 的搜索呢?扫描了多少行呢?5.1、查询流程1.在 k 索引的 B+树 上进行搜索获取到 k=3 所对应的 ID=300 的值。2.在 ID 索引的 B
2022-04-12 14:24:57 594
原创 04 深入浅出索引(上)
4.1、使用索引的目的使用索引是为了提高查询的效率,对于数据库表而言,使用索引查找类似于使用书的目录查找文章类似。4.2、索引常见的模型类型哈希表键-值(key-value)存储数据的结构,使用不同的 key 经过哈希算法算出在哈希表中某个桶的位置,之后由于哈希冲突的原因,所查找的位置上可能有不同 key 算出的相同的哈希值,因此使用拉链法将这些发生冲突的 Entry 对象通过单链表的形式相连接,因此如果在查询的时候遇到需要在单链表中在查询的情况,需要一个个的遍历链表上的结点比较 key 值
2022-04-12 14:17:51 763
原创 03 事物隔离:为什么你改了我还是看不见?
3.1、隔离性与隔离级别事务具备的特性:原子性,一致性,隔离性,持久性。当 Mysql 数据库中同时有多个事务在执行就有可能会出现脏读,不可重复读,幻读的问题,为了解决这些问题,就有了隔离级别的概念,但是需要注意的是,使用的隔离级别越高,其事务的执行效率就会越低,因此需要找到一个平衡点。(1)隔离级别的种类读未提交(read uncommitted)一个事务还未提交就被别的事务看到了例如:事务 A 启动后在对数据 A=1 执行加一操作后还未提交事务,此时事务 B 启动读取数据 A 返回的
2022-04-12 14:14:01 176
原创 02 日志系统:一条 SQL 更新语句是如何执行的?
问题:在 Mysql 中可以将数据库恢复到半个月以内的任意秒的状态,是如何实现的?2.1、SQL 更新语句的执行过程与执行一条 SQL 语句的流程类似:使用连接器将客户端与服务器之间建立起连接,提及过由于当某个表进行更新,那么其该表对应在查询缓存中的记录会被清空,建立连接后进入分析器进行词法语法分析判断得出该 SQL 语句是一条更新语句,操作的表是表 T,还有其筛选的字段及其操作的字段进行分析。之后进入优化器,优化器选择合适的索引,最后进入执行器,执行器调用引擎提供的接口找到表 T 中要进行更新的记录
2022-04-12 14:08:58 578
原创 01 基础架构:一条 SQl 查询语句是如何执行的?
1.1、Mysql 基本逻辑架构示意图1.1.1 Mysql 分层大体来说,Mysql 可以分为两层:Server 层,存储引擎层。Server 层组成成分:连接器,查询缓存,分析器,优化器,执行器等功能:蕴含了 Mysql 大多数的核心服务功能,以及所有的内置函数(如日期,时间,数学和加密函数等),所有的跨存储引擎的功能都在这一层实现,比如存储过程,触发器,视图等。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB,MyISAM,Memory 等多个存储引擎。现在最
2022-04-12 14:04:01 118
原创 35-39 课后解答总结
1、35 讲:假设 Codis 集群中保存的 80% 的键值对都是 Hash 类型,每个 Hash 集合的元素数量在 10 万~20 万个,每个集合元素的大小是 2KB。你觉得,迁移这样的 Hash 集合数据,会对 Codis 的性能造成影响吗?Codis 支持异步、分批迁移数据,所以,Codis 可以把集合中的元素分多个批次进行迁移,每批次迁移的数据量不大,所以,不会给源实例造成太大影响。2、36 讲:假设一个商品的库存量是 800,我们使用一个包含了 4 个实例的切片集群来服务秒杀请求,我们让每
2022-04-12 12:33:26 1576
原创 39 Redis 6.0的新特性:多线程、客户端缓存与安全
Redis 6.0 版本中添加了很多的新的特性,其中有几个关键特性:面向网络处理的多 IO 线程、客户端缓存、细粒度的权限控制,以及 RESP 3 协议的使用。其中,面向网络处理的多 IO 线程可以提高网络请求处理的速度,而客户端缓存可以让应用直接在客户端本地读取数据,这两个特性可以提升 Redis 的性能。除此之外,细粒度权限控制让 Redis 可以按照命令粒度控制不同用户的访问权限,加强了 Redis 的安全保护。RESP 3 协议则增强客户端的功能,可以让应用更加方便地使用 Redis 的不同数据类型
2022-04-12 11:09:23 2210
原创 38 通信开销:限制Redis Cluster规模的关键因素
Redis Cluster 能保存的数据量以及支撑的吞吐量,跟集群的实例规模密切相关。Redis 官方给出了 Redis Cluster 的规模上限,就是一个集群运行 1000 个实例。之所以要限定集群中实例的数量,其中关键的因素是实例间的通信开销会随着实例规模增加而增大,在集群超过一定规模时(比如 800 节点),集群吞吐量反而会下降。所以,集群的实际规模会受到限制。一、实例通信方法和对集群规模的影响Redis Cluster 在运行时,每个实例上都会保存 Slot 和实例的对应关系(也就是 Slot
2022-04-12 10:10:16 186
原创 37 数据分布优化:如何应对数据倾斜?
一、什么是数据倾斜?在切片集群中,数据会按照一定的分布规则分散到不同的实例上保存。比如,在使用 Redis Cluster 或 Codis 时,数据都会先按照 CRC 算法的计算值对 Slot(逻辑槽)取模,同时,所有的 Slot 又会由运维管理员分配到不同的实例上。这样,数据就被保存到相应的实例上了。虽然这种方法实现起来比较简单,但是很容易导致一个问题:数据倾斜。数据量倾斜:在某些情况下,实例上的数据分布不均衡,某个实例上的数据特别多。数据访问倾斜:虽然每个集群实例上的数据量相差不大,但是某个实例
2022-04-12 09:24:25 209
原创 36 Redis支撑秒杀场景的关键技术和实践都有哪些?
一、秒杀场景的负载特征对支撑系统的要求第一个特征是瞬时并发访问量非常高第一个特征是瞬时并发访问量非常高。一般数据库每秒只能支撑千级别的并发请求,而 Redis 的并发处理能力(每秒处理请求数)能达到万级别,甚至更高。所以,当有大量并发请求涌入秒杀系统时,我们就需要使用 Redis 先拦截大部分请求,避免大量请求直接发送给数据库,把数据库压垮。第二个特征是读多写少,而且读操作是简单的查询操作在秒杀场景下,用户需要先查验商品是否还有库存(也就是根据商品 ID 查询该商品的库存还有多少),只有库
2022-04-11 23:57:11 187
原创 35 Codis VS Redis Cluster:我该选择哪一个集群方案?
Redis 切片集群中含有大量的实例对象,可以用于保存大量的数据,其中 Redis 官方在提出了 Redis Cluster 集群机制之前,被广泛的应用的是 Codis 集群机制。一、Codis 的整体架构和基本流程Codis 集群中包含了 4 类关键组件codis server:这是进行了二次开发的 Redis 实例,其中增加了额外的数据结构,支持数据迁移操作,主要负责处理具体的数据读写请求。codis proxy:接收客户端请求,并把请求转发给 codis server。Zookeeper
2022-04-11 23:19:42 347
原创 23-33 课后解答总结
1、23 讲:Redis 的只读缓存和使用直写策略的读写缓存,都会把数据同步写到后端数据库中,你觉得它们有什么区别吗?主要的区别在于,当有缓存数据被修改时,在只读缓存中,业务应用会直接修改数据库,并把缓存中的数据标记为无效;而在读写缓存中,业务应用需要同时修改缓存和数据库。2、24 讲:Redis 缓存在处理脏数据时,不仅会修改数据,还会把它写回数据库。我们在前面学过 Redis 的只读缓存模式和两种读写缓存模式(带同步直写的读写模式,带异步写回的读写模式)),请你思考下,Redis 缓存对应哪一种或
2022-04-11 15:32:41 140
原创 33 脑裂:一次奇怪数据的丢失
所谓的脑裂,就是指在主从集群中,同时有两个主节点,它们都能接收写请求。而脑裂最直接的影响,就是客户端不知道应该往哪个主节点写入数据,结果就是不同的客户端会往不同的主节点上写入数据。而且,严重的话,脑裂会进一步导致数据丢失。一、为什么会发生脑裂?1、第一步:确认是不是数据同步出现了问题在主从集群中发生数据丢失,最常见的原因就是主库的数据还没有同步到从库,结果主库发生了故障,等从库升级为主库后,未同步的数据就丢失了。我们使用 INFO replacition 命令查看在原主库上的 repl_backlo
2022-04-11 14:47:47 176
原创 32 Redis 的主从同步域故障切换,有哪些坑?
Redis 的主从同步机制不仅可以让从库服务更多的读请求,分担主库的读压力,而且还能在主库发生故障时,进行主从库切换,提供高可靠服务。但是实际使用主从机制的时候也很容易踩到一些坑。一、主从数据不一致主从数据不一致,就是指客户端从从库中读取到的值和主库中的最新值并不一致。导致主从数据不一致是由于主从库间的命令复制是异步进行的。具体来说,在主从库命令传播阶段,主库收到新的写命令后,会发送给从库。但是,主库并不会等到从库实际执行完命令后,再把结果返回给客户端,而是主库自己在本地执行完命令后,就会向客户端返
2022-04-11 13:33:57 321
原创 31 事务机制:Redis 能实现 ACID 属性吗?
一、事务的基本属性事务是数据库的一个重要功能。所谓的事务,就是指对数据进行读写的一系列操作。事务在执行时,会提供专门的属性保证,包括原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),也就是 ACID 属性。这些属性既包括了对事务执行结果的要求,也有对数据库在事务执行前后的数据状态变化的要求。二、事务 ACID 属性的要求原子性:一个事务中的多个操作必须都完成,或者都不完成一致性:指数据库中的数据在事务执行前后是一致的隔离
2022-04-11 11:31:26 215
原创 30 如何使用Redis实现分布式锁?
一、Redis 面对并发问题中,如何实现多个 Redis 客户端通过加锁的方式实现操作执行的互斥性?应对并发问题时,除了原子操作,Redis 客户端还可以通过加锁的方式,来控制并发写操作对共享数据的修改,从而保证数据的正确性。但是,Redis 属于分布式系统,当有多个客户端需要争抢锁时,我们必须要保证,这把锁不能是某个客户端本地的锁。否则的话,其它客户端是无法访问这把锁的,当然也就不能获取这把锁了。所以,在分布式系统中,当有多个客户端需要获取锁时,我们需要分布式锁。此时,锁是保存在一个共享存储系统中的,
2022-04-11 10:47:28 340
原创 29 无锁的原子操作:Redis 如何应对并发访问?
一、Redis 如何面对并发写操作带来的数据安全问题?Redis 在面对并发的执行同一个数据的写操作的时候为了保证数据的正确性,Redis 采用了原子操作和加锁两种方式来实现安全的并发写操作。其中加锁方式需要涉及到加锁和解锁及其锁的维护这些额外的开销,同时加锁会降低系统并发访问的性能,加锁也能实现临界区代码的互斥执行,只是如果有多个客户端加锁时,就需要分布式锁的支持了,分布式锁的实现比较复杂,同时还需要额外的存储系统来实现加锁和解锁操作的执行。原子操作是另一种提供并发访问控制的方法。原子操作是指执行
2022-04-11 10:28:00 259
原创 28 Pika:如何基于 SSD 实现大容量的 Redis?
一、为什么使用基于 SSD 实现大容量的 Redis?随着业务数据的增加,使得 Redis 需要保存的数据量增加,为了减少单个 Redis 存储的数据量,可以选择构建切片集群的方式将所有的数据负载到多个 Redis 实例中,但是随着切片集群中的 Redis 实例的个数增加,其维护集群的成本开销增加,集群的运营管理也变得复杂起来。然而如果横向方向对单个 Redis 的内存,CPU等硬件配置进行升级的话,这样单个 Redis 实例存储的数据量增加了,就可以减少切片集群中 Redis 实例的个数,但是对于大内
2022-04-11 10:27:55 485
原创 27 缓存被污染了,该怎么办?
缓存污染是指一些数据当被访问之后就不会在被访问了,或者会长时间内都不会在对其进行访问了,但是这些数据仍然长时间的滞留在 Redis 缓存中,当缓存污染不严重时,造成的影响不会太明显,但是如果缓存污染比较大,就会造成这些数据大量的占用 redis 缓存的内存,使得之后接收到访问其他数据的请求后要将新的数据从数据库中读取写入到缓存中,就必须要对缓存中的数据进行淘汰,然而这些频繁淘汰数据的操作会需要消耗的大量的时间开销,降低了缓存的性能,使得应用层的请求需要大量的访问后端数据库,请求的响应时间增长了。一、如何解
2022-04-11 10:27:49 305
原创 26 缓存异常(下):如何解决缓存雪崩,击穿,穿透问题?
当 Redis 缓存发生了雪崩,击穿或者穿透等问题,就会造成大量的请求积压到后端数据库层,使得数据库面对大量高并发的请求发生宕机故障的问题,使得应用层不可用的问题。一、缓存雪崩造成雪崩的情况就是由于 redis 缓存不能处理的请求大量的发送到数据库端,使得数据库端需要承受大量高并发的请求,数据库的压力剧增。(1)造成缓存雪崩的两种情况缓存中大量的 key 在相同的时间过期由于缓存中大量的 key 的过期的时间设置到相同的实际,使得缓存中需要访问大量的数据都失效了,最终导致缓存的命中率极具降低,
2022-04-10 16:38:23 146
原创 25 缓存异常(上):如何解决缓存和数据库中数据不一致的情问题?
一、缓和和数据库中的数据不一致是如何发生的?(1)什么情况下是缓存和数据库数据一致的情况?缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;缓存中本身没有数据,那么,数据库中的值必须是最新值。(2)不同类型的 Redis 缓冲区读写数据的方式不一样读写缓冲区,对于读写缓冲区,可以支持读操作也可以支持写操作,当再 redis 缓存中执行写操作时,为了最终缓存中的数据与后端数据库的数据的一致性,有两种写回策略:同步直写策略和异步写回策略。同步直写策略:当缓存中执行写命令的时候,同时还要
2022-04-10 16:02:53 503
原创 24 替换策略:缓存满了怎么办?
一、确认 Redis 的最大内存容量根据“二八原则”,20% 的数据提供了 80% 的访问量,这也被称之为“长尾效应”,但是这个是根据大量的数据统计出来的而一个结果,在实际的应用中并不能确定,因此要根据实际的数据访问特征和成本开销来确定实际设置的 Redis 缓存的数据实际容量是总数据量的百分之几,一般建议设置为 15%~30% 不等,设置大量的缓存容量虽然可以提高缓存命中率,但是其内存开销的成本过大,而小的缓存内存也不一定就不能提高访问数据的效率,当然不可能将大量的数据全部存储到缓存中,因此就肯定会有缓
2022-04-10 15:19:13 149
原创 23 旁路缓存:Redis 是如何工作的?
Redis 常常用于作为应用程序域数据库之间的缓存的作用,若当 Redis 作为缓存失效了,就会造成大量的请求直接积压到了数据库层,数据库层就有可能巨大的压力造成数据库宕机或者故障使之不可用,此时应用程序就无法存储数据并响应客户端的请求了。一、缓存的特征对于层次化的系统中,缓存相对于后端数据库而言是一个支持高速访问数据的数据存储系统,缓存中存储应用程序中频繁访问的数据,因此为了提高应用程序请求的响应时间,那么缓存就需要支持高速的数据访问能力。由于硬件生产及其成本的限制,因此缓存中的存储空间是有限,不
2022-04-10 14:51:18 314
原创 9-21 课后解答总结
1、11 讲:用于存储图片 ID 及其图片存储对象 ID 这样的键值对数据除了使用 String 类型还有 Hash 类型以外,还可以使用什么数据类型进行存储?使用 String 类型进行存储的时候需要大量额外的空间用于存储元数据,因此会消耗大量的内存,并不是最优选择,因此选择将图片 ID 的前 7 位作为 Hash 数据类型的 key,其中 Hash 集合类型中的键值对就使用图片 ID 的后三位作为 key,用图片存储对象 ID 作为 value。就这样使用二级编码的方式用 Redis 中的集合数据类
2022-04-10 12:02:02 132
原创 21 缓冲区,一个可能引发“惨案”的地方
Redis 缓冲区的功能就是用于缓存数据和命令,避免因为数据和命令的处理速度慢于发送数据的速度导致其数据命令丢失和性能问题,但是由于 Redis 中的缓存区的内存空间有限,如果向缓存区中写入数据的速度持续地大于命令数据处理的速度,就会使得缓存区的内存空间占满,最终由于耗尽了缓存区的所有内存使得发生了数据的溢出,丢失了数据。然而这种情况并不只能单单地通过设置参数来控制限制缓存区的大小上限来解决,因此一旦 Redis 耗尽了 Redis 实例所运行所在机器的所有可用内存,就会直接导致 Redis 实例崩溃。.
2022-04-10 11:09:02 105
原创 20 删除数据后,为什么内存占用率还是很高?
当删除掉 Redis 数据之后,其中释放掉的内存会交给内存分配器管理,并不会直接返还给操作系统,因此 Redis 就可能会存在删除大量数据之后,实际占用的数据量很小,但是操作系统显示 Redis 实例的内存占用率还是会很高的情况。其中有个风险就是 Redis 释放的数据内存分布本身就是不确定的,使其释放的内存空间是零散的,就有可能导致大量的零散的内存空间不能被不利于再次进行内存分配使用,使得即使 Redis 又足够的内存空间,但是却不能被利用起来,Redis 无法将其用于保存数据,导致减少了 Redis 实
2022-04-10 10:11:42 879
原创 19 波动的响应延迟:如何应对变慢的 Redis?(下)
当我们发现 Redis 并没有再执行一些类似于集合的全量遍历,执行集合的排序,交集,并集操作,KEYS 操作等这些慢操作,也没有同时删除过大量的过期的 keys 操作时,Redis 仍然还是变慢了,那么此时就需要考虑影响 Redis 性能的另外两个因素:文件系统及其操作系统。Redis 实例需要进行数据的持久化,就需要将数据保存在磁盘上,所以文件系统机制直接影响到了 Redis 的持久化方面的性能,而正在进行数据持久化的 Redis 同样也可以处理其他客户端的请求,因此持久化的效率的高低会影响到 Red.
2022-04-10 09:45:52 147
原创 18 波动的响应延迟:如何应对变慢的 Redis?(上)
在 Redis 的实际部署中,如果 Redis 突然变慢就会直接影响到用户的使用体验,增加了请求的延迟,特别是使用Redis 作为秒杀系统中的缓存的时候,由于长时间不能响应用户的请求,会失去大量的用户,然而为了解决 Redis 突然变慢的现象不能盲目求医,在 16,17 节中我们将结果要提升 Redis 的性能可以从 Redis 的异步线程机制和绑核操作两个方面下手。一、Redis 真的变慢了嘛?在判断 Redis 是否真的变慢的直接的方式就是去查看其响应延迟的时间,但是由于软硬件不同,判断 Redi
2022-04-10 09:15:14 252
原创 17 为什么 CPU 结构也会影响 Redis的性能?
CPU 的多核架构及其多 CPU 架构也会对 Redis 在性能上有影响,如果在不了解 CPU 对 Redis 性能的影响的情况下,在对 Redis 进行性能上的调优的时候,可能就会忽略掉一些调优的方法,使得 Redis 的性能发挥到极致。因此下面会介绍一些主流的 CPU 的架构,CPU 多核架构以及多 CPU 架构在 Redis 性能调优的方法。一、主流 CPU 架构一个处理器通常有多个运行核心,每个运行核心被称之为“物理核”,而每个物理核中都各自会有私有的两个缓存空间,被称之为“一级缓存”(Leve
2022-04-10 00:47:08 583
原创 16 异步机制:如何避免单线程模型的阻塞?
Redis 之所以被广泛的使用,其原因就是 Redis 能够支持高性能的访问,但是对于使用单线程模型的 Redis 而言,造成 Redis 被阻塞有五大方面的潜在因素。一、Redis 内部的阻塞操作Redis 在运行之后就需要和多个实例之间进行交互,这些交互的过程涉及到的不同的操作就会阻塞 Redis,其中有四个主要方面的交互:客户端交互,主从库交互,磁盘交互和切片集群交互。客户端交互:网络IO,键值对的增删改查,数据库的操作磁盘交互:生成 RDB 文件,生成 AOF 日志文件,AOF 日志的重写
2022-04-09 23:51:37 221
原创 15 消息队列的考验:Redis 有哪些解决方案?
消息队列支持的各个组件之间的快速通信,而 Redis 高效的读写特性则满足信息读写的要求,但是对于消息队列而言还需要支持其他的要求,那么Redis 能否支持做消息队列,Redis 如何实现一个消息队列?一、消息队列的消息存取需求消息的发送组件被称之为生产者,接收消息的组件称之为消费者,生产者将生产的消息保存为 JSON 的格式,然后将保存好的消息发送给消息队列,之后消费者异步地从消息队列中获取信息,之后将获取的信息本地进行处理,之后再将数据写入到数据库中,其中如果不使用消息队列就会导致数据地接收方在收到
2022-04-09 22:45:51 2090
原创 14 如何在 Redis 保存时间序列数据?
当我们需要存储类似每个用户ID,及其访问行为(浏览,登录,下载时间戳),由于这些数据只是与 ID 对应一条行为的时间戳信息,因此不需要使用到关系型数据库,可以利用 Redis 中存储的键值数据类型,正好可以满足这样的存储需求,Redis 利用自身的数据结构及其扩展模块,提供了两种解决方案。一、时序数据的读写特点(1)写特点时序数据一般就是为了记录某个时刻事务的状态,因此一边写入之后就需要再进行修改操作,通常需要记录成千上万台设备及事物的状态,因此对于写入的效率要求较高,在 Redis 中支持高效率的
2022-04-09 18:00:36 1089
原创 13 GEO 是什么?还可以定义新的数据类型嘛?
在 Redis 中除了五个基本数据类型:List, Set, Sort Set, Hash, String 以外,Redis 还为其他的应用场景的需求提供了 3 中扩展的数据类型 HyperLogLog, Bitmap 和 GEO。其中 Bitmap 用于二值统计计算使用的数据类型,HyperLogLog 用于基数统计的应用场景,而接下来介绍的最后一个扩展数据类型 GEO 则适用于 LBS 应用的服务(LBS:Location-Based-Service 基于位置信息服务)。一、GEO 的底层结构叫车服
2022-04-09 17:35:59 275
原创 12 有一亿个 key 要统计,使用哪种集合?
应用场景:在 Web 应用的业务场景中,我们经常需要保存这样一组信息,一个 key 中对一整个集合。(例如:手机APP保存单个用户一天的登录记录信息,即一个 用户 ID 对应一组移动设备 ID 及其其他登录信息;电商网站上的商品评论信息,一个商品对应着一系列的评论信息;应用网站上的网页访问信息,一个网页对应的一系列的访问点击量等等场景)。Redis 中的集合数据类型就是可以保存一个 Key 对应一整个集合这样的存储结构,满足上面的存储需求,但是我们对这些数据除了存储以外还可能需要对这些数据进行一些统计计.
2022-04-09 16:58:20 1570
原创 11 万金油 String,为什么不好用了?
以下将讲解 String 数据类型在 Redis 中的空间消耗问题,其中结合“图片管理系统”这个应用场景,使用 Redis 来实现根据图片的 ID 获取到存储系统中保存的ID(可以直接叫作图片存储对象ID),其中图片 ID 及其图片存储对象 ID 都是用 10 位数字来保存,其中 Redis 系统中存储了一亿个图片,使用的 6.4G 的内存。平均下来,每对图片 ID 与图片存储对象的键值对就需要消耗 64 个字节,然而 10 位数字只需要使用 8 个字节保存,两个加起来仅仅只需要 16 个字节,那么额外的内
2022-04-09 13:47:37 511
原创 1-9 课后解答总结
1、整数数组和压缩列表在 Redis 数据结构中的优势是什么?Redis 的特定就是“又快又省”,其中整数数组和压缩列表在内存空间使用上都是使用一段连续的空间,布局紧凑,并且不需要额外空间来存储指针。Redis 使用不同的数据结构就是在性能和内存做出平衡。2、AOF 重写的过程中有没有什么潜在的风险?(1)fark 子进程阻塞主线程风险成这项任务,其中在 fark 子进程的过程中需要主线程创建和初始化用于管理这个子进程的数据结构,即 bgrewriteaof 的进程控制块 PCB,而该 PCB 的
2022-04-09 11:38:42 259
原创 09 切片集群:数据增加了,是增加内存还是实例?
当我们需要往 Redis 中需要存储大量的数据,那么是如何选择设计 Redis 实例的配置?是选择比存储所有实例还要大的内存的单个 Redis 实例还是选择使用多个使用多个 Redis 的实例来构成切片集群来存储?1、当需要存储大量的数据时,我们如何设计 Redis 实例的配置?例如,我们需要存储的所有键值对需要的内存大概 25 G,因此我们可以将原先只有 16 G 的 Redis 实例进行纵向的扩展,将其这个 Redis 实例的配置增高,增加内存至 32 G,同时增加磁盘大小,这样我们就又多出来的
2022-04-09 10:32:24 152
原创 08 哨兵集群:哨兵挂了,主从库还能切换吗?
一、当哨兵集群中某个哨兵故障之后,会有什么影响吗?对主从库的监控及其主库切换的新主库的选举和主从库切换后的对其他从库和客户端的通知是由整个哨兵集群共同完成的,如果哨兵集群中某个哨兵出现了故障,这些任务还可以由集群中的其他哨兵来完成,因此不会有太大的影响。二、哨兵集群中的哨兵如何与其他哨兵建立起连接的?Redsi 在创建哨兵的时候除了配置了主库的连接信息并没有添加集群中其他哨兵的连接信息,那么哨兵之间如何获取其他的哨兵的连接信息,从而建立起哨兵集群的?这就是得益于 Redis 的 pub/sub(发布
2022-04-09 09:11:09 345
原创 07 哨兵机制:主库挂了,如何不间断服务?
1、Redis 中的主库发生故障之后,会有什么影响?如果是 Redis 中的从库故障了,并不影响对客户端提供服务,客户端可以向主库或者是其他从库发送请求,但是如果是主库发生了故障,虽然客户端的读请求可以发送给从库来执行操作,但是由于 Redis 的读写分离的机制,客户端的写操作必须交给主库来执行,同时主库的故障断开了与从库之间的数据同步,那么之后从库与那个数据进行数据库同步又是个问题。2、主库故障之后,Redis 采取什么样的机制来解决?对于主库可能发生故障的可能,Redis 利用哨兵机制来解决该问题
2022-04-09 00:05:46 656
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人