首页 > 其他分享 >基于协程的kv存储

基于协程的kv存储

时间:2024-07-22 23:26:18浏览次数:8  
标签:异步 存储 协程 调度 kv io 进行

项目背景:

        协程是一种轻量级的线程,可以在一个线程中创建多个协程,协程通过让出自身的控制权来实现协程之间的切换,当有事件就绪时,再恢复到之前的状态继续执行,协程之间的切换是在用户态之间进行的,性能开销更小。同时,协程的处理逻辑是比较偏向同步编程,做到了同步编程方式下实现异步的性能。

项目描述:

        使用协程处理客户端的连接请求和io操作,通过接收的命令进行用户态协议解析,并发处理对服务端的kv存储引擎的增删改查,实现了同步编程模式下拥有异步编程的效率。

        项目架构主要由网络层、协议层和核心层组成,网络层使用协程进行客户端的请求和io操作,协议层使用dpdk来实现在用户态空间进行协议解析。核心层是进行数据存储的引擎,使用红黑树进行存储。

项目流程:

        1.单线层多协程:将每一个网络连接创建一个协程,单列模式下由一个调度器对协程进行切换,底层逻辑由epoll实现。

        2.协程的创建:将每一个端口的连接创建一个协程,入口函数处理socket连接,此后io操作(recv、send)等进行异步处理。

        3. Hook重定向:每个协程在进行io操作之前,通过hook重定向到自定义的io函数,函数内部将协程io的socketfd加入到调度器底层实现的epoll中,让出CPU(yield),处理其它准备就绪的协程io,待调度器resume给当前协程再执行io操作,实现异步效率。

        4. 原语操作:

                yield:协程让出CPU给调度器并保存协程的上下文,以便resume之后能够进行io操作。

                resume:调度器恢复执行某个准备就绪的协程。

        5. 应用层:程序对接收的数据进行协议解析,用红黑树实现kv存储引擎的增删改查,将获得的数据回发给客户端。

参考连接

https://xxetb.xetslk.com/s/2fs2Vb

标签:异步,存储,协程,调度,kv,io,进行
From: https://blog.csdn.net/weixin_43776107/article/details/140621202

相关文章

  • 登陆京东(滑块验证),验证码识别,Scrapy框架介绍及其使用,持久化存储到本地
    Ⅰ案例登陆京东(滑块验证)【一】下载opencv库pipinstallopencv-python【二】数据准备先将京东的滑块图片下载到本地背景图background.png滑块图tag.png【三】展示获取滑块的移动数据importos.path#使用opencv识别图像计算滑块之间的距离importcv2impo......
  • 安防视频监控/视频集中存储EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构,兼容性强、支持多协议接入,包括国标GB/T28181协议、部标JT808、GA/T1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SDK等。平台能对外分发RTMP、RT......
  • 七牛云、阿里云和腾讯云云存储基础环境搭建教程
    七牛云、阿里云和腾讯云云存储基础环境搭建教程整体介绍该程序是技术栈由PHP7.4、MySQL5.7和Redis7.0,运行环境可以是Linux、Mac,也可以是Windows,是一款完全跨端的应用程序。要部署这套应用,你需要保证PHP版本不低于7.4,MySQL版本不低于5.7,Redis的版本可以是5.x,或者是6.x,建议......
  • Scrapy:存储/抓取当前的start_url?
    背景(可以跳过):我当前正在运行两个不同的scrapy爬虫。第一个检索有关产品x的信息,第二个检索有关产品x的其他信息,这些信息是在第一个机器人抓取的url上找到的.我的管道将每个产品的信息连接到多个文本文件中,其中每个产品的信息占用一行数据,并作为不同的文本文件......
  • 使用nginx proxy_pass从s3存储桶中读取sitemap.xml文件
    使用nginxproxy_pass从s3存储桶中读取sitemap.xml文件 nginx是一款高性能的开源Web服务器软件,也可以作为反向代理服务器使用。proxy_pass是nginx的一个指令,用于将客户端的请求转发到其他服务器上。在使用nginx的proxy_pass指令从S3存储桶中读取sitemap.xml文件时,可以按......
  • 嵌入式C++、STM32F103、MQTT、InfluxDB存储和Grafana可视化:工厂设备的实时监控和数据
    1.项目概述随着工业4.0的推进,智能制造已成为制造业发展的必然趋势。本文介绍了一套基于STM32和MQTT协议的小型工厂设备监控系统,可实现对工厂设备的实时监控和数据分析,有效提高生产效率和安全性。系统主要包括三个部分:设备端:使用STM32MCU连接各种传感器,采集设备运行......
  • 如何对存储类型注释的变量进行类型注释?
    假设我有:x:type=Optional[str]#<---typeerror这会导致类型错误:Expressionoftype"UnionType"isincompatiblewithdeclaredtype"type""UnionType"isincompatiblewith"type"我不想输入annotatexwith......
  • Robot Framework 数据库库调用 Oracle 存储过程失败,并出现字符到数字转换错误
    我有一个OraclePL/SQL程序,我可以直接调用如下,没有问题:BEGINexample_package_name.example_procedure(p_item_no=>123456,p_send_now=>true);END;(注意:p_item_no期望aNUMBER和p_send_now期望aBOOLEAN)我正在......
  • 变量及计算机中的存储规则
    注释单行注释//这是单行注释文字多行注释/*这是多行注释文字这是多行注释文字这是多行注释文字*/注意:多行注释不能嵌套使用。关键字Java语法中被赋予了特定含义的英文单词,下图是Java程序中常用的关键字:字面量字面量类似于c语言中的常量,告诉程序员数据在程序中......
  • Day45.存储引擎
    1.存储引擎_MySQL主要的存储引擎和查看索引存储引擎命令2.存储引擎_不同的存储引擎在存储表的时候的异同点3.存储引擎_不同引擎存储数据后的异同点Ⅰ4.存储引擎_不同引擎存储数据后的异同点Ⅱ5.存储引擎_存储引擎内容总结 ......