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

这篇具有很好参考价值的文章主要介绍了【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、通过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+"的数据添加到了缓存");
    }

    @PostConstruct
    public 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;
    }

启动项目
java缓存cache,项目整理,java,缓存,spring,redis,guava cache

我们可以看到这两个初始化都被执行了,然后我们调用接口查询id为1与id为2的数据
java缓存cache,项目整理,java,缓存,spring,redis,guava cache

再查询id为3的两次
java缓存cache,项目整理,java,缓存,spring,redis,guava cache

可以看到我们是先生成了一次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进行简单的使用,并尝试其中的命中率统计等功能

	@Autowired
    private 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秒后再访问一次,然后立刻访问第三次
java缓存cache,项目整理,java,缓存,spring,redis,guava cache
可以看到缓存未命中两次,其中缓存过期被删除了一次,随后在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=

同样我们编写接口测试

@Autowired
    private 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的数据
java缓存cache,项目整理,java,缓存,spring,redis,guava cache
随后我们在redis中查看
java缓存cache,项目整理,java,缓存,spring,redis,guava cache
java缓存cache,项目整理,java,缓存,spring,redis,guava cache
可以看到我们确实的把数据存入redis中作为缓存进行读写了文章来源地址https://www.toymoban.com/news/detail-597594.html

到了这里,关于【java缓存、redis缓存、guava缓存】java中实现缓存的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring Cloud系列】- 分布式系统中实现幂等性的几种方式

    在开发订单系统时,我们常遇见支付问题,既用户购买商品后支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。在以前的单应用系统中,

    2024年02月10日
    浏览(43)
  • Guava:Cache强大的本地缓存框架

    Guava Cache是一款非常优秀的本地缓存框架。 Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似,提供了基于时间、容量、引用三种回收策略,以及自动加载、访问统计等功能。 基本的配置 例子中,缓存最大容量设置为 100 ( 基于容量进行回收 ),配置了 失效策略 和 刷新策

    2024年02月02日
    浏览(39)
  • redis的几种集群方式

    https://www.zhihu.com/people/pan-zhi-74-31 Redis集群介绍Redis集群一般有四种方式,分别为:主从复制、哨兵模式、Cluster以及各大厂的集群方案。在3.0版本之前只支持单实例模式,3.0之后支持了集群方式。在3.0之前各大厂为了解决单实例Redis的存储瓶颈问题各自推出了自己的集群方案,

    2024年02月05日
    浏览(35)
  • java中实现分页的常见几种方式

    无论是自我学习中,还是在工作中,固然会遇到 与前端搭配实现分页的功能 ,发现有几种方式,特此记录一下。 分页功能直接交给前端实现 (根据业务场景且仅仅只能用于 数据量少 的情况)。即后端不做任何数据的限制,直接把全部数据返回给前端,前端通过组件实现分页

    2023年04月10日
    浏览(35)
  • Java 终止线程的几种方式

    所谓正常运行结束,就是程序正常运行结束,线程自动结束。 一般run()方法执行完,线程就会正常结束,然而,常常有些线程是伺服线程。他们需要长时间的运行,只有在外部某些条件满足的情况下,才能关闭这些线程。使用一个变量来控制循环,例如:最直接的方法就是设

    2024年02月07日
    浏览(50)
  • Java实现异步的几种方式

    普通线程实现异步,但频繁创建、销毁线程比较耗资源,所以一般交给线程池执行 结果: Future异步 和普通线程实现异步区别不大,只是使用Future是要获取执行后的返回值 结果: Spring的@Async异步 使用@Async注解实现异步的前提是需要在启动类上标注@EnableAsync来开启异步配置

    2024年02月04日
    浏览(66)
  • java:解析json的几种方式

    Java是一种流行的编程语言,它提供了很多实用的库和工具,在处理JSON数据时也不例外。在本文中,我们将介绍Java中如何解析JSON数据。 JSON是一种轻量级的数据交换格式,它已经成为Web应用程序中最流行的数据格式之一。Java提供了许多库来处理JSON数据,包括Jackson、Gson和JS

    2024年02月03日
    浏览(53)
  • Java创建对象的几种方式

    在Java中,对象是程序中的一种基本元素,它通过类定义和创建。本篇教程旨在介绍Java中创建对象的几种方式,包括使用new、反射、clone、反序列化等方式。 在Java中,最常用的创建对象方式是使用new。使用new创建对象的具体步骤如下: 使用new并指定

    2024年02月12日
    浏览(41)
  • Java判断null的几种方式

    组内code review时,有同学提到字符串判断空值的写法,如下两种, (1)null在后, (2)null在前, 这两种写法,有什么区别? 这两个测试,都可以执行,有种解释是,null放在前面是为了避免少写一个\\\"=\\\",因为\\\"null=\\\"书写会报错,防止笔误写成\\\"=null\\\",不会报错,进而漏掉问题。

    2024年02月13日
    浏览(46)
  • Java读取文件的几种方式

    1. 使用流读取文件 2. 使用JDK1.7提供的NIO读取文件(适用于小文件) 3. 使用JDK1.7提供的NIO读取文件(适用于大文件) 4. 使用JDK1.4提供的NIO读取文件(适用于超大文件) 5. 使用cmmons-io依赖提供的FileUtils工具类读取文件 添加依赖: 6. 使用cmmons-io依赖提供的IOtils工具类读取文件 添加依赖:

    2024年02月16日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包