缓存Tair高性能使用规范

不要短时间大量重复读写相同的key

server端的原理是网络收包后,放入到工作队列(读写队列分离,但都只有一个),再由工作线程从队列中取出进行处理。这里一个问题是,为保证数据的正确性,会对同一个key的读写加锁,而如果存在大量读写同一个key的情况,则势必会阻塞其他线程(锁不慢,锁竞争才慢),导致拖慢整个服务端的处理速度。
不要使用时间戳作为key的一部分,容易导致一段时间内所有流量都访问一台服务端机器,导致服务端压力过大而出现大量超时

Value大小多大合适

value建议不超过50KB,value越大,服务端能承受qps越低,请求耗时越大,当value大小超过1MB时,缓存失效,读写性能将严重受影响

超时时间设置多少合适

普通kv接口:单key请求超时时间建议设置100ms以上,批量请求超时时间建议设置200ms以上
特殊数据结构接口:超时时间建议设置500ms左右

超时是否需要重试

写超时:除非服务端压力过大丢弃请求,否则所有写请求在服务端都会执行成功,只是没有返回结果给客户端,除非业务逻辑依赖数据的强一致性,否则不需要重试
读超时:如果是批量接口,建议设置返回比例(参数为BatchReturnPercent),如果需要重试,建议sleep 100ms左右后重试,重试不要超过3次

批量请求使用注意

批量请求key个数
批量请求key个数建议不要超过100个
batchGet请求如何提升可用性
可以设置批量请求返回比例(参数为BatchReturnPercent)

复杂数据结构中元素不宜过多

tair目前引擎对于复杂数据结构,如list,set,map,prefix接口,支持的不够友好。
这些复杂数据结构的元素不要存储超过2000个,后续服务端会限制元素个数,个数超过后禁止写入。

作为缓存使用时,不要在获取数据失败时直接重写缓存数据

获取数据失败的原因很多,但是只有在确定数据不存在的情况下,才需要重写缓存数据。如果没有正确区分失败的情况就直接重写缓存数据,则可能会加剧失败的可能,同时会对集群造成更大的压力。例如在超时的情况下重写缓存数据,超时次数可能会更多,且有雪崩的风险。
只有出现下面其中一个返回码时,才需要重写缓存数据:

NOTEXIST (-3998) - 数据不存在
EXPIRED (-3988) - 数据已过期

Prefix接口相关

不要在同一个pkey下存放过多skey

一个pkey下skey个数建议小于1000,在同一个pkey下存放过多的skey可能会导致性能问题。同一个pkey下的所有skey数据在物理上都存放在同一个机器上,当skey数量过多时,到同一台机器的请求也会增多。如果存在一个pkey是热点key, 则热点流量会集中到一台机器上,且无法通过扩容均衡压力。一种极端的错误使用情况是,整个数据空间只有一个pkey, 所有数据都作为skey,这个情况下整个集群的全部流量都集中在集群中的一台机器上,造成整个集群的性能降低为只相当于单机的性能。为了避免这些情况,不要在pkey下存放过多skey, 并且在整个数据空间中需要存在足够数量的pkey,以将流量均衡到集群中的各台机器上。

batchPrefixGetMulti接口使用注意

该接口没有部分返回机制和重试机制,容易受网络问题、热点问题等影响而出现少量超时,减少每个包中的pkey个数可以缓解

优先使用prefixGet,而不是getRange

prefixGet比getRange拥有更好的性能。prefixGet会优先从内存缓存中获取数据,而getRange只能通过磁盘扫描来获取数据。

注意传入getRange接口的参数

传入getRange接口的参数,对于getRange接口的性能,以及对集群造成的压力都有很重要的影响,因此传入正确的参数非常重要。

尽量设置skey的范围,即skey_start和skey_end
offset不宜较大,可以通过设置skey_start,而避免设置offset为较大的数值

可能需要多次调用getRange来获取全部数据

getRange接口最多返回1M的数据。如果pkey下面skey的value较大,全部数据大小超过了1M,getRange只会返回1M的数据,同时返回码为HAS_MORE_DATA。
getRange接口有三个较重要的返回码:

OK (0) - 表示参数中要求的所有数据都已正确获取
HAS_MORE_DATA (150) - 只获取了参数中要求的部分数据,需要再次调用来获取剩余数据。需要注意的是,再次调用时需要调用者调整调用参数。
NOTEXIST (-3998) - 参数中要求的数据不存在

因此,当getRange接口返回HAS_MORE_DATA时,则需要调用者根据已经获取到的数据,调整调用参数,继续调用getRange来获取剩余的数据,直到getRange返回OK或者NOT_EXIST。

作者:高广超
链接:https://www.jianshu.com/p/6417083301c2
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值