前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >缓存Tair高性能使用规范

缓存Tair高性能使用规范

作者头像
高广超
发布2018-12-12 10:34:19
1.3K0
发布2018-12-12 10:34:19
举报
文章被收录于专栏:互联网技术栈互联网技术栈

2x.png

不要短时间大量重复读写相同的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接口的性能,以及对集群造成的压力都有很重要的影响,因此传入正确的参数非常重要。

  1. 尽量设置skey的范围,即skey_start和skey_end
  2. 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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.01.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 不要短时间大量重复读写相同的key
  • Value大小多大合适
  • 超时时间设置多少合适
  • 超时是否需要重试
  • 批量请求使用注意
    • 批量请求key个数
      • batchGet请求如何提升可用性
      • 复杂数据结构中元素不宜过多
      • 作为缓存使用时,不要在获取数据失败时直接重写缓存数据
      • Prefix接口相关
        • 不要在同一个pkey下存放过多skey
          • batchPrefixGetMulti接口使用注意
            • 优先使用prefixGet,而不是getRange
              • 注意传入getRange接口的参数
                • 可能需要多次调用getRange来获取全部数据
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档