加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

codis错误:ResponseError: handle response, backend conn fail

发布时间:2020-12-16 04:40:34 所属栏目:安全 来源:网络整理
导读:使用codis,遇到错误提示如下: ResponseError: handle response,backend conn failure,bad array len,too long 背景: 一个hash表中有上500w的键数据,在使用hkeys命令时,会显示错误ResponseError: handle response,too long。 一个有序集合键数量超过180w

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读