系统优化总结(2)----构建两级缓存

经过不断的性能优化,现在的系统已经可以承受千万级别的日访问量,其响应速度和吞吐量都有了明显的提升,其中缓存发挥了重大作用。结合业务需要,目前系统已构建起了两级缓存:分布式缓存Redis和本地缓存Ehcache.下面谈谈缓存应用的一些体会。

一、分布式缓存Redis

1.充分应用redis提供的数据结构
同是缓存,Redis相比memcache一个很大的优势就是其丰富的数据结构为一些应用功能的开发和优化提供了极大的便利,比如在我们的系统中,用户每日总分、文章浏览量的等统计使用的都是redis计数器(其底层数据结构是String),避免了计数操作与数据库的频繁互动,有效减轻了数据库的压力。还有使用bitmap来统计活跃用户也是方便快捷,代码量大大减少等等。
曾在网上看到这样一句话:限制Redis用途的只会是你自己的想象力,一语中的,redis不仅仅是key-value。多研究一下redis的数据结构和应用场景对开发实在是大有裨益!

2.不要使用太长的key
这一点主要目的是节约内存。常见的一种场景是key命名缺乏统一规范,为了避免冲突,每个开发者各行其是,命名普遍很长,会消耗大量内存。我们的解决方案是为key进行唯一性编码,所有的开发者遵守一套简单的命名规范就可以实现key的长度大大减少。

3.尽量使用Hash
有两个好处:一是减少key的数量,二是redis的hashmap在成员数量小于一定数值时(具体值可以自己设置)会采用线性紧凑格式存储。可以很好的节约内存的使用

4.禁止遍历缓存
很多人有这样一种错觉:既然从缓存取一条数据挺快,那么遍历一下应该也不会太慢。事实却是慢的超乎你想象,同时还会影响其他redis操作。

5.为每个key设置过期时间
根据业务要求的不同为每个key设置不同的过期时间有利于及时消除不必要数据的存在,避免“僵尸数据”占用内存,造成浪费。另外具体时间的设置一定要合理,不要太长,明明只需要存活一天却设置为一周,也是不合适的,在我们之前的开发中就发现过没有给key设置过期时间和时间设置不合理的情况。

6.较大的数据先压缩再存储
在我们的系统,文章内容的数据量还是比较大的,如果直接存在redis中必然消耗大量内存,而先进行压缩再存储则可以大大减少文章的数据大小。

7.使用bit位级别操作和byte字节级别操作来减少不必要的内存使用
比如使用bitset来记录签到用户,判断用户今天是否已签到。与使用数据库记录查询相比,性能大有提升。

8.Redis状态监控
通过redis的监控可以实时了解Redis的运行状态,以便于及时了解分析Redis服务器的性能,命中率等运行情况,比如当内存超过一定阀值及时预警机制,就可以避免内存不足造成的OOM问题,提升Redis的高可用。我们这里采用的是zabbix可视化监控。

二、本地缓存Ehcache

Redis缓存存取数据的时间大部分消耗在了网络开销上,而使用本地缓存,则可以避免网络开销。实际应用发现同样大小的数据,本地缓存Ehcache的存取速度远胜Redis。系统中诸如文章、黑名单等相对稳定数据都使用了ehchache,性能提升明显。

你可能感兴趣的:(系统优化总结(2)----构建两级缓存)