【网络进阶】redis、memcached、nginx网络组件(三)

1. memcached

1.1 环境

  1. KV内存数据库
    Memcached是一款基于内存的键值对存储系统,主要用来作为小型数据的缓存。使用键值(KV)对作为其基本数据结构,实现了对数据的快速存取。其中键是唯一的,值可以是字符串、数字、JSON等数据类型。例如:

    set my_key 0 900 5
    Hello
    STORED
    get my_key
    VALUE my_key 0 5
    Hello
    END
    
  2. 命令处理多线程的
    Memcached通过多线程处理命令来提高效率。在一个Memcached服务器中,会有多个工作线程同时运行,每个工作线程独立地处理客户端的请求。这样在高并发的环境中,Memcached能够更好地利用系统资源,提高其处理能力。但需要注意的是,虽然Memcached是多线程的,但数据是共享的,因此操作需要注意并发控制。

1.2 Memcached为什么要使用多Reactor

  1. KV数据操作简单
    由于Memcached是键值存储,其对数据的操作通常比较简单,如存、取、删等。因此,这些操作的处理速度很快,不会占用过多的CPU时间。使用多Reactor模式,可以使得多个请求并发处理,提高了整体的处理效率。

  2. 更高程度并发处理业务
    Reactor模式是一种并发处理模式,其中Reactor负责处理IO事件,然后分发给相应的处理程序。在Memcached中,采用多Reactor模式可以更高效地处理并发请求。每个Reactor运行在一个独立的线程中,监听并处理自己的IO事件,当有新的事件到来时,Reactor会将事件分发给对应的处理程序。这样,多个Reactor可以并行地处理多个请求,进一步提高了并发处理能力。

1.3 Memcached怎么处理Reactor

在Memcached中,每个Reactor运行在一个独立的线程中。每个线程中都有一个事件循环,用于监听并处理IO事件。当一个新的请求到来时,Reactor会根据请求的类型,将事件分发给对应的处理程序。处理程序完成处理后,将结果返回给Reactor,Reactor再将结果返回给客户端。

在Memcached中,Reactor模式的实现主要是依赖于libevent库,该库提供了丰富的API,用于处理各种类型的IO事件。例如,当一个新的连接请求到来时,libevent会触发一个事件,然后Reactor就可以接收这个连接请求,并将其分发给对应的处理程序。处理程序完成处理后,将结果返回给Reactor,Reactor再将结果返回给客户端。

struct event_base* base = event_base_new();
struct event* listen_event;

listen_event = event_new(base, listen_sock, EV_READ|EV_PERSIST, do_accept, (void*)base);

event_base_dispatch(base);

以上的代码片段,展示了一个简单的事件驱动模型,它使用libevent库创建一个新的事件基础(event base),然后创建一个监听事件,当监听到新的连接请求时,do_accept函数被调用。

注意,在具体的业务处理逻辑中,需要考虑到并发控制的问题,因为在多Reactor的环境下,可能会有多个请求同时对同一份数据进行操作。

总的来说,Memcached使用多Reactor模式,通过高效的并发处理,实现了其高速缓存的功能,大大提高了Web应用的性能。

2. nginx

2.1 环境

  1. 反向代理
    Nginx常被作为反向代理服务器使用。反向代理隐藏了服务器的信息,客户端并不直接与目标服务器通信,而是将请求发送到反向代理服务器,由反向代理服务器转发请求到目标服务器,并将目标服务器的响应结果返回给客户端。这样既保护了服务器,又能够提高处理能力。在配置Nginx为反向代理的过程中,需要设置proxy_pass指令,比如:

    location / {
        proxy_pass http://localhost:8000;
    }
    
  2. 多进程处理业务
    Nginx是一个多进程的服务器,主要有一个主进程和多个工作进程。主进程主要用于读取和验证配置文件,管理工作进程;工作进程则负责处理实际的请求。这样的设计使得Nginx能够充分利用多核CPU,提高并发处理能力。

2.2 Nginx为什么要使用多线程

  1. 业务类型复杂
    Nginx需要处理的业务类型复杂,包括静态文件服务、SSL加密解密、Gzip压缩、代理转发等。多线程的设计可以让每个线程专注于处理一种类型的任务,提高了处理效率。

  2. 通过进程隔离运行环境避免加锁
    由于Nginx采用多进程模型,每个进程都有自己独立的运行环境,这样在处理请求时可以避免加锁操作,提高了性能。此外,进程崩溃不会影响到其他进程,提高了服务的稳定性。

2.3 Nginx怎么处理Reactor

  1. 通过锁在用户态解决惊群,目的是为了在用户层处理连接的负载均衡
    Nginx的worker进程在启动时,会创建一个互斥锁(accept_mutex),用于解决"惊群问题"。当一个新的连接请求到来时,只有获得这个锁的worker进程才能接受这个连接,这样在用户层实现了连接的负载均衡。

  2. 进程到达 7 / 8 * connections 的时候,不再处理连接,让其他进程处理连接
    当Nginx的某个worker进程已经处理的连接数达到worker_connections的7/8时,这个worker进程将停止接收新的连接,让其他的worker进程来处理新的连接请求。这样可以防止某个worker进程过载。

  3. 当所有进程都到达 7 / 8 * connections 的时候,连接处理将变得缓慢
    如果所有的worker进程已经处理的连接数都达到了worker_connections的7/8,那么Nginx将开始缓慢地处理新的连接请求。这是一个警告信号,表明Nginx的处理能力已经接近饱和,需要扩容或者优化了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ricky_0528

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值