java 三级缓存

🏆今日学习目标:

🍀java 三级缓存
✅创作者:林在闪闪发光
⏰预计时间:30分钟
🎉个人主页:林在闪闪发光的个人主页

 🍁林在闪闪发光的个人社区,欢迎你的加入: 林在闪闪发光的社区

目录

 1 什么是缓存

2.缓存作用

1 高性能情况

                  2 高并发场景 

4.缓存分类

4.1本地缓存

4.2分布式缓存

 4.3多级缓存

 1 什么是缓存

就是把访问量较高的热点数据从传统的关系型数据库中加载到内存中,当用户再次访问热点数据时是从内存中加载,减少了对数据库的访问量,解决了高并发场景下容易造成数据库宕机的问题

2.缓存作用

缓存主要是为了提高数据的读取速度。因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大提高程序的性能。
以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application。其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息。Session则保存对话信息。Application则是保存在整个应用程序范围内的信息,相当于全局变量。通常使用最频繁的是Session,缓存也是有限的,会自动清除之前的旧数据。其中redis的读取速度最快,并且是在内存中进行读取,当内存不够时可以扩大内存,还有就是 .net提供的Cache缓存.

3.为什么要用缓存 

1 高性能情况

  用户第一次访问数据时,缓存中没有数据,要从数据库中获取数据,因为是从磁盘中拿数据,读取数据的过程比较慢。拿到数据后将数据存储在缓存中,用户第二次访问数据时,可以从缓存中直接获取,因为缓存是直接操作内存的,访问数据速度比较快。

Java应用中,尤其是涉及高并发场景时,三级缓存架构的设计与实现是提升系统性能的重要手段。这种架构通常包括本地缓存、分布式缓存和持久化存储,每一层都有其特定的用途和优化目标。 ### 本地缓存(Local Cache) 本地缓存是最接近应用的一层缓存,通常存储在JVM的堆内存中。它的访问速度最快,延迟最低,适用于存储频繁访问且数据量不大的信息。例如,使用`HashMap`或`ConcurrentHashMap`可以实现简单的本地缓存机制。更复杂的实现可能会使用如Caffeine这样的库,它们提供了更丰富的特性,如自动过期、大小限制等。 ```java import com.github.benmanes.caffeine.cache.CacheBuilder; import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.LoadingCache; import java.util.concurrent.TimeUnit; public class LocalCacheExample { private static final LoadingCache<String, String> localCache = CacheBuilder.newBuilder() .maximumSize(100) // 设置最大缓存条目数 .expireAfterWrite(10, TimeUnit.MINUTES) // 设置写入后过期时间 .build(new CacheLoader<String, String>() { @Override public String load(String key) throws Exception { return fetchDataFromDatabase(key); // 模拟从数据库加载数据 } }); private static String fetchDataFromDatabase(String key) { // 模拟数据库查询 return "Data for " + key; } public static void main(String[] args) { String key = "exampleKey"; try { String value = localCache.get(key); System.out.println("Value from cache: " + value); } catch (Exception e) { e.printStackTrace(); } } } ``` ### 分布式缓存(Distributed Cache) 分布式缓存用于解决单机缓存无法共享的问题,适用于多实例部署的场景。常见的实现有Redis、Memcached等。这类缓存可以通过网络访问,虽然延迟比本地缓存高,但能够保证多个节点之间的数据一致性。例如,使用Redis作为分布式缓存: ```java import redis.clients.jedis.Jedis; public class DistributedCacheExample { public static void main(String[] args) { // 连接到Redis服务器 Jedis jedis = new Jedis("localhost", 6379); String key = "distributedKey"; String value = "distributedValue"; // 存储数据到Redis jedis.set(key, value); // 设置过期时间 jedis.expire(key, 60); // 60秒后过期 // 从Redis获取数据 String cachedValue = jedis.get(key); System.out.println("Value from distributed cache: " + cachedValue); // 关闭连接 jedis.close(); } } ``` ### 持久化存储(Persistent Storage) 持久化存储是最后一层缓存,通常指的是数据库或其他持久化介质。这一层主要用于存储那些不经常变化但需要长期保存的数据。当本地缓存和分布式缓存都无法命中时,系统会回退到持久化存储中获取数据。数据库的选择可以根据具体需求来定,比如MySQL、PostgreSQL等关系型数据库,或者MongoDB等非关系型数据库。 ### 三级缓存的工作流程 1. **请求处理**:当客户端发起请求时,首先检查本地缓存是否有数据。 2. **本地缓存命中**:如果本地缓存中有数据,则直接返回结果。 3. **本地缓存未命中**:如果本地缓存中没有数据,则检查分布式缓存。 4. **分布式缓存命中**:如果分布式缓存中有数据,则将数据加载到本地缓存并返回结果。 5. **分布式缓存未命中**:如果分布式缓存中也没有数据,则回退到持久化存储中获取数据,并依次更新分布式缓存和本地缓存。 ### 优势与挑战 - **优势**: - 提升系统性能:通过减少对后端数据库的直接访问,显著降低响应时间。 - 提高可用性:即使在某些节点失效的情况下,其他节点仍可以通过缓存提供服务。 - 支持高并发:分布式缓存能够在多个节点之间分担负载,支持更高的并发请求。 - **挑战**: - 数据一致性:如何确保不同层级缓存之间以及缓存数据库之间的数据一致性是一个难点。 - 缓存穿透与雪崩:需要采取措施防止缓存失效导致的大量请求直接冲击数据库[^1]。 - 资源管理:合理配置缓存大小和过期时间,避免内存溢出或资源浪费。 通过合理设计和实现三级缓存架构,Java应用可以在性能、可扩展性和可靠性方面得到显著提升。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林在闪闪发光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值