Redis 核心技术与实战
文章平均质量分 85
Redis 作为具备高性能、高可靠和高可扩展性的典型键值数据库,是很多互联网公司的首选。
一点知趣
请为人生舔砖加瓦
展开
-
11 | “万金油”的String,为什么不好用了?
最后,我还想再给你提供一个小方法:如果你想知道键值对采用不同类型保存时的内存开销,可以在这个网址里输入你的键值对长度和使用的数据类型,这样就能知道实际消耗的内存大小了。集合类型时,一个 key 就对应一个集合的数据,能保存的数据多了很多,但也只用了一个 dictEntry,这样就节省了内存。所以,当上一个 entry 长度小于 254 字节时,prev_len 取值为 1 字节,否则,就取值为。的数据时,我们需要将单值数据拆分成两部分,分别作为 Hash 集合的键和值。我们先回顾下压缩列表的构成。原创 2023-04-25 09:46:05 · 71 阅读 · 0 评论 -
12 | 有一亿个keys要统计,应该用哪种集合?
我举几个例子1、手机 App 中的或移动设备 ID;2、电商网站上商品的;3、用户在手机 App 上的;4、应用网站上的。我们知道,,所以非常适合用来存取这些数据。但是,在这些场景中,除了记录信息,我们往往还需要,例如1、在移动应用中,需要;2、在电商网站的商品评论中,需要;3、在签到打卡中,需要;4、在网页访问记录中,需要。通常情况下,我们,比如百万、千万级别的用户数量,或者千万级别、甚至亿级别的访问信息。所以,我们必须要选择能够想选择合适的集合,我们就得了解。原创 2023-04-25 16:06:36 · 85 阅读 · 0 评论 -
09 | 切片集群:数据增多了,是该加内存还是加实例?
虽然组建比较麻烦,但是它可以,而且。切片集群,也叫,就是指启动组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存。原创 2023-04-21 09:52:44 · 60 阅读 · 0 评论 -
10 | Redis的一些问题答疑
当主线程收到新写或修改的操作时,主线程会申请新的内存空间,用来保存新写或修改的数据,如果操作的是 bigkey,也就是数据量大的集合类型数据,那么,在 Redis 基本 IO 模型中,主要是主线程在执行操作,任何耗时的操作,例如 bigkey、全量返回等操作,都是潜在的性能瓶颈。如果此时,主线程接收到了新写或修改操作,那么,主线程会使用写时复制机制。具体来说,写时复制就是指,主线程在有写操作时,才会把这个。,同时我们假设,所有键值对是平均分布在哈希表的各个桶中的,那么,此时,哈希表可以。原创 2023-04-22 09:47:14 · 155 阅读 · 0 评论 -
08 | 哨兵集群:哨兵挂了,主从库还能切换吗?
以 3 个哨兵为例,假设此时的 quorum 设置为 2,那么,任何一个想成为 Leader 的哨兵只要拿到 2 张赞成票,就可以了。A、哨兵提供的消息订阅频道有很多,不同频道包含了主从库切换过程中的不同关键事件。B、接着,哨兵就可以根据从库列表中的连接信息,和每个从库建立连接,并在这个连接上持续地对从库进行监控。C、多个哨兵实例都在主库上做了发布和订阅操作后,它们之间就能知道彼此的 IP 地址和端口。,当然不是哪个哨兵想执行就可以执行的,否则就乱套了。三、哨兵是如何知道从库的 IP 地址和端口的呢?原创 2023-04-20 20:47:21 · 74 阅读 · 1 评论 -
07 | 哨兵机制:主库挂了,如何不间断服务?
(同时,多个哨兵的网络同时不稳定的概率较小,由它们一起做决策,误判率也能降低。(我们在多个从库中,先按照一定的筛选条件,把不符合条件的从库去掉。然后,我们再按照一定的规则,给剩下的从库逐个打分,将得分最高的从库选为新主库)b、如果哨兵发现主库或从库对 PING 命令的响应超时了,那么,哨兵就会先把它标记为“主观下线”(如果检测的是。也没有在规定时间内响应哨兵的 PING 命令,哨兵就会判定主库下线,然后开始自动切换主库的流程。超出了一定的阈值,说明这个从库的网络状况并不是太好,就可以把这个从库筛掉了。原创 2023-04-18 16:29:04 · 56 阅读 · 0 评论 -
06 | 数据同步:主从库如何实现数据一致?
b3、随着主库不断接收新的写操作,它在缓冲区中的写位置会逐步偏离起始位置,我们通常用偏移量来衡量这个偏移距离的大小,对主库来说,对应的偏移量就是。所以,通过调大这个参数,可以减。,然后加载 RDB 文件。b4、同样,从库在复制完写操作命令后,它在缓冲区中的读位置也开始逐步偏移刚才的起始位置,此时,从库已复制的偏移量。a1、在部署主从集群的时,手动选择一个从库(比如选择内存资源配置较高的从库),用于级联其他的从库。a2、然后,我们再选择一些从库(例如三分之一的从库),让它们和刚才所选的从库,建立起主从关系。原创 2023-04-18 15:27:36 · 457 阅读 · 0 评论 -
04 | AOF日志:宕机了,Redis如何避免数据丢失?
一、Redis 的持久化主要有两大机制A、AOF(Append Only File)日志B、RDB 快照二、AOF 日志是如何实现的?A、数据库的写前日志(Write Ahead Log, WAL)1、在实际写数据前,先把要修改的数据记到日志文件中,以便故障时进行恢复B、AOF 日志正好相反,它是写后日志1、Redis 先执行命令,把数据写入内存,然后才记录日志C、AOF 里记录了什么内容1、AOF 里记录的是 Redis 收到的每一条命令,这些命令是以文本形式保原创 2023-04-13 16:03:46 · 70 阅读 · 0 评论 -
03 | 高性能IO模型:为什么单线程Redis能那么快?
类似的,当 Redis 通过 recv() 从一个客户端读取数据时,如果数据一直没有到达,Redis 也会一直阻塞在 recv()。不过,幸运的是,Redits是通过网络框架访问的,网络访问框架包括socket Server和请求解析,而。我们刚开始增加线程数时,系统吞吐率会增加,但是,再进一步增加线程时,系统吞吐率就增长迟缓了,有时甚至还会出现。的情况下,可以增加系统中处理请求操作的资源实体,进而提升系统能够同时处理的请求数,即吞吐率。既然 Redis 是单线程,那么,最基本的一种实现是在一个线程中。原创 2023-04-12 15:14:35 · 66 阅读 · 0 评论 -
05 | 内存快照:宕机后,Redis如何实现快速恢复
B、但是,如果主线程要修改一块数据(例如图中的键值对 C),那么,这块数据就会被复制一份,生成该数据的副本(键值对 C’)。A、如果主线程对这些数据也都是读操作(例如图中的键值对 A),那么,主线程和 bgsave 子进程相互不影响。3、通过 bgsave 命令来执行全量快照,这既提供了数据的可靠性保证,也避免了对 Redis 的性能影响。没有阻塞,可以正常接收请求,但是,为了保证快照完整性,主线程。1、虽然跟 AOF 相比,快照的恢复速度快,但是,快照的。1、为了提供所有数据的可靠性保证,它执行的是。原创 2023-04-13 16:33:08 · 124 阅读 · 0 评论 -
02 | 数据结构:快速的Redis有哪些慢操作?
操作,可以返回集合中的所有数据,比如 Hash 类型的 HGETALL 和 Set 类型的 SMEMBERS,或者返回一个范围内的部分数据,比如 List 类型的 LRANGE 和 ZSet 类型的 ZRANGE。a、对于 List 类型的 LPOP、RPOP、LPUSH、RPUSH 这四个操作来说,它们是在列表的头尾增删元素,这就可以通过偏移量直接定位,所以它们的复杂度也只有 O(1),可以实现快速操作。2、一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶,每个哈希桶中保存了键值对数据。原创 2023-04-12 14:10:15 · 119 阅读 · 0 评论 -
Redis的两大维度和三大主线
使用上的“坑”,例如数据结构的复杂度、跨 CPU 核的访问;使用上的“坑”,例如主从同步和 AOF 的内存竞争;上的“坑”,例如在 SSD 上做快照的性能抖动;通信上的“坑”,例如多实例时的异常网络丢包。(可以简称为“三高”)。“三大主线”也就是指。原创 2023-04-11 16:04:24 · 34 阅读 · 0 评论 -
01 | 基本架构:一个键值数据库包含什么?
键值数据库网络框架接收到网络包,并按照相应的协议进行解析之后,就可以知道,客户端想写入一个键值对,并开始实际的写入流程。此时,我们会遇到一个系统设计上的问题,简单来说,就是。进行访问,而不再是动态库了,这也使得 Redis 可以作为一个基础性的网络服务进行访问,扩大了 Redis 的应用范围。,这虽然让 SimpleKV 的数据更加可靠,但是,因为每次都要写盘,SimpleKV 的性能会受到很大影响。,因此也带来了更多的操作接口,例如面向列表的 LPUSH/LPOP,面向集合的 SADD/SREM 等。原创 2023-04-11 17:19:33 · 267 阅读 · 0 评论