高并发利器缓存之应用级缓存

Posted 易点墨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发利器缓存之应用级缓存相关的知识,希望对你有一定的参考价值。

缓存,从我的角度理解是让数据更接近于使用者,目的是让访问速度更快;一般的工作机制是先从缓存中读取数据,如果缓存中不存在,则再从那些慢速设备上读取并同步到缓存;举个例子,我们的买点脑的时候销售员都会向我们推销:这台电脑是三级缓存的用起来更快;为什么呢?当我们不了解的时候;肯定会想3级肯定比二级强;其实原理在于CPU读取数据的顺序CPU->L1/L2/L3->内存->磁盘;CPU和磁盘io的匹配速度相差很悬殊;所以把一些必要热点的数据;进行缓存;当CPU读取需要数据时;从缓存中可以快速获取;所以给人的直观感觉速度非常快。

如果我们做缓存,那么一个重要的监控指标就是缓存命中率;缓存命中率=缓存中读取次数/(总读取次数(缓存读取次数+慢速设备上读取次数));当然结果是命中率越高越好。

以下我们以Java缓存为示例:

Java缓存类型:

  1. 堆缓存, Java堆内存来存储缓存对象,好处:没有序列化反序列化,是最快的缓存;缺点:由于受堆内存空间大小限制,当缓存数据量很大时,GC时间会变长,一般通过弱引用/软引用来存储缓存对象,内存不足时可强制回收;一般都是用来存储比较热的数据;

  2. 堆外缓存,即数据存储在堆外内存;只受机器内存大小限制,但读取需要序列化/反序列化,相比堆缓存慢很多。

  3. 磁盘缓存,缓存的数据存储在磁盘;

  4. 分布式缓存:在多jvm实例下以上缓存会存在很多问题, 比如1 单机容量问题;2.数据一致性的问题, 3.缓存不命中,回源实例访问量变多的问题等;可以使用ehcache-clustered(配合Terracotta server)实现Java进程间的分布式缓存;或用redis实现分布式缓存

两种模式:

  1. 单机时,堆缓存->堆外缓存-磁盘缓存(热-相对热-不热)

  2. 集群时,堆缓存->堆外缓存->分布式缓存(热-相对热-全量数据)


实践应用中的常见工具:

Guava Cache只提供堆缓存;

Ehcache 3.x 堆缓存,堆外缓存、磁盘缓存、分布式缓存;

MapDB是一款嵌入式的Java数据库引擎和集合框架,支持堆缓存,堆外缓存、磁盘缓存。

当我们涉及到业务数据时,如商品类目,店铺。商品基本信息都可以进行适当的本地缓存以提升性能;或使用分布式缓存。

  1.  本地缓存初始化,本地缓存的过期时间使用分布式缓存过期时间的一半,防止本地缓存时间太长造成多实例间的数据不一致。

  2. 写缓存, 先写本地缓存,如果需要写分布式缓存,则通过异步更新分布式缓存;

  3. 读缓存,先读本地缓存,本地缓存不命中再批量查询分布式缓存,注意查询性能

欢迎交流学习,共同进步! 


以上是关于高并发利器缓存之应用级缓存的主要内容,如果未能解决你的问题,请参考以下文章

高并发优化之页面缓存与URL缓存

高并发系统之限流特技

亿级流量电商详情页系统的大型高并发与高可用缓存架构实战

聊聊高并发系统之限流特技-1 开涛

大流量 高并发系统之限流特技

《亿级流量网站架构核心技术》---高并发