云捕Redis实战
本文由作者余宝虹授权网易云社区发布。
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重试的逻辑要简单,另一方面当出现网络问题的时候重试有可能反而会加剧这种情况。
更多网易技术、产品、运营经验分享请访问网易云社区。
相关文章:
【推荐】 利用jstack定位典型性能问题实例
云捕Redis实战的更多相关文章
- Redis实战阅读笔记——开始
Redis实战这本书,看完以后最大的不是redis本身的东西,而是作者面对实际问题的分析而给出的设计方案,可以看成NoSql设计的应用.个人从这方面收获很多,至于Redis本身的东西,这个就花一两个小 ...
- Redis实战阅读笔记——第一章
Redis 实战 中文版 的20-21页看的人郁闷死了,最后看英文版才明白意思,哎,我理解能力差成这样了 其中,图 1-12 有错误,草,这个是英文版的错--应该是group:programming
- redis实战(01)_redis安装
早就想对redis进行实战操作了,最近看了一些视频和参考书籍,总结总结一下,redis实战内容: 实战前先对redis做一个大概的认识: 现在开始安装redis了... redis的安装下载地址 ht ...
- C# Redis实战(二) [转]
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 ...
- (转)国内外三个不同领域巨头分享的Redis实战经验及使用场景
随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...
- C# Redis实战
转自 :http://blog.csdn.net/qiujialongjjj/article/details/16945569 一.初步准备 Redis 是一个开源的使用ANSI C 语言编写.支持 ...
- Redis实战
大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...
- Redis实战之Redis + Jedis
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...
- Redis实战之征服 Redis + Jedis + Spring (一)
Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...
随机推荐
- 39. Combination Sum + 40. Combination Sum II + 216. Combination Sum III + 377. Combination Sum IV
▶ 给定一个数组 和一个目标值.从该数组中选出若干项(项数不定),使他们的和等于目标值. ▶ 36. 数组元素无重复 ● 代码,初版,19 ms .从底向上的动态规划,但是转移方程比较智障(将待求数分 ...
- WebLogic Server StuckThreadMaxTime value is exceeded during configuration
WebLogic Server StuckThreadMaxTime value is exceeded during configuration If you are configuring Web ...
- Air File.load加载问题
不要用File.load同时加载多个文件,有时会引起程序崩溃. 在需要同时加载多个文件时,要一个一个排队加载,等到上一个加载完成再加载下一个. 也可以设定一个static的File,加载前先File. ...
- java.io.FileNotFoundException(系统找不到指定的路径。)
报错:java.io.FileNotFoundException(系统找不到指定的路径.) 解决方法: 1.检查文件路径是否正确 2.另外,使用OutputStream时,如果文件不存在,会自动创建文 ...
- 通过@Configuratin配置Bean
Spring的依赖注入可以基于xml配置,也可以基于注解配置,还可以基于java类配置. 普通的bean类,只要标注了@Configuration注解,就可以为Spring容器提供Bean定义的信息. ...
- C++中public、protected以及private的使用
相比C语言,C++中通过class/struct来定义既包含数据,又包含行为的结构,从而支持了“对象”.现实世界中,一个人(一个对象)通常 拥有一些资产(数据),并且掌握某些技能(行为),并且这些资产 ...
- 滑动窗口的最大值 · sliding-window-maximum
[抄题]: Given an array nums, there is a sliding window of size k which is moving from the very left of ...
- udp调优经验
降低丢包率: 1. 增大输入输出缓冲区 2. 调用发送接口时增大单次发送的buffer大小 8k 3. 多个socket 多线程接收 4 发送端流量控制,并且保证发送速率均匀 降低时延: 减小包大小? ...
- 一个合约访问另一个合约中的mapping
参考链接:https://ethereum.stackexchange.com/questions/13616/accessing-a-public-mapping-within-a-contract ...
- import c++ project to eclipse cdt with exiting makefile
Step 2: You are now ready to build your project. To build your project, select Project > Build Pr ...