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

2020-06-04 08:32:05 +08:00
 lsk569937453
redis 的网络模型是基于 io 多路复用的,处理指令是单线程的。是否存在以下问题


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


2 、根据目前的模型,是不是直接用多生产者->单消费者得模型,这样队列里放的应该是指令+channel,但是如何实现服务端 accept socket 后,把指令放入队列,然后阻塞当前连接,等待 channel 执行完,然后继续执行 response 逻辑
3985 次点击
所在节点    程序员
8 条回复
mazyi
2020-06-04 08:48:52 +08:00
1 是,2 为什么要 channel 。
lsk569937453
2020-06-04 08:51:21 +08:00
@mazyi 得记录指令属于哪个连接的,等指令执行完,然后将 response 写回到这个连接。
mazyi
2020-06-04 09:26:13 +08:00
@lsk569937453 不一定需要 channel 实现,只需要 socket 的句柄就行了
julyclyde
2020-06-04 10:08:31 +08:00
1 是。我见过一个指令十几秒的情况
nicebird
2020-06-04 10:15:03 +08:00
1. 是这样的,不过只有在执行类似清理整个 redis 库的指令才会遇到。因为 redis 都是内存里,指令执行很快。
2. socket 收包、解包后,解析出指令立刻执行,redis 基本没有异步执行的指令,同步执行完了,直接回复就行了。
TypeErrorNone
2020-06-04 10:19:03 +08:00
redis 出多线程的了,这个多线程指的是接收连接,操作还是单线程
boyhailong
2020-06-04 10:20:23 +08:00
lz 是不是忘记 redis 处理客户端 cmd 实现用的 tcp
wangsilence
2020-06-04 11:39:23 +08:00
redis 大多数命令时间复杂度都是 O(1) 、O(log N)、O(N), 而且都是基于内存操作,可以说非常快,这种时间时间复杂度比较低的在引入多线程会增加复杂性,提升不高。dump 都是 fork 子进程来处理的,Redis 6.0 引入了多线程 I/O,比较耗时的命令也增加了多线程处理

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678459

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX