Redis03——Redis架构

Redis架构

1.1.问题

redis是单线程,单实例,为什么并发那么多,依旧很快呢?

回答:因为调用了系统内核的epoll

1.2.Linux的早期版本

Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写。我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description)。我们开启线程/进程去调用read进行读取。因为socket在这个时期是blocking(阻塞的),遇到高并发,就会阻塞,也就是bio时期。

1.3.内核的跃迁

Linux kernal在之后的发展,有了很大的变化,Linux到达率NIO时期。我们可以使用客户端进行轮询访问。但是,我们如果打进1000个线程访问,那么成本就会很大。我们出现了select函数,select函数和pselect函数,我们可以直接传1000个文件描述符,一旦有返回,那么再去调read函数。这个叫做多路复用的NIO。

紧接着,内核再次跃迁,我们出现了一个共享空间,通过mmap进行空间映射。(本质是红黑树+链表//红黑树是一种自平衡的二叉查找树)。我们将1000个文件描述符写进共享空间,如果我们的数据有返回,那么加入链表,我们从链表取出调用read进行读取。我们出现了一个epoll函数,它能够处理大量并发连接少量活跃的情况。epoll是同步,非阻塞的多路复用。

科普:
(参考:https://www.jianshu.com/p/444646e02ef7)
I/O:I/O,input output,即磁盘的输入输出。

蔟(sector)和块(block):磁盘驱动的最小单位叫做sector,也叫扇区。对于Linux,虚拟文件系统(VFS)抽象了磁盘设备,统一称为块设备(block device)。

页面缓存(page cache):我们在调用write函数式,会首先写入页面缓存。此时,这个页面叫做脏页面(dirty page),但是,会最终会写回(write back)到内核。如果没有进行write back,那么断电之后,我们就会丢失数据。

mmap:我们的page cache仍然是看不见的,所以,我们通过mmap的映射,可以在应用层直接对page cache进行读写操作。

sendfile:我们可以直接将page cache的fd的一部分数据传给另一个fd,不需要拷贝到应用层的2次copy,所以也被称为零拷贝(zero copy)。

direct I/O:不通过page cache,直接对VFS进行读写,但是在linux2.6之后被废弃

AIO(Asynchronous IO):异步IO,Linux有两套“AIO”接口,仅仅支持磁盘IO,不支持网络IO
    POSIX AIO:POSIX AIO用信号通知IO完成了,所以,要先注册一个句柄(handle)。
    Linux AIO:第二套IO叫做Linux AIO
    这两套接口都有问题,所以周老师说Linux没有AIO,Windows才有(设计问题)

BIO(Blocking IO):阻塞型的,早期Linux,没数据会卡住
NIO(NonBlocking IO):非阻塞型的,没数据直接返回没有数据

IO多路复用(IO Multiplexing):注册一组socket文件描述符给操作系统,如果IO事件发生,交给程序处理。

select:接受指定的文件描述符数组,来读写和异常
poll(译文:轮询):优化select,把读写异常这三个变量变为结构体
epoll:创建一个表,然后用文件描述符指向表,监听表内事件

原文地址:https://www.cnblogs.com/littlepage/p/11515550.html

时间: 2024-10-31 17:55:16

Redis03——Redis架构的相关文章

如何搭建高可用redis架构?

1 题记 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API. 如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求.Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的.在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库. 考虑高性能的同时,高可用也是很重要的考虑因素.互联网 7

Redis架构之防雪崩设计:网站不宕机背后的兵法

Redis架构之防雪崩设计:网站不宕机背后的兵法 原创: 付磊,张益军 高可用架构 2017-03-24 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防及优化 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步: 缓存层不命中 存储层不命中,所以不将空结果写回缓存 返

redis架构详解

一.redis特性1.redis 是什么?redis是基于内存的可持久化的key-value数据库2.redis数据结构类型?value支持五种数据类型,字符串.字符串列表.字符串集合.有序集合.hashs3.redis持久存储方式redis两种持久化方式,RDB,和AOFRDB: 将某一时刻的数据持久化到磁盘上,是一种快照式的持久方式, redis在进行持久化的过程中,会先将数据写入临时文件中,待持久化过程结束,会用这个临时文件,替换上次持久化的文件,正是这种特性,让我们可以随时来进行备份,因

细说分布式Redis架构设计和踩过的那些坑

摘要:本文章主要分成五个步骤内容讲解 Redis.RedisCluster和Codis; 我们更爱一致性; Codis在生产环境中的使用的经验和坑们; 对于分布式数据库和分布式架构的一些看法; Q & A环节. Codis是一个分布式Redis解决方案,与官方的纯P2P的模式不同,Codis采用的是Proxy-based的方案.今天我们介绍一下Codis及下一个大版本RebornDB的设计,同时会介绍一些Codis在实际应用场景中的tips.最后抛砖引玉,会介绍一下我对分布式存储的一些观点和看法

Discuz!NT中的Redis架构设计

在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案,我在企业版里引入了Redis这个目前炙手可热的缓存架构产品,即将memcached与Redis作为可选插件方式来提供了最终用户,尽管目前测试的结果两者的差异不是很大(毫秒级),但我想多一种选择对用户来说也是好的. 闲话不多说了,开始今天的正文吧.         熟悉我们产品的开发者都知道,我们的

[转载] Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=208733458&idx=1&sn=691bfde670fb2dd649685723f7358fea&scene=1&key=c76941211a49ab58cb17c68ecaeeda0f1c083d9508a0f6629461fff9025fd87de4706bd9c1730e0ddbab70568b34b16a&ascene=0&

Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

本次分享的内容主要包括五个大部分: Redis.RedisCluster和Codis; 我们更爱一致性; Codis在生产环境中的使用的经验和坑们; 对于分布式数据库和分布式架构的一些看法; Q & A环节. ??Codis是一个分布式Redis解决方案,与官方的纯P2P的模式不同,Codis采用的是Proxy-based的方案.今天我们介绍一下Codis及下一个大版本RebornDB的设计,同时会介绍一些Codis在实际应用场景中的tips.最后抛砖引玉,会介绍一下我对分布式存储的一些观点和看

Redis架构

REDIS是一个开源的.先进的键值存储系统.它通常可以被用作数据结构服务器,因为它的键可以包含字符串(string).哈希值(hash).列表(list).集合(set)以及有序集合(sortedset).而且Redis使用的是内存数据集合.根据你自身的使用情况,你可以定时将这些内存中的数据保存至磁盘中,或者将每个命令都添加至日志中.你可以通过redis的项目主页了解它的更多功能.Redis最初的作者是Salvatore Sanfilippo,并且VMWare从2010年5月份开始资助该项目.目

Memcached 及 Redis 架构分析和区别比较

Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放在一起做一下对比的介绍 基本架构和思想 首先简单介绍一下两者的架构和设计思路 Memcached Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. 从用户的角度来说,服务器维护了一个键-值关系的数据