ResponseError: handle response,backend conn failure,bad array len,too long
背景:
一个hash表中有上500w的键数据,在使用hkeys命令时,会显示错误ResponseError: handle response,too long。
一个有序集合键数量超过180w条数据,在使用zrange时,也会提示错误ResponseError: handle response,too long。
问题原因:
const ( MaxBulkBytesLen = 1024 * 1024 * 512 MaxArrayLen = 1024 * 1024 )
是因为codies的代码限制键数量不能超过1024*1024,一次返回数据最大不超过1024*1024*500字节。
而codis根据 Redis 协议里面 BulkBytesArray 不应该有超过 1024x1024 个数据。
func (d *Decoder) decodeArray() ([]*Resp, error) { n, err := d.decodeInt() if err != nil { return nil, err } switch { case n < -1: return nil, errors.Trace(ErrBadArrayLen) case n > : return nil, errors.Trace(ErrBadArrayLenTooLong) case n == -1: return nil, nil } array := make([]*Resp, n) for i := range array { r, err := d.decodeResp() if err != nil { return nil, err } array[i] = r } return array, nil }
https://github.com/CodisLabs/codis/blob/release3.1/pkg/proxy/redis/decoder.go#L193
解决办法: