首页 > 编程知识 正文

redis scan 效率太慢(redis为什么这么快)

时间:2023-05-03 10:16:42 阅读:82668 作者:456

作者: GrimMjx

目录

开发语言纯内存访问单线程非阻塞复用I/O复用机制

前言

Redis是一个基于密钥-值对(Key-Value )的NoSQL数据库,Redis的Value是一个strue

Redis还提供密钥到期、订阅发布、事务处理、Lua脚本、twdyt、集群等功能。 Redis的指令执行速度非常快,根据官方赋予的性能可以达到10w qps。

那么,本文主要介绍Redis在哪里,主要有以下几点。

一.开发语言

目前,我们使用Java、python等高级语言进行编程。 你可能觉得c语言很古老,但真的很有用。 因为unix系统原本是用c安装的,所以c语言是非常接近OS的语言。 由于Redis是用c语言开发的,所以执行起来会更快。

另外,大学生们好好学习c,会更好地理解计算机操作系统。 不要认为学习高级语言就可以不关注底层。 借的债一定要还。 这里推荐一下难读的书《深入理解计算系统》。

二.纯内存访问

Redis将所有数据放入内存,非数据同步正常工作,不需要从磁盘读取数据,0次I/o。 内存响应时间约为100纳秒,这是Redis速度快的重要基础。 让我们先来看看CPU的速度:

用我的电脑来说,主频是3.1G。 也就是说,每秒可以执行3.1*10^9个指令。 所以CPU看世界非常慢,内存比它慢百倍,光盘比他慢一百万倍,你说不舒服吗?

借用《深入理解计算机系统》的图,展示了典型的存储器分层结构。 在L0层,CPU可以以一个时钟周期访问,基于SRAM的缓存可以以几个CPU时钟周期访问,然后以几十到几百个时钟周期访问基于DRAM的主存储器。

三.单线程

第一,单线程简化了算法的实现,同时数据结构的实现很困难,测试也很麻烦。 其次,单线程避免了线程切换和解锁带来的消耗,对于服务器端的开发来说,锁定和线程的切换通常是性能杀手。

当然,单线程也有缺点。 也是Redis的噩梦。 是街区。 Redis是面向高速运行场景的数据库,因为一个命令会阻止其他命令,对Redis非常致命。

除了Redis之外,Node.js也是单线程,Nginx也是单线程,但他们都是服务器高性能的模型。

四.非阻塞多路I/O复用机制

在此之前,先说明传统的数据块I/O是如何工作的。 在read或write中读取或写入某个文件描述符(文件描述符FD )时,如果未接收到数据,则该线程将挂起,直到接收到数据为止。 虽然阻塞模型很容易理解,但是在需要处理多个客户端任务时,不使用阻塞模型。

I/O多路复用实际上意味着可以在同一过程中管理多个连接。 复用是指网络连接,复用只能是同一个线程。 在网络服务中,I/O复用起到一次将多个连接的事件通知给服务代码处理的作用,处理的方式由服务代码决定。

在I/O复用模型中,最重要的函数调用是I/O复用函数,它同时监视多个文件描述符(fd )的读写,并在一些fd可以读写时返回可读写的fd的数量

Redis使用epoll作为I/O复用技术的实现,而且Redis自身的事件处理模型将epoll的read、write、close等转换为事件,不会在网络I/O上浪费很多时间。 实现对多张FD的读写监控,提高性能。

举个形象的例子。 例如,一个tcp服务器处理20个客户端套接字。

答案:按顺序处理,第一个插座读取网卡的时间变慢后,屏蔽后面就去玩鸡蛋。

b方案:为每个套接字请求创建不同的进程进行处理。 并不是说每个过程都要消耗大量的系统资源。 光是进程的切换,操作系统就很累。

c方案(I/O复用模型,epoll ) )将与用户插座对应的fd登录到epoll中(实际上在服务器和OS之间传递的不是插座的fd,而是fd_set的数据结构)。 然后,epoll只教需要读写的套接字,只处理活动、变化的套接字即可,这样只会在整个进程调用epoll时被阻止,而不会阻止客户消息的发送和接收。

来源: cnblogs.com/grimm JX/p/10662254.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。