JetCache多级缓存

2023-10-09 05:59
文章标签 缓存 多级 jetcache

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

1.JetCache,阿里巴巴开源多级缓存框架

JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。 JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。 当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。

  • 通过统一的API访问Cache系统
  • 通过注解实现声明式的方法缓存,支持TTL和两级缓存
  • 通过注解创建并配置Cache实例
  • 针对所有Cache实例和方法缓存的自动统计
  • Key的生成策略和Value的序列化策略是可以配置的
  • 分布式缓存自动刷新,分布式锁 (2.2+)
  • 异步Cache API (2.2+,使用Redis的lettuce客户端时)
  • Spring Boot支持

开源地址:https://github.com/alibaba/jetcache
中文Wiki:https://github.com/alibaba/jetcache/wiki/Home_CN

2.SpringBoot集成

有多种集成方式,此处使用 jetcache-starter-redis-lettuce
思路:本地缓存做为一级缓存,redis为二级缓存和数据源存储,数据不存储在DB了

  • 1.添加maven依赖
<dependency><groupId>com.alicp.jetcache</groupId><artifactId>jetcache-starter-redis-lettuce</artifactId><version>2.6.0</version>
</dependency>
  • 2.application.yml 配置 jetcache
jetcache:statIntervalMinutes: 15areaInCacheName: falsehidePackages: com.alibabalocal:default:type: caffeinelimit: 300keyConvertor: fastjsonexpireAfterWriteInMillis: 100000remote:default:type: redis.lettucekeyConvertor: fastjsonvalueEncoder: javavalueDecoder: javapoolConfig:minIdle: 5maxIdle: 20maxTotal: 50uri: redis://127.0.0.1:6379/
  • 3.在主类上启用缓存注解(很重要)
@EnableMethodCache(basePackages = "com.zypcy.multicache")
@EnableCreateCacheAnnotation
@SpringBootApplication
public class MultiCacheApplication {public static void main(String[] args) {SpringApplication.run(MultiCacheApplication.class, args);}
}
  • 4.接口与实现,以及一个实体类
public interface IndexService {void addUser(User user);//配置一级缓存@Cached(name="userCache-", key="#userId", expire = 60)//缓存30秒钟自动刷新,从getUserById方法取一次,如果key在600秒内没有访问则不再自动刷新@CacheRefresh(refresh = 30, stopRefreshAfterLastAccess = 600, timeUnit = TimeUnit.SECONDS)//当缓存访问未命中的情况下,对并发进行的加载行为进行保护,同一个JVM中同一个key只有一个线程去加载,其它线程等待结果@CachePenetrationProtectUser getUserById(long userId);//更新缓存@CacheUpdate(name="userCache-", key="#user.userId", value="#user")void updateUser(User user);//删除缓存@CacheInvalidate(name="userCache-", key="#userId")void deleteUser(long userId);
}
@Service
public class IndexServiceImpl implements IndexService {private static final String key = "user";@AutowiredStringRedisTemplate redisTemplate;@Overridepublic void addUser(User user) {redisTemplate.opsForHash().put(key , String.valueOf(user.getUserId()) , JSON.toJSONString(user));}@Overridepublic User getUserById(long userId) {User user = null;Object result = redisTemplate.opsForHash().get(key , String.valueOf(userId));if(result != null){user = JSON.parseObject(result.toString() , User.class);}return user;}@Overridepublic void updateUser(User user) {User dbUser = getUserById(user.getUserId());if(dbUser != null){if(!StringUtils.isEmpty(user.getName())){dbUser.setName(user.getName());}if(!StringUtils.isEmpty(user.getAddress())){dbUser.setAddress(user.getAddress());}if(user.getAge() > 0){dbUser.setAge(user.getAge());}addUser(dbUser);}}@Overridepublic void deleteUser(long userId) {redisTemplate.opsForHash().delete(key , String.valueOf(userId));}
}
public class User implements Serializable {private long userId;private String name;private int age;private String address;//getter setter 略
}
  • 5.控制器接口,先请求 add 接口保存数据,再调用 get 接口,然后调用 update 接口,再手动改redis数据源里面的数据测试本地缓存自动刷新
@RestController
@RequestMapping("/index")
public class IndexController {@AutowiredIndexService indexService;@PostMapping("/add")public String addUser(User user) {indexService.addUser(user);return "success";}@GetMapping("/get")public User getUserById(long userId) {return indexService.getUserById(userId);}@PostMapping("/update")public String  updateUser(User user) {indexService.updateUser(user);return "success";}@GetMapping("/delete")public String deleteUser(long userId) {indexService.deleteUser(userId);return "success";}
}
  • 6.使用IDEA自带的 HTTP Client --> Test RESTFul Web Service 功能,类似 Postman 一样
    在这里插入图片描述
  • 7.经调用代码发现,每隔30秒会自动调用getUserById方法取一次数据,并刷新一级缓存
    在这里插入图片描述
  • 8.源码下载

这篇关于JetCache多级缓存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

一文详解Nginx的强缓存和协商缓存

《一文详解Nginx的强缓存和协商缓存》这篇文章主要为大家详细介绍了Nginx中强缓存和协商缓存的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、强缓存(Strong Cache)1. 定义2. 响应头3. Nginx 配置示例4. 行为5. 适用场景二、协商缓存(协

Golang基于内存的键值存储缓存库go-cache

《Golang基于内存的键值存储缓存库go-cache》go-cache是一个内存中的key:valuestore/cache库,适用于单机应用程序,本文主要介绍了Golang基于内存的键值存储缓存库... 目录文档安装方法示例1示例2使用注意点优点缺点go-cache 和 Redis 缓存对比1)功能特性

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Redis与缓存解读

《Redis与缓存解读》文章介绍了Redis作为缓存层的优势和缺点,并分析了六种缓存更新策略,包括超时剔除、先删缓存再更新数据库、旁路缓存、先更新数据库再删缓存、先更新数据库再更新缓存、读写穿透和异步... 目录缓存缓存优缺点缓存更新策略超时剔除先删缓存再更新数据库旁路缓存(先更新数据库,再删缓存)先更新数

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧