-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
咨询问题pipeline #935
Comments
没有问题 |
pipeline别用,有bug,例如以下语句,在并发执行的时候redis中正确执行,在pika中数据执行错乱。
python版本
|
@ForestLH 负责验证该功能 |
可以详细一点儿吗,是不是使用的客户端的问题,我用这个"github.com/go-redis/redis/v8"测试没有发现问题呀 |
So long time that you maybe can not get a reply. |
用的这个。go get github.com/go-redis/redis |
单个测试没问题,在多协程中同时执行以下语句会有问题,测试的时候可以往pika队列里面写入1-10000000的数字字符串,然后1000个协程同时执行以下语句将获取到的值存入txt,对比txt是否是1-10000000。 pipe := client.Pipeline()
pipe.LRange("key", 0, 200-1)
pipe.LTrim("key", 200, -1)
cmders, err := pipe.Exec() |
我这样测试还是没有测试出来问题,你可以看看这样测试对不对吗,谢谢您了 |
哈喽不好意思,到现在才来提交。往redis里写数据参考put.py,从redis里读数据参考get.go。已经提交到https://github.com/ForestLH/goredisclient。redis写入和读取数据一致,pika会多数据,不知道这样编写是否有错误哈,仅供参考。 |
你能否加下 Pika 微信助手 PikiwiDB【加的时候请注明暗号 pika pipeline】,然后它会把你拉进 Pika 微信群,我们在微信群里讨论下这个问题? |
pika/src/net/src/redis_conn.cc Lines 89 to 112 in bf3574d
89 行从网络 read 一次,得到 pika/src/net/src/redis_parser.cc Lines 313 to 321 in bf3574d
parser 里逻辑,会判断上一次 read,有没有读“一半”的,有剩的一半,给拼到本次读的前面,然后进行对 request 进行 parse(解 cmd) pika/src/net/src/redis_parser.cc Lines 344 to 346 in bf3574d
可以看到解的过程是个循环,也就是说会把读到的可完整解出来的,都解出来,然后就是给 worker 现成执行了。 但是问题是读到的,比如 pipeline 里命令很多的话,或者网络 io 并发高等等因素,导致一次 read 没有把所有 pipeline 里命令都读完(不然正常 read 函数也不承诺一口气都读完),则 pipeline 里的多个命令,可能会在不同的 worker 线程里执行,导致响应的顺序跟请求的顺序对不上。 |
还有一个点是 go-redis 的 pipeline 实现问题 https://github.com/redis/go-redis/blob/50f04c14dee344147e9cf061f752ee913fd6c3ee/redis.go#L497-L501 https://github.com/redis/go-redis/blob/50f04c14dee344147e9cf061f752ee913fd6c3ee/command.go#L59-L61 可以看到,只是把 cmd 对象攒起来,然后循环 write 而已。 而看 redis 自己的 client pipeline 实现: 可以看到 redis 自己的 client 的 pipeline 实现,攒 cmd 的逻辑是在拼 buffer, 不过这个差别也不是硬伤,毕竟 write 也不承诺一口气都能写完。 |
the oldest pika issue #19 |
问题分 2 个维度,1 是 pipeline 本身维度,2 是并发读写状态维度。
|
|
pika server解析出完整命令之后交由工作线程处理,然后会del对应connfd的读写事件,所以我理解在上一个请求处理完成向client回包之前,不会在收包,所以不会出现同一个连接上多个请求同时被工作线程池中的多个线程处理的情况。 |
pipeline试了是可以支持的,但是没看到文档说明,不知道是不是有问题
The text was updated successfully, but these errors were encountered: