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. 如果是因为获取的数据量过大导致,建议分批提取数据。

相关文章

文章浏览阅读1.3k次。在 Redis 中,键(Keys)是非常重要的概...
文章浏览阅读3.3k次,点赞44次,收藏88次。本篇是对单节点的...
文章浏览阅读8.4k次,点赞8次,收藏18次。Spring Boot 整合R...
文章浏览阅读978次,点赞25次,收藏21次。在Centos上安装Red...
文章浏览阅读1.2k次,点赞21次,收藏22次。Docker-Compose部...
文章浏览阅读2.2k次,点赞59次,收藏38次。合理的JedisPool资...