搜公众号
推荐 原创 视频 Java开发 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库
Lambda在线 > 易点墨 > 高并发利器缓存之应用级缓存

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

易点墨 2019-02-13
举报

缓存,从我的角度理解是让数据更接近于使用者,目的是让访问速度更快;一般的工作机制是先从缓存中读取数据,如果缓存中不存在,则再从那些慢速设备上读取并同步到缓存;举个例子,我们的买点脑的时候销售员都会向我们推销:这台电脑是三级缓存的用起来更快;为什么呢?当我们不了解的时候;肯定会想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. 读缓存,先读本地缓存,本地缓存不命中再批量查询分布式缓存,注意查询性能

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


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《高并发利器缓存之应用级缓存》的版权归原作者「易点墨」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注易点墨微信公众号

易点墨微信公众号:yuanshu_master

易点墨

手机扫描上方二维码即可关注易点墨微信公众号

易点墨最新文章

精品公众号随机推荐

举报