美文网首页
关系服务redis层代码级别优化失败

关系服务redis层代码级别优化失败

作者: 一品悟技术_张驰 | 来源:发表于2016-11-21 20:52 被阅读25次

场景:

关系服务,负责维护用户的关注关系,粉丝关系,如微博中的关注关系,其中使用redis HASH结构维护用户的粉丝关系

结构如图下:

问题:

对于业务场景需要查询A,B,C,D是否为E的粉丝,HASH结构效率最高。现实中遇到的问题是,对于大V用户有千万粉丝时,缓存失效后load操作

时间太长,通过后台日志,一个20w粉丝的主播,loadDB数据至缓存需要1s以上,要知道,这期间,redis可是不响应任何其他请求的。

优化:

redis层优化

首先先浏览了一下redis的源码,解压包后,查看src目录下的t_hash.c

hmset操作,则是我调用的方法,查看可知,内部是循环调用hashTypeSet,将应用端传进去的批量key-value逐个添加,

除此之外,系统会对目前hash结构引用的type类型进行判定,来选择合适的编码规则,redis hash有两种编码,ziplist,

hash_table,当存入key-value字节长度少于64,并且hash内size少于512时,redis会使用ziplist存储,反之会使用hash_table

做存储。

其中

hashTypeTryConversion方法校验key-value是否过长,

hashTypeSet插入key-value时,会检测容器容量,当容量大于hash_max_ziplist_entries时,

会做类型转换操作。默认的配置为:

hash容量扩充,与rehash,由代码可知,当初始容量为0时,会取系统配置

DICT_HT_INITIAL_SIZE做初始化,当容量满了时,会取当前已用容量2倍来做初始化。

dictExpand做扩容操作,dict结构体维护着两个table 一个代表扩容前,一个代表扩容后,扩容时

扩容后的table则为ht[1].

笔者通过修改hash扩容时的配置,使得不是使得当前容量2倍进行扩容,而是直接每次扩容增加20w,这样的话,笔者的30w粉丝数,大约进行两次扩容即可。比之前由4开始的初始容量进行扩容会减少7次左右的扩容操作。

不过还是无法解决问题,redis基于内存级的扩容没有我们想象中那么慢,至少修改后,对于30w的量只有数十毫秒级的优化,对于秒级的时间总量,这点优化远远不够。所以笔者放弃了此种方法。

相关文章

  • 关系服务redis层代码级别优化失败

    场景: 关系服务,负责维护用户的关注关系,粉丝关系,如微博中的关注关系,其中使用redis HASH结构维护用户的...

  • redis服务器

    这一次主要讲下redis中服务器这个结构体相关代码,主要从是代码层面进行讲解 redis服务器 redis服务器结...

  • DAO层代码优化

    DAO层代码重复的很多,可以使用模板方法进行优化 1. 首先再目录下再定义一个包common 2. 再在报下新建接...

  • Spring Data Redis备忘录

    Spring Data Redis提供在Spring应用中配置和访问Redis服务器的功能。为数据交互提供了低级别...

  • redis 持久化性能对比

    机器环境:redis服务器,6c16G的普通pc,cpu是i5 8400。redis服务本身没有做特别优化,版本为...

  • redis网络源码

    阅读redis代码,就必须试图搞清楚redis的主流程,我们必须用剥洋葱的方法来了解整个代码。redis是个服务器...

  • Java代码层优化GC

    也是最近,很多服务遇到了gc问题,影响服务的可用性,虽然知道大致的减少对象的创建等,但没有一个较为系统的认知,这里...

  • Kafka服务端原理学习

    目录 网络层服务端顺序性保证 API层 日志存储层 副本机制 实际使用 性能优化 kafka学习 网络层 服务端顺...

  • 客户端无法登录Redis服务器报错,解除保护模式

    以下是Java代码: 在执行Java操作redis的代码的时候抛出异常: 解决方案: 1、修改redis服务器的配...

  • ServiceStack.Redis连接阿里云redis服务的问

    ServiceStack.Redis连接阿里云redis服务的问题 下面的C#代码可以正常连接: _cache =...

网友评论

      本文标题:关系服务redis层代码级别优化失败

      本文链接:https://www.haomeiwen.com/subject/umwupttx.html