V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lsk569937453
V2EX  ›  程序员

最新想自己实现一个 redis,那么问题来了

  •  1
     
  •   lsk569937453 · 2020-06-04 08:32:05 +08:00 · 3985 次点击
    这是一个创建于 1633 天前的主题,其中的信息可能已经有所发展或是发生改变。
    redis 的网络模型是基于 io 多路复用的,处理指令是单线程的。是否存在以下问题


    1 、当程序中存在慢指令的时候,是不是处理连接的逻辑不会阻塞,即会建立非常多的连接,但是由于指令执行非常慢,所以指令相当于都已经在 redis 的队列里排队了


    2 、根据目前的模型,是不是直接用多生产者->单消费者得模型,这样队列里放的应该是指令+channel,但是如何实现服务端 accept socket 后,把指令放入队列,然后阻塞当前连接,等待 channel 执行完,然后继续执行 response 逻辑
    8 条回复    2020-06-04 11:39:23 +08:00
    mazyi
        1
    mazyi  
       2020-06-04 08:48:52 +08:00 via iPhone
    1 是,2 为什么要 channel 。
    lsk569937453
        2
    lsk569937453  
    OP
       2020-06-04 08:51:21 +08:00
    @mazyi 得记录指令属于哪个连接的,等指令执行完,然后将 response 写回到这个连接。
    mazyi
        3
    mazyi  
       2020-06-04 09:26:13 +08:00
    @lsk569937453 不一定需要 channel 实现,只需要 socket 的句柄就行了
    julyclyde
        4
    julyclyde  
       2020-06-04 10:08:31 +08:00
    1 是。我见过一个指令十几秒的情况
    nicebird
        5
    nicebird  
       2020-06-04 10:15:03 +08:00
    1. 是这样的,不过只有在执行类似清理整个 redis 库的指令才会遇到。因为 redis 都是内存里,指令执行很快。
    2. socket 收包、解包后,解析出指令立刻执行,redis 基本没有异步执行的指令,同步执行完了,直接回复就行了。
    TypeErrorNone
        6
    TypeErrorNone  
       2020-06-04 10:19:03 +08:00
    redis 出多线程的了,这个多线程指的是接收连接,操作还是单线程
    boyhailong
        7
    boyhailong  
       2020-06-04 10:20:23 +08:00
    lz 是不是忘记 redis 处理客户端 cmd 实现用的 tcp
    wangsilence
        8
    wangsilence  
       2020-06-04 11:39:23 +08:00
    redis 大多数命令时间复杂度都是 O(1) 、O(log N)、O(N), 而且都是基于内存操作,可以说非常快,这种时间时间复杂度比较低的在引入多线程会增加复杂性,提升不高。dump 都是 fork 子进程来处理的,Redis 6.0 引入了多线程 I/O,比较耗时的命令也增加了多线程处理
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1019 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:37 · PVG 03:37 · LAX 11:37 · JFK 14:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.