来自:冰河技术

写在前面

随着我们的系统负载越来越高,系统的性能就会有所下降,此时,我们可以很自然地想到使用缓存来解决数据读写性能低下的问题。但是,立志成为资深架构师的你,是否能够在高并发环境下合理并且高效的构建应用级缓存呢?

缓存命中率

缓存命中率是从缓存中读取数据的次数与总读取次数的比率,命中率越高越好。缓存命中率=从缓存中读取次数 / (总读取次数 (从缓存中读取次数 + 从慢速设备上读取次数))。这是一个非常重要的监控指标,如果做缓存,则应通过监控这个指标来看缓存是否工作良好。

缓存回收策略

1.基于空间

基于空间指缓存设置了存储空间,如设置为10MB,当达到存储空间上限时,按照一定的策略移除数据。

2.基于容量

基于容量指缓存设置了最大大小,当缓存的条目超过最大大小时,按照一定的策略移除旧数据。

3.基于时间

TTL(Time To Live):存活期,即缓存数据从创建开始直到到期的一个时间段(不管在这个时间段内有没有被访问,缓存数据都将过期)。
TTI(Time To Idle):空闲期,即缓存数据多久没被访问后移除缓存的时间。

4.基于对象引用

软引用:如果一个对象是软引用,则当JVM堆内存不足时,垃圾回收器可以回收这些对象。软引用适合用来做缓存,从而当JVM堆内存不足时,可以回收这些对象腾出一些空间供强引用对象使用,从而避免OOM。
弱引用:当垃圾回收器回收内存时,如果发现弱引用,则将它立即回收。相对于软引用,弱引用有更短的生命周期。

注意:只有在没有其他强引用对象引用弱引用/软引用对象时,垃圾回收时才回收该引用。即如果有一个对象(不是弱引用/软引用对象)引用了弱引用/软引用对象,那么垃圾回收时不会回收该弱引用/软引用对象。

5.回收算法

使用基于空间和基于容量的缓存会使用一定的策略移除旧数据,常见的如下。

  • FIFO(First In First Out):先进先出算法,即先放入缓存的先被移除。

  • LRU(Least Recently Used):最近最少使用算法,时间时间距离现在最久的那个被移除。

  • LFU(Least Frequently Used):最不常用算法,一定时间段内使用次数(频率)最少的那个被移除。

实际应用中基于LRU的缓存居多。

缓存类型

堆内存: 使用Java堆内存来存储对象。使用堆缓存的好处是没有序列化/反序列化,是最快的缓存。缺点也很明显,当缓存的数据量很大时,GC(垃圾回收)暂停时间会变长,存储容量受限于堆空间大小。一般通过软引用/弱引用来存储缓存对象。即当堆内存不足时,可以强制回收这部分内存释放堆内存空间。一般使用堆缓存存储较热的数据。可以使用Guava Cache、Ehcache 3.x、 MapDB实现。

堆外内存: 即缓存数据存储在堆外内存,可以减少GC暂停时间(堆对象转移到堆外,GC扫描和移动的对象变少了),可以支持更多的缓存空间(只受机器内存大小限制,不受堆空间的影响)。但是,读取数据时需要序列化/反序列化。因此,会比堆缓存慢很多。可以使用Ehcache 3.x、 MapDB实现。

磁盘缓存: 即缓存数据存储在磁盘上,在JVM重启时数据还存在,而堆/堆外缓存数据会丢失,需要重新加载。可以使用Ehcache 3.x、MapDB实现。

分布式缓存: 分布式缓存可以使用ehcache-clustered(配合Terracotta server)实现Java进程间分布式缓存。也可以使用Memcached、Redis实现。

缓存模式

单机模式: 存储最热的数据到堆缓存,相对热的数据到堆外缓存,不热的数据到磁盘缓存。

集群模式: 存储最热的数据到堆缓存,相对热的数据到对外缓存,全量数据到分布式缓存。

写在最后

最后,附上并发编程需要掌握的核心技能知识图,祝大家在学习并发编程时,少走弯路。

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

【高并发】在高并发环境下该如何构建应用级缓存?相关推荐

  1. 在高并发环境下该如何构建应用级缓存

    摘要:立志成为资深架构师的你,是否能够在高并发环境下合理并且高效的构建应用级缓存呢? 本文分享自华为云社区<[高并发]在高并发环境下该如何构建应用级缓存?>,作者:冰 河. 随着我们的系统 ...

  2. ros构建机器人运动学模型_ROS环境下机器人仿真模型构建方法研究.doc

    ROS环境下机器人仿真模型构建方法研究 ROS环境下机器人仿真模型构建方法研究 摘 要: 在众多的机器人仿真平台中,ROS可以封装机器人硬件.提出在ROS环境下构建机器人的仿真模型方法.设计了机器人仿 ...

  3. docker xware下载慢_win7环境下Docker快速构建及阿里云容器加速配置

    上篇Docker中提到的是MAC系统中的构建,本篇会简单介绍win7中Docker的构建和加速. Docker 官网 下载之前的步骤本文中不再重提,直接去Docker官网中下载win7版本进行安装,安 ...

  4. linux环境下conda更改pkg和env缓存路径

    今天在用户目录下($ cd ~)使用du -h -x --max-depth=1看了一下,miniconda内存占用高达99%- 一般来说conda虚拟环境下载的包和环境都是放在用户目录下的,如:/h ...

  5. spock做post请求get请求,在springboot环境下使用gradle构建工具的demo,IDEA的开发工具

    1.创建一个springboot项目,基于gradle的创建 1)new一个project 2)选择spring initializr 3)选择gradle project,然后next 4)选择一个 ...

  6. java 并发 set_高并发下的Java数据结构(List、Set、Map、Queue)

    1.并发List Vector 或者 CopyOnWriteArrayList 是两个线程安全的List实现,ArrayList 不是线程安全的.因此,应该尽量避免在多线程环境中使用ArrayList ...

  7. 【Java并发编程】并发编程大合集

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容 ...

  8. 【基于唯品会MP平台】集群环境下session共享技术方案及分布式单点登录

    背景 传统的B/S架构的系统中,一般为单点部署,并不存在集群,所以也不存在session丢失的问题.那么,由于单点部署一旦宕机,无法保证系统可用性,那我们就想到把它扩展为多台服务器部署,这样既保证了系 ...

  9. [转]在.NET环境中实现每日构建(Daily Build)--NAnt篇

    本文转自:http://dragon.cnblogs.com/archive/2005/07/29/203189.html   前言 关于每日构建这个话题,也已经有很多很好的文章讨论了.本文的写作过程 ...

最新文章

  1. python【数据结构与算法】一维前缀和与差分
  2. 安卓工程版本控制哪些文件可以忽略
  3. VC/MFC 键盘钩子,代码片断
  4. java中复制图片_如何在Java中实现复制图片
  5. php取整数余数,js取整数、取余数的方法
  6. ionic2+启动白屏问题-------之补充解决之道
  7. App云端打包失败常见问题汇总
  8. 第二季-专题2-我从内部看ARM
  9. 如何让jpa 持久化时不校验指定字段
  10. 图片|视频|音频文件扩展名(后缀)
  11. 超赞的8款开源聊天软件
  12. 高性能流媒体服务器--mediasoup框架整理
  13. 2022年湖南省基金从业资格(私募股权投资基金基础知识)练习题及答案
  14. (P45)面向对象版表达式计算器:Storage类实现
  15. 喜羊羊与灰太狼java_java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程...
  16. win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少
  17. Java 8 Stream 总结
  18. 阿里巴巴2014校园招聘算法题
  19. 重走Android路 之 Android系统架构图以及开发工具了解
  20. PS打开RAW图并查看像素点灰度值大小

热门文章

  1. BZOJ 2140 稳定婚姻(强联通分量判环)【BZOJ修复工程】
  2. UVA10652 Board Wrapping(求凸包、计算凸多边形面积)
  3. MySQL-source报错1064
  4. oracle urlencode 中文,Python2和Python3中urllib库中urlencode的使用注意事项
  5. 苹果地图副总裁_也许,苹果汽车的到来只是早晚问题
  6. python量化外汇交易_用Python实现一个Dual Thrust数字货币量化交易策略
  7. controller接收json数据_答疑 | 前后端分离,如何接收json数据?
  8. C++成员变量指针和成员函数指针【The semantics of funcitons】
  9. Unreal Engine* 4.19 的 CPU 功能检测
  10. 005-OSI七层模型IP地址