codis错误:ResponseError: handle response, backend conn failure, bad array len, too long

前端之家收集整理的这篇文章主要介绍了codis错误:ResponseError: handle response, backend conn failure, bad array len, too long前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

使用codis,遇到错误提示如下:

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

解决办法:

  1. 拆成多个表。

  2. 修改codis源码。

  3. 如果是因为获取的数据量过大导致,建议分批提取数据。

猜你在找的Redis相关文章