【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式

article/2025/9/1 18:25:01

一、通过HashMap实现缓存

这种方式可以简单实现本地缓存,但是实际开发中不推荐使用,下面我们来实现一下这种方式。
首先创建一个管理缓存的类

public class LocalCache {public static HashMap<String,String> cache = new HashMap<>();static {String name = 1 + "-" + UUID.randomUUID().toString();LocalCache.cache.put(String.valueOf(1),name);System.out.println("id为"+1+"的数据添加到了缓存");}
}

这个类中有一个静态代码块,静态代码块会在类加载时就执行,我们可以在这里完成对缓存的初始化,决定缓存内一开始就有哪些数据
另外我们还可以把这个类交给spring来管理

@Component
public class LocalCache {public static HashMap<String,String> cache = new HashMap<>();static {String name = 1 + "-" + UUID.randomUUID().toString();LocalCache.cache.put(String.valueOf(1),name);System.out.println("id为"+1+"的数据添加到了缓存");}@PostConstructpublic void init(){String name = 2 + "-" + UUID.randomUUID().toString();LocalCache.cache.put(String.valueOf(2),name);System.out.println("id为"+2+"的数据添加到了缓存");}
}

在把类交给spring管理后,在方法上加入@PostConstruct可以使这个方法默认执行
随后我们编写一个接口来测试缓存

    @RequestMapping("test")public String test(Long id){String name = LocalCache.cache.get(String.valueOf(id));if (name != null){System.out.println("缓存中存在,查询缓存");System.out.println(name);return name;}System.out.println("缓存中不存在,查询数据库");name = id + "-" + UUID.randomUUID().toString();System.out.println(name);LocalCache.cache.put(String.valueOf(id),name);return name;}

启动项目
在这里插入图片描述

我们可以看到这两个初始化都被执行了,然后我们调用接口查询id为1与id为2的数据
在这里插入图片描述

再查询id为3的两次
在这里插入图片描述

可以看到我们是先生成了一次UUID存入hashmap,第二次查询时hashmap中存在了,直接从hashmap中获得数据,如此一来我们就实现了hashmap形式的本地缓存

二、通过guava local cache实现

guava cache介绍

  • Guava是Google提供的一套Java工具包,而Guava Cache是一套非常完善的本地缓存机制(JVM缓存)。

  • Guava cache的设计来源于CurrentHashMap,可以按照多种策略来清理存储在其中的缓存值且保持很高的并发读写性能。

实际使用

首先导入依赖

		<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency>

编写配置文件,这里我们创建一个五秒钟过期时间的缓存方便测试

import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;@Component
public class GuavaLocalCache {private Cache<String,String> fiveSecondCache = CacheBuilder.newBuilder()//设置缓存初始大小,应该合理设置,后续会扩容.initialCapacity(10)//最大值.maximumSize(100)//并发数设置.concurrencyLevel(5)//缓存过期时间,写入后5秒钟过期.expireAfterWrite(5,TimeUnit.SECONDS)//统计缓存命中率.recordStats().build();public Cache<String, String> getFiveSecondCache() {return fiveSecondCache;}public void setFiveSecondCache(Cache<String, String> fiveSecondCache) {this.fiveSecondCache = fiveSecondCache;}}

下面我们对guava cache进行简单的使用,并尝试其中的命中率统计等功能

	@Autowiredprivate GuavaLocalCache guavaLocalCache;@RequestMapping("guavaTest")public String guavaTest(Long id){// 获取缓存Cache<String, String> fiveSecondCache = guavaLocalCache.getFiveSecondCache();// 从缓存中获取对象String nameCache = fiveSecondCache.getIfPresent(String.valueOf(id));// 缓存中存在if (nameCache != null){System.out.println("缓存命中:" + nameCache + ","+ getCacheStats(fiveSecondCache));return nameCache;}//将数据存入缓存System.out.println("缓存未命中,"+ getCacheStats(fiveSecondCache));nameCache = id + "-" + UUID.randomUUID().toString();fiveSecondCache.put(String.valueOf(id),nameCache);return nameCache;}public String getCacheStats(Cache<String, String> cache){CacheStats stats = cache.stats();return "缓存命中率:"+stats.hitRate()+"被清除缓存数:"+stats.evictionCount();}

首先访问一次id为1的数据,等5秒后再访问一次,然后立刻访问第三次
在这里插入图片描述
可以看到缓存未命中两次,其中缓存过期被删除了一次,随后在5秒内立刻访问缓存命中,缓存命中率,被清除缓存数均正确,测试完成
guava cache还有许多没有测试到的功能以及各种淘汰策略和机制,各位可以尝试深入了解。

使用redis实现缓存

redis简介

Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库

具体使用

redis的安装以及基本使用欢迎参考我的这两篇博客
redis的简介,Linux安装redis以及jedis的使用
redis中的数据类型以及操作

下面我们介绍在springboot项目中的使用
springboot中有redis的starter我们直接引用即可

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>

在spring配置文件中加入如下设置,这里用的是properties形式的文件,host是部署redis的服务器ip,port是端口号,password是密码,如果没有设置密码不填即可

spring.redis.host=
spring.redis.port=
spring.redis.password=

同样我们编写接口测试

@Autowiredprivate StringRedisTemplate stringRedisTemplate;@RequestMapping("/redisTest")public String redisCacheTest(Long id){String name = stringRedisTemplate.opsForValue().get(String.valueOf(id));if (name != null){System.out.println("缓存中存在,查询缓存");System.out.println(name);return name;}System.out.println("缓存中不存在,查询数据库");name = id + "-" + UUID.randomUUID().toString();System.out.println(name);stringRedisTemplate.opsForValue().set(String.valueOf(id),name);return name;}

同样的,我们查询两次id为1和id为2的数据
在这里插入图片描述
随后我们在redis中查看
在这里插入图片描述
在这里插入图片描述
可以看到我们确实的把数据存入redis中作为缓存进行读写了


http://chatgpt.dhexx.cn/article/W8u3pJuN.shtml

相关文章

Java实现一个简单的缓存

cache 阅读原文请访问我的博客BrightLoongs Blog  缓存是在web开发中经常用到的&#xff0c;将程序经常使用到或调用到的对象存在内存中&#xff0c;或者是耗时较长但又不具有实时性的查询数据放入内存中&#xff0c;在一定程度上可以提高性能和效率。下面我实现了一个简单的…

java中缓存简介

外存&#xff1a; 也就是我们经常说的&#xff08;CDEF盘的大小&#xff09;外储存器是指除计算机内存及CPU缓存以外的储存器&#xff0c;此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等&#xff0c;一般的软件都是安装在外存中 内存&#xff1…

java缓存学习

首先说一下缓存著名的开源框架&#xff1a; 最出名的当属 Redis 和 Memcached 了&#xff0c;它们因为使用简便、高性能而成为事实上的标准。还有一些是比较有名的Java开源缓存框架&#xff0c;例如Ehcache、GuavaCache 和 Caffeine 静态缓存和动态缓存&#xff1a; 所谓静态…

JAVA缓存技术

最近再ITEYE上看到关于讨论JAVA缓存技术的帖子比较多,自己不懂,所以上网大概搜了下,找到一篇,暂作保存,后面如果有用到可以参考。此为转贴,帖子来处:http://cogipard.info/articles/cache-static-files-with-jnotify-and-ehcache 介绍 JNotify:http://jnotify.sourcefor…

Java缓存机制

1 Java缓存 1.1 jvm内置缓存 Java中实现缓存的方式有很多&#xff0c;比如用static hashMap基于内存缓存的jvm内置缓存&#xff0c;简单不实用&#xff0c;保对象的有效性和周期无法控制&#xff0c;容易造成内存急剧上升。常用的有Oscache&#xff08;主要针对jsp页面&#…

java中Cache缓存的使用

java中Cache缓存 1.JSR107 缓存的整体架构&#xff1a; 2.SpringBoot的缓存抽象 几个重要概念以及缓存注解 其中想要使用缓存直接&#xff0c;就必须开启**EnableCaching**注解 开启缓存注解的步骤&#xff1a; 作为Spring框架的核心功能之缓存注解&#xff0c;该功能也继承…

JAVA缓存的实现

缓存可分为二大类: 一、通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上&#xff0c;不管你是以XML格式&#xff0c;序列化文件DAT格式还是其它文件格式&#xff1b; 二、内存缓存&#xff0c;也就是实现一个类中静态Map,对这个Map进行常规的增删查. 下面为一个简单的缓…

java缓存技术的介绍

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统&#xff0c;其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的&#xff0c;用于协调两者数据传输速度差异的结构&#xff0c;均可称之为 Cache 二、缓存的分类 1、基于we…

Java缓存介绍

一、缓存 1、什么是缓存&#xff1f; 缓存是硬件&#xff0c;是CPU中的组件&#xff0c;CPU存取数据的速度非常的快&#xff0c;一秒钟能够存取、处理十亿条指令和数据&#xff08;术语&#xff1a;CPU主频1G&#xff09;&#xff0c;而内存就慢很多&#xff0c;快的内存能够达…

Java实现本地缓存、分布式缓存及多级缓存

以下均为自己参考其它博主文章或自己理解整理而成&#xff0c;如有错误之处&#xff0c;欢迎在评论区批评指正&#xff01; 0. 缓存简介 像MySql等传统的关系型数据库已经不能适用于所有的业务场景&#xff0c;比如电商系统的秒杀场景&#xff0c;APP首页的访问流量高峰场景&a…

Java本地高性能缓存的几种实现方式

Java缓存技术可分为远端缓存和本地缓存&#xff0c;远端缓存常用的方案有著名的redis和memcache&#xff0c;而本地缓存的代表技术主要有HashMap&#xff0c;Guava Cache&#xff0c;Caffeine和Encahche。本篇博文仅覆盖了本地缓存&#xff0c;且突出探讨高性能的本地缓存。 本…

SIFT的两个版本:OpenCV和VL_SIFT

暂时记录一下 OpenCV版本&#xff1a; #include<iostream> #include<opencv2/opencv.hpp> #include<opencv2/core.hpp> #include<opencv2/features2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp>using namespace std; using namespace c…

论文阅读笔记《Matching Images With Multiple Descriptors: An Unsupervised Approach for Locally Adaptive》

核心思想 本文提出一种将多种特征描述算法融合起来实现更好图像匹配的方法。近些年来&#xff0c;图像特征的描述算法层出不穷如SIFT、LIOP 、DAISY等等&#xff0c;每种方法都有各自的优势和侧重点&#xff0c;对于不同图像其效果也各有优劣。那么能不能将多种算法的优势结合起…

LIFT: Learned Invariant Feature Transform详细笔记

LIFT: Learned Invariant Feature Transform Paper: LIFT: Learned Invariant Feature Transform | SpringerLink Code: GitHub - cvlab-epfl/LIFT: Code release for the ECCV 2016 paper 文章目录 Abstract思路来源LIFT文献来源 方法&#xff1a;LIFTPipeline网络架构训练流…

简单的倒计时shell脚本

效果如下: 代码如下: #! /bin/bash #####################倒计时################ #作者:liop #完成时间:2019.12.17 #三位数以内秒数的倒计时 ########################################## display(){case $1 in1)case $2 in1)echo "******** ";;2)echo "…

计算机视觉领域经典论文源码

计算机视觉领域经典论文源码 转载自&#xff1a;http://blog.csdn.net/ddreaming/article/details/52416643 2016-CVPR论文代码资源&#xff1a; https://tensortalk.com/?catconference-cvpr-2016 一个GitHub账号&#xff0c;里面有很多计算机视觉领域最新论文的代码实现&am…

【译文】Local Intensity Order Pattern for Feature Description

在上一篇文章【特征检测】LIOP特征描述算法中讲到了LIOP描述符&#xff0c;下面我将原文翻译如下&#xff0c;如有出入请以原文为准。 —————————————————————————————————————————————————————————————————…

[2015 Springer] Local Image Descriptor: Modern Approaches——2 Classical Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103610331 翻译 本地图像描述…

[2015 Springer] Local Image Descriptor: Modern Approaches——3 Intensity Order-Based Local Descriptors

转载请注明链接&#xff1a; 有问题请及时联系博主&#xff1a;Alliswell_WP&#xff1a;Alliswell_WP 第一篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/103475243 第二篇链接&#xff1a;https://blog.csdn.net/qq_21685903/article/details/10361…

在SIFT和SURF之后,有哪些比较新的且具有一定影响力的自然图像配准算法?

链接&#xff1a;https://www.zhihu.com/question/32066833/answer/2041516754 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 作者&#xff1a;Vinjn张静https://www.zhihu.com/question/32066833/answer/54575191 我就提一下 OpenCV 中…