java中缓存分类总结

在平时的开发中会经常用到缓存,比如locache、redis等,但一直没有对缓存有过比较全面的总结。下面从什么是缓存、为什么使用缓存、缓存的分类以及对每种缓存的使用分别进行分析,从而对缓存有更深入的了解。

1.什么是缓存

在使用缓存前我们应该了解什么是缓存,下面是维基百科上面对于缓存的定义:

缓存是在计算机上的一个原始数据的复制集,以便于访问

缓存在计算机系统中被广泛应用,从缓存的定义来看,缓存是计算机上的原始数据的复制集,因此对于缓存的使用与应用场景密切相关,在不同的场景上会有不同的意义。

2.为什么使用缓存

首先对于互联网应用来说,用户体验是非常重要的,而使用缓存的目的是想通过提高服务的性能从而提高应用的用户体验。

而系统性能的指标一般包括:响应时间、延迟时间、吞吐量、并发用户数量和资源利用率等几个方面。

吞吐量:系统在单位时间内处理的请求的数量

3.缓存的分类

对于java程序开发者来说,根据缓存在软件系统中所处的位置的不同,缓存大体可以分为三类:

  1. 客户端缓存
  2. 服务端缓存
  3. 网络中缓存

下面主要针对客户端缓存和网络中缓存简单说明,并对服务端缓存做详细说明

3.1客户端缓存

对于BS架构的互联网应用来说客户端缓存主要分为页面缓存和浏览器缓存两种,对于APP而言主要是自身所使用的缓存。

3.2网络中缓存

网络中的缓存主要是指代理服务器对客户端请求数据的缓存,主要分为WEB代理缓存和边缘缓存(CDN边缘缓存)

3.3服务端缓存

对于服务端缓存而言,从系统的架构上面区分可以将缓存分为

  1. 服务器本读缓存(localCache)
  2. 分布式缓存(Redis、Memcached等nosql)
  3. 数据库缓存
3.3.1 服务器本地缓存

本地缓存是一级缓存,位于服务本机的内存中,在操作本地缓存的时候不需要网络IO不需要文件IO,直接从本机内存中读取数据,因此读写速度最快。

本地缓存存在的问题:

  1. 本读缓存数据直接保存在JVM中,需要考虑缓存数据的大小、JVM的垃圾回收性能消耗
  2. 单服务是集群部署的时候,应该考虑是否需要做集群中本地缓存的数据同步

在实际的开发中可以自己实现简单的本地缓存也可以使用开源的本地缓存框架,比如:ehcache、JBoss Cache等

3.3.2分布式缓存

当本地缓存被穿透的时候就会去查询分布式缓存,当在分布式缓存中查询到数据的时候,直接将查询结果放到本地缓存中。 对于分布式缓存主要是使用NoSQL数据库来实现,常用的NoSQL数据库有Redis、Memcached、MongoDB等。目前比较流行的Redis来说,支持Slava/Master模式和Cluster

3.3.3缓存中的几个常用术语
1.缓存命中:当客户端请求的数据在缓存中,这个缓存中的数据就会被使用,这一行为被称为缓存命中
2.没有命中:缓存中没有查询到数据,并且数据库中可以查到此数据,并将数据放到缓存中
3.缓存穿透:是指查询一个缓存中一定不存在的数据。即缓存中不存在,并且数据库中也不存在,并且在数据库中没有查询到数据的情况下,不会去写缓存,这样就导致每次对于此数据的查询都会去查询数据库,这样就导致缓存失去了意义。对于如何解决缓存穿透问题,后面会具体分析。
4.存储成本:缓存没有命中的时候,从其他数据源取出数据并放到缓存中的时间成本和空间成本就是存储成本。
5.缓存失效:当缓存中的数据已经更新时,则此数据已经失效
6.替代策略:当缓存没有命中的时,并且缓存容量已满,就需要在缓存中去除一条旧数据,然后加入一条新数据,而应该去除哪些数据,就由替代策略来决定。
常用的替代策略有:LRU、LFU等。在使用缓存算法的时候,通常会考虑使用频率、获取成本、缓存容量和时间等因素。
8.缓存雪崩
3.3.4使用云服务提供的缓存服务

国内的阿里云扽提供商提供Redis的云服务器,这些服务有以下特点:

1.动态扩容:通过后台配置升级Redis存储空间
2.数据多备,数据存储在一主一备中
3.自动容灾:主机宕机后系统自动检测,并切换到备机上,实现了服务的高可用
3.3.5数据库缓存

数据库在设计的时候也有缓存操作,更改相关参数开启查询缓存

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏彭湖湾的编程世界

【npm】利用npm安装/删除/发布/更新/撤销发布包

什么是npmnpm是javascript的包管理工具,是前端模块化下的一个标志性产物 简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率 1.从社...

61080
来自专栏Laoqi's Linux运维专列

自动化监控Zabbix之主机自动发现

22030
来自专栏酷玩时刻

H5仿微信支付键盘

视频地址:https://github.com/Javen205/IJPay-Demo/blob/master/doc/pay_keyboard.m4v

15020
来自专栏后端技术探索

分布式系统一致性问题解决实战

商户提交表单数据至旺铺(deco项目,以下皆称为deco),deco需要接入poi系统进行装修内容的人工审核,详细流程见下图。

14420
来自专栏沉思录

重新理解IO模型

本文试图理清楚几种IO模型的根本性区别,同时分析了为什么在Linux网络编程中最好要用非阻塞式IO?

62370
来自专栏数据和云

故障诊断 | 存储Cache丢失导致数据库无法open的案例分享

当存储Cache由于丢失时,我们应该如何处理,让数据库重新能够open起来呢?让我们听听,云和恩墨 ACE 李真旭分享的这篇案例。 发现问题 最近某客户的一套核...

35380
来自专栏老安的博客

docker 容积硬盘扩容小坑一个

14330
来自专栏JavaEdge

应用服务器集群的Session管理1 Session 复制2 Session绑定(黏滞sticky)3 利用Cookie 记录Session4 Session服务器

37760
来自专栏北京马哥教育

【Django新人必看】Django安装及搭建开发环境实战细解

开笔有话说 接触django有一段时间了,发现国内网站上的django学习资料,虽然有不少,但大多有老旧的通病,所基于的版本简直是太旧了,就拿《the djan...

459120
来自专栏java沉淀

provisional headers are shown 原因分析

54960

扫码关注云+社区

领取腾讯云代金券