高并发利器缓存之应用级缓存
Posted 易点墨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高并发利器缓存之应用级缓存相关的知识,希望对你有一定的参考价值。
缓存,从我的角度理解是让数据更接近于使用者,目的是让访问速度更快;一般的工作机制是先从缓存中读取数据,如果缓存中不存在,则再从那些慢速设备上读取并同步到缓存;举个例子,我们的买点脑的时候销售员都会向我们推销:这台电脑是三级缓存的用起来更快;为什么呢?当我们不了解的时候;肯定会想3级肯定比二级强;其实原理在于CPU读取数据的顺序CPU->L1/L2/L3->内存->磁盘;CPU和磁盘io的匹配速度相差很悬殊;所以把一些必要热点的数据;进行缓存;当CPU读取需要数据时;从缓存中可以快速获取;所以给人的直观感觉速度非常快。
如果我们做缓存,那么一个重要的监控指标就是缓存命中率;缓存命中率=缓存中读取次数/(总读取次数(缓存读取次数+慢速设备上读取次数));当然结果是命中率越高越好。
以下我们以Java缓存为示例:
Java缓存类型:
堆缓存, Java堆内存来存储缓存对象,好处:没有序列化反序列化,是最快的缓存;缺点:由于受堆内存空间大小限制,当缓存数据量很大时,GC时间会变长,一般通过弱引用/软引用来存储缓存对象,内存不足时可强制回收;一般都是用来存储比较热的数据;
堆外缓存,即数据存储在堆外内存;只受机器内存大小限制,但读取需要序列化/反序列化,相比堆缓存慢很多。
磁盘缓存,缓存的数据存储在磁盘;
分布式缓存:在多jvm实例下以上缓存会存在很多问题, 比如1 单机容量问题;2.数据一致性的问题, 3.缓存不命中,回源实例访问量变多的问题等;可以使用ehcache-clustered(配合Terracotta server)实现Java进程间的分布式缓存;或用redis实现分布式缓存
两种模式:
单机时,堆缓存->堆外缓存-磁盘缓存(热-相对热-不热)
集群时,堆缓存->堆外缓存->分布式缓存(热-相对热-全量数据)
实践应用中的常见工具:
Guava Cache只提供堆缓存;
Ehcache 3.x 堆缓存,堆外缓存、磁盘缓存、分布式缓存;
MapDB是一款嵌入式的Java数据库引擎和集合框架,支持堆缓存,堆外缓存、磁盘缓存。
当我们涉及到业务数据时,如商品类目,店铺。商品基本信息都可以进行适当的本地缓存以提升性能;或使用分布式缓存。
本地缓存初始化,本地缓存的过期时间使用分布式缓存过期时间的一半,防止本地缓存时间太长造成多实例间的数据不一致。
写缓存, 先写本地缓存,如果需要写分布式缓存,则通过异步更新分布式缓存;
读缓存,先读本地缓存,本地缓存不命中再批量查询分布式缓存,注意查询性能
欢迎交流学习,共同进步!
以上是关于高并发利器缓存之应用级缓存的主要内容,如果未能解决你的问题,请参考以下文章