Java缓存详解(定义作用及4大框架)

Java缓存详解(定义作用及4大框架)-mikechen

Java缓存定义

Java缓存是一种用于存储临时数据的机制,通常用于存储一些计算昂贵或频繁访问的数据,以避免重复计算或频繁访问数据库等外部资源。

 

java缓存作用

缓存可以在内存中快速存取数据,减少对于外部资源,比如:数据库、文件系统等的访问,从而提高系统的性能和响应速度。

 

java缓存框架

1.Ehcache

Ehcache 是一个用于在Java应用程序中实现缓存的高性能库,支持本地缓存、分布式缓存和持久性缓存。

Ehcache 可以被用作单独的本地缓存,也可以集成到各种Java应用程序中。

特点:

  • 多级缓存:支持多级缓存,可以将数据存储在不同层级的缓存中。
  • 磁盘持久化:可以将缓存数据持久化到磁盘,防止数据丢失。
  • 分布式:Ehcache可以通过Terracotta进行分布式缓存,使多个节点之间共享缓存。

使用:

1.添加Ehcache 

<!-- Maven 依赖 -->
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.10.6</version>
</dependency>

 

2.配置Ehcache 

创建 Ehcache 的配置文件(ehcache.xml),定义缓存的配置信息,包括缓存名称、过期策略、持久性等。

<!-- ehcache.xml 配置示例 -->
<config xmlns="http://www.ehcache.org/v3">
    <cache alias="myCache">
        <expiry>
            <ttl unit="minutes">10</ttl>
        </expiry>
        <heap unit="entries">100</heap>
    </cache>
</config>

 

2.Guava Cache

Guava Cache 是 Google Guava库中提供的本地缓存实现,旨在为单个应用程序实例提供高性能的本地缓存。

特点:

  • 自动加载:支持自动加载缓存项,当请求未命中缓存时,可以触发加载逻辑。
  • 缓存项过期:支持缓存项的过期策略,可根据时间或大小来自动清理过期项。
  • 大小限制:可以限制缓存的大小,以防止内存溢出。

使用:

1.添加Guava Cache

<!-- Maven 依赖 -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>30.1-jre</version>
</dependency>

 

2.使用Guava Cache

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;

public class GuavaCacheExample {
    public static void main(String[] args) {
        // 创建缓存
        Cache<String, String> myCache = CacheBuilder.newBuilder()
                .maximumSize(100) // 设置缓存的最大大小
                .expireAfterWrite(10, TimeUnit.MINUTES) // 设置缓存项的过期时间
                .build();

        // 将数据放入缓存
        myCache.put("key1", "value1");

        // 从缓存中获取数据
        String value = myCache.getIfPresent("key1");
        System.out.println("Value from cache: " + value);

        // 关闭缓存
        // Guava Cache 不需要显式关闭,它会自动管理资源
    }
}

 

3.Redis

Redis,全称是Remote Dictionary Server,是一个开源的内存数据库系统。

Redis支持多种数据结构,包括字符串、哈希表、列表、集合、有序集合等。

Java缓存详解(定义作用及4大框架)-mikechen

Redis 使用场景:

  1. 缓存: Redis 被广泛用作缓存,将热点数据存储在内存中,提高访问速度。
  2. 消息队列: Redis 的发布订阅模式和列表结构可以用来实现消息队列,支持简单的消息发布和消费。
  3. 计数器: Redis 的原子操作和自增命令可以方便地实现计数器的功能。
  4. 分布式锁: Redis 提供了原子性的 SETNX(set if not exist)命令,可以用来实现分布式锁。
  5. 实时统计: Redis 的数据结构和高性能使其非常适合用于实时统计和计算。
  6. 会话存储: 将用户会话信息存储在 Redis 中,以实现横向扩展

 

Redis使用:

通过 Redis 的官方客户端或其他语言的客户端,可以与 Redis 交互。

import redis.clients.jedis.Jedis;

public class RedisExample {
    public static void main(String[] args) {
        // 连接到本地的 Redis 服务
        Jedis jedis = new Jedis("localhost", 6379);

        // 存储数据到字符串
        jedis.set("key", "Hello, Redis!");

        // 从缓存中获取数据
        String value = jedis.get("key");
        System.out.println("Value from Redis: " + value);

        // 关闭连接
        jedis.close();
    }
}

 

4.Memcached

Memcached 是一个开源的高性能、分布式的内存对象缓存系统。

Java缓存详解(定义作用及4大框架)-mikechen

它主要用于缓存数据库查询结果、API调用的结果或者页面渲染的结果,以提高应用程序的性能和减轻数据库等后端服务的压力。

以下是一个简单的 Java 使用 Spymemcached 客户端连接 Memcached 的示例:

import net.spy.memcached.MemcachedClient;
import java.net.InetSocketAddress;
import java.util.concurrent.Future;

public class MemcachedExample {
    public static void main(String[] args) {
        try {
            // 连接到本地的 Memcached 服务器
            MemcachedClient memcachedClient = new MemcachedClient(new InetSocketAddress("localhost", 11211));

            // 存储数据到缓存
            Future<Boolean> setResult = memcachedClient.set("key", 3600, "Hello, Memcached!");

            // 获取缓存中的数据
            String value = (String) memcachedClient.get("key");
            System.out.println("Value from Memcached: " + value);

            // 关闭连接
            memcachedClient.shutdown();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

java缓存总结

Java缓存是一个广泛应用于提高应用性能和减轻后端资源负担的关键技术。

选择合适的缓存方案需要综合考虑应用需求、性能要求以及数据一致性等因素。

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法