技术总监告诉你:Spring Cache + Redis 缓存实战,原地起飞

本文介绍了Spring Cache的原理和JCache规范,详细讲解了Cache接口、CacheManager以及ConcurrentMapCache的实现。通过@Cacheable、@CachePut、@CacheEvict等注解展示了Spring Cache的实践应用。此外,文章还涵盖了Redis的环境搭建和测试,以及如何自定义CacheManager以适应Redis的缓存需求。
摘要由CSDN通过智能技术生成

image.png
说到Spring Boot缓存,那就不得不提JSR-107规范,它告诉我们在Java中如何规范地使用缓存。

JSR是Java Specification Requests的简称,通常译为”Java 规范提案“。具体而言,是指向JCP(Java Community Process,Java标准制定组织)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,通过一定的标准测试后,就可以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

JSR-107规范即JCache API,JCache规范定义了一种对Java对象临时在内存中进行缓存的方法,包括对象的创建、共享访问、假脱机(spooling)、失效、各JVM的一致性等,可被用于缓存JSP内最经常读取的数据,如产品目录和价格列表。利用JCache的缓存数据,可以加快大多数查询的反应时间(内部测试表明反应时间大约快15倍)。

一、JCache

在Spring Boot中使用缓存之前,我们有必要了解一下JCache。JCache定义了五个核心接口,分别是CachingProvider,CacheManager,Cache,Entry和Expiry。

  • 一个CachingProvider可以创建和管理多个CacheManager,并且一个CacheManager只能被一个CachingProvider所拥有,而一个应用可以在运行期间访问多个CachingProvider。
  • 一个CacheManager可以创建和管理多个唯一命名的Cache,且一个Cache只能被一个CacheManager所拥有,这些Cache存在于CacheManager的上下文中。
  • Cache是一个类似Map的数据结构
  • Entry是一个存储在Cache中的key-value对
  • Expiry是指存储在Cache中的Entry的有效期,一旦超过这个时间,Entry将处于过期状态,即不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。

二、Spring Cache原理

Spring 3.1开始,引入了Spring Cache,即Spring 缓存抽象。通过定义org.springframework.cache.Cache和org.springframework.cache.CacheManager接口来统一不同的缓存技术,并支持使用JCache注解简化开发过程。

Cache接口为缓存的组件规范定义,包含缓存的各种操作集合。Spring中为Cache接口提供了各种xxxCache的实现:RedisCache,EhCacheCache,ConcurrentMapCache等。我们通过部分源码详细了解一下Cache接口和CacheManager接口。

Cache接口

public interface Cache {    //Cache名称    String getName();    
//Cache负责缓存的对象    
Object getNativeCache();   
 /**    
 * 获取key对应的ValueWrapper     
* 没有对应的key,则返回null     
* key对应的value是null,则返回null对应的ValueWrapper     
*/    
@Nullable    
Cache.ValueWrapper get(Object key);    
//返回key对应type类型的value    
@Nullable    <T> T get(Object key, @Nullable Class<T> type);    
//返回key对应的value,没有则缓存Callable::call,并返回    
@Nullable    <T> T get(Object key, Callable<T> valueLoader);    
//缓存目标key-value(替换旧值),不保证实时性    
void put(Object key, @Nullable Object value);    
//插入缓存,并返回该key对应的value;先调用get,不存在则用put实现    
@Nullable    
default Cache.ValueWrapper putIfAbsent(Object key, @Nullable Object value) 
{        
Cache.ValueWrapper existingValue = this.get(key);        
if (existingValue == null)
 {            
this.put(key, value);       
 }        
return existingValue;    
}    
//删除缓存,不保证实时性    
void evict(Object key);    
//立即删除缓存:返回false表示剔除前不存在制定key活不确定是否存在;返回true,表示该key之前存在    
default boolean evictIfPresent(Object key) 
{        
this.evict(key);        
return false;    
}    
//清除所有缓存,不保证实时性   
 void clear();    
//立即清楚所有缓存,返回false表示清除前没有缓存或不能确定是否有;返回true表示清除前有缓存    
default boolean invalidate() 
{        
this.clear();        
return false;    
}    
public static class ValueRetrievalException extends RuntimeException 
{        
@Nullable        
private final Object key;        
public ValueRetrievalException(@Nullable Object key, Callable<?> loader, Throwable ex) 
{            
super(String.format("Value for key '%s' could not be loaded using '%s'", key, loader), ex);            
this.key = key;        
}        
@Nullable        
public Object getKey()
 {            
return this.key;        
}    
}    
//缓存值的一个包装器接口,实现类为SimpleValueWrapper    
@FunctionalInterface    
public interface ValueWrapper
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值