Cache和CacheManager使用介绍

2023-12-03 05:48

本文主要是介绍Cache和CacheManager使用介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是缓存,为什么要用缓存

程序运行中,在内存保持一定时间不变的数据就是缓存。简单到写一个Map,里面放着一些key,value数据,就已经是个缓存了

所以缓存并不是什么高大上的技术,只是个概念,把要多次使用的东西存在一个变量里,时不时取出来使用,就达到了缓存的目的,缓存就是存放数据的容器

那为什么要用缓存呢,是因为要多次使用。一个程序总有一些数据时可预见被多次使用(预见的准不准就是常说的命中率)

比如一个复杂的计算结果,一次数据库访问取得的数据等耗时耗资源的数据就能放入缓存,目的就是为了节省开销,我们要用有限的资源(CPU,内存,带宽等等)尽量做最多的事情。

为什么要用SpringCache(缓存的演变过程)

缓存的思考
如果我们要设计一个缓存,最基本的功能是存和取:

1.能在缓存里存放数据

2.能在缓存里取出数据

可是这不够呀,比如以下的思考

1.取数据时判断,数据是否存在,如果不存在是不是要数据库取

2.如果是过期的内容是不是要更新

3.如果我有多个缓存,一个是我自己设计的HashMap缓存,一个是名声很大的redis,还有…,那需要个缓存管理器呀

为了让缓存更好用,更“智能”,越来越多的需求就会被提出来,而缓存就是这样一步步演变直到SpringCache横空出世,功能十分强大(说白了就是我们少写很多代码)

SpringCache的好处

SpringCache包含两个顶级接口,Cache(缓存)和CacheManager(缓存管理器),顾名思义,用CacheManager去管理一堆Cache。

最最关键的地方:抱紧了Spring的大腿,可以使用注解就能完成数据进入缓存!!

给大家举个例子,就知道多简单了

首先,Springboot中会自动加载一个CacheManager(它有默认的实现类),所以只要写好一个自定义的Cache即可(如果想用系统定义好的或者第三方如RedisCache也行,记得向Spring注册这个bean即可)

@Component
public class MyCache implements Cache {/*实现接口方法,一些关于数据set和get的方法CacheManager是根据Cache的名字进行管理的所以假设这个Cache名为MyCache*/ 
}

然后在得出数据的方法上写上注释即可

@Cacheable(value = "MyCache",key = "#id")
public String getNavegationURLs(String id) {//一个获取数据的方法
}

这样就会在调用这个方法时,会以id为key值,在名为MyCache的Cache容器中查找(注解中value就是缓存名字,不同名字指定使用不同的缓存)

如果没查到,则执行方法 getNavegationURLs,将返回值存入缓存

如果找到了,就直接将从缓存取值,直接返回,不用执行方法 getNavegationURLs

CacheManager工具类使用介绍

import lombok.AllArgsConstructor;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.stereotype.Component;@Component
@AllArgsConstructor
public class CacheManagerUtil {private CacheManager cacheManager;/*** 获取缓存信息* @param cacheName 缓存名* @param key       自定义key* @param <T>       返回值* @return*/@SuppressWarnings({"unchecked"})public <T> T getCache(String cacheName,String key) {Cache cache = cacheManager.getCache(cacheName);if (cache == null) {return null;}Cache.ValueWrapper valueWrapper = cache.get(key);if (valueWrapper == null) {return null;}return (T)valueWrapper.get();}/*** 添加缓存信息* @param cacheName* @param key* @param value*/public void putCache(String cacheName,String key, Object value) {Cache cache = cacheManager.getCache(cacheName);if (cache != null) {cache.put(key, value);}}/*** 清理缓存* @param cacheName* @param key*/public void evictCache(String cacheName,String key) {Cache cache = cacheManager.getCache(cacheName);if (cache != null) {cache.evict(key);}}
}

这篇关于Cache和CacheManager使用介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/448300

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali