资讯专栏INFORMATION COLUMN

云捕Redis实战

pkhope / 2481人阅读

摘要:在这里列举下面几个问题大问题云捕中每天,每小时崩溃数,启动数的统计是通过实时统计,将计算结果存到中实现去重,然后定期将中的数据汇总持久化到数据库中。

本文由作者余宝虹授权网易云社区发布。

Redis是一个支持丰富数据结构的分布式key-value系统,Redis在云捕系统的地位相当重要,碰到的问题也比较多,最近才解决了一个遗留的老大难问题。由于15年的时候才接触到Redis,使用过程中姿势存在比较大的问题。在这里列举下面几个问题:

大Set问题
云捕中每天,每小时崩溃数,启动数的统计是通过Storm实时统计,将计算结果存到Redis中实现去重,然后定期将Redis中的数据汇总持久化到数据库中。

最初的实现方式是每个产品的崩溃,启动数都使用一个set来实现统计,set中存储的是设备ID。随着数据量的增加,这个set会变得非常大,会达到单机内存的极限,无法分散到多个节点,不利于扩容,最初云捕使用的物理机内存是32GB,经常会收到内存使用率的报警。分析大对象可以使用 --bigkeys 命令,NCR不支持。

当内存使用量到达maxmemory之后就会执行响应的缓存替换策略,默认是allkey-lru,所以当用于统计数据的set被删除后,就会出现崩溃数从0开始 统计的情况,出现统计数据丢失的问题。

改造前效果:

为了使用NCR的扩容能力,就需要消除掉对大Set的依赖,改造后,采用的方法是:对每个设备ID生成一个key,计数增加之前会判断对应的设备ID key是否存在。采用这种方式后就会出现大量的key,所以在key的命名上也应该尽量简短。

protected void add(Jedis jedis, String key, String deviceId, long expireTime) {

expireTime /= 1000;
String value ="";
String member=key+":"+deviceId;    if (jedis.setnx(member, value) == 1) {
    jedis.incr(key);
  }
jedis.expireAt(member, expireTime);
jedis.expireAt(key, expireTime);

}
改造后效果:

CPU抖动
云捕存储在Redis中的统计数据具有时效性,每天的凌晨会将前一天的数据持久化到数据库,所以前一天的key都可以删掉。问题是如果大量的key都突发在同一时间失效的话,就会导致CPU使用率剧增,而且大Set删除时耗时更长,所以改进后key的失效时间采用随机化,分批的方式。

具体可以见DBA同学的文章 redis cpu 抖动问题分析 ,redis-faina redis性能问题诊断利器

应用自检
产品的崩溃数每天都是波动的,不利于发现系统的问题,所以云捕开启了一个定时发送崩溃数据的任务,每小时发送1000条,然后通过观察这个App的数据统计就可以感知到整个系统是否稳定。

重复写
将Redis中的数据持久化到数据库的过程中可能会出现网络波动,写入失败的情况,为了保证写成功,云捕中采用每小时重复写4次的策略,一方面重复写数据库比读取Redis重试的逻辑要简单,另一方面当出现网络问题的时候重试有可能反而会加剧这种情况。

更多网易技术、产品、运营经验分享请访问网易云社区。

文章来源: 网易云社区

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25349.html

相关文章

  • 网易云捕性能踩坑解决之道上篇

    摘要:从零开始设计开发一个日处理数据亿的大数据高并发实时系统,哪些性能问题需要特别注意这里我们一起梳理一下本文中我将以,同学戏称的系统网易云捕设计开发实践中两年的时间里碰到的真实问题,踩过的坑及解决问题的方法和大家一起讨论如何解决这些问题。 本文由作者余宝虹授权网易云社区发布。 从零开始设计开发一个日处理数据8亿的大数据高并发实时系统,哪些性能问题需要特别注意?这里我们一起梳理一下,本文中我...

    李义 评论0 收藏0
  • Redis常见7种使用场景(PHP实战)

    摘要:是一个开源的使用语言编写支持网络可基于内存亦可持久化的日志型数据库,并提供多种语言的。本篇文章,主要介绍利用使用,主要的应用场景。场景如果项目中使用了缓存且对缓存设置了超时时间。如果连接断开,监视和事务都会被自动清除。 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 本篇文章,主要介绍利用PHP...

    邹强 评论0 收藏0
  • Redis常见7种使用场景(PHP实战)

    摘要:是一个开源的使用语言编写支持网络可基于内存亦可持久化的日志型数据库,并提供多种语言的。本篇文章,主要介绍利用使用,主要的应用场景。场景如果项目中使用了缓存且对缓存设置了超时时间。如果连接断开,监视和事务都会被自动清除。 Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 本篇文章,主要介绍利用PHP...

    AlphaWatch 评论0 收藏0
  • Python--Redis实战:第四章:数据安全与性能保障:第1节:持久化选项

    摘要:为了让读者做好使用构建真实软件的准备,本章将展示维护数据安全以及应对系统故障的方法。上一篇文章实战第三章命令第七节其他命令下一篇文章实战第四章数据安全与性能保障第节快照持久化 上一篇文章:Python--Redis实战:第三章:Redis命令:第七节:其他命令下一篇文章:Python--Redis实战:第四章:数据安全与性能保障:第2节:快照持久化 前面的几章介绍了各式各样的Redi...

    derek_334892 评论0 收藏0
  • Python--Redis实战:第四章:数据安全与性能保障:第1节:持久化选项

    摘要:为了让读者做好使用构建真实软件的准备,本章将展示维护数据安全以及应对系统故障的方法。上一篇文章实战第三章命令第七节其他命令下一篇文章实战第四章数据安全与性能保障第节快照持久化 上一篇文章:Python--Redis实战:第三章:Redis命令:第七节:其他命令下一篇文章:Python--Redis实战:第四章:数据安全与性能保障:第2节:快照持久化 前面的几章介绍了各式各样的Redi...

    dantezhao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<