当前位置:首页 > 科技  > 软件

基于内存和 Redis 的两级 Java 缓存框架

来源: 责编: 时间:2024-02-29 14:36:07 285观看
导读环境:SpringBoot2.7.12 + j2cache2.8.51. 简介J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memc

环境:SpringBoot2.7.12 + j2cache2.8.5LqD28资讯网——每日最新资讯28at.com

1. 简介

J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。由于大量的缓存读取会导致 L2 的网络成为整个系统的瓶颈,因此 L1 的目标是降低对 L2 的读取次数。该缓存框架主要用于集群环境中。单机也可使用,用于避免应用重启导致的缓存冷启动后对后端业务的冲击。LqD28资讯网——每日最新资讯28at.com

数据读取

  • 读取顺序 -> L1 -> L2 -> DB
  • 数据更新
    从数据库中读取最新数据,依次更新 L1 -> L2 ,发送广播清除某个缓存信息
    接收到广播(手工清除缓存 & 一级缓存自动失效),从 L1 中清除指定的缓存信息

2. 实战案例

2.1 依赖管理

<dependency>  <groupId>net.oschina.j2cache</groupId>  <artifactId>j2cache-core</artifactId>  <version>2.8.5-release</version></dependency><dependency>  <groupId>net.oschina.j2cache</groupId>  <artifactId>j2cache-spring-boot2-starter</artifactId>  <version>2.8.0-release</version></dependency>

2.2 配置

redis:  # 地址, 多个地址使用‘,’逗号分割  hosts: localhost:6379  # 数据库索引  database: 11  # 密码  password: xxxooo  # 连接超时时间  timeout: 10s  # 连接池中的最小空闲连接  min-idle: 0  # 连接池中的最大空闲连接  max-idle: 8  # 连接池的最大数据库连接数  max-active: 8  # #连接池最大阻塞等待时间(使用负值表示没有限制)  max-wait: -1ms---j2cache:  openSpringCache: true  # 缓存中不存在时,运行缓存空对象  allowNullValues: true  redisClient: lettuce  l2CacheOpen: true  # 一级缓存使用caffeine  L1:    provider_class: caffeine  L2:    #使用springRedis替换二级缓存    provider_class: net.oschina.j2cache.cache.support.redis.SpringRedisProvider    config_section: redis  #使用springRedis进行广播通知缓失效  broadcast: net.oschina.j2cache.cache.support.redis.SpringRedisPubSubPolicy# 上面配置的一级缓存为caffeine, 那么这里对一级缓存的配置就必须以这个caffeine开头  caffeine:  # 配置一级,二级缓存的region,有效时间  region.xj: 10000, 120s---spring:  cache:    # 一级缓存使用caffeine    type: caffeine

2.3 核心操作类

@Servicepublic class UserService {  private final UserRepository userRepository ;  public UserService(UserRepository userRepository) {    this.userRepository = userRepository ;  }  @Transactional  public User save(User user) {    return this.userRepository.saveAndFlush(user) ;  }  @Cacheable(value = {"xj"}, key = "#id")  public User get(Long id) {    return this.userRepository.findById(id).orElse(null) ;  }  @Transactional  @CacheEvict(value = {"xj"}, key = "#id")  public void remove(Long id) {    this.userRepository.deleteById(id) ;  }}

以上是基本的操作,非常简单。LqD28资讯网——每日最新资讯28at.com

2.4 Controller接口

@RestController@RequestMapping("/users")public class UserController {  private final UserService userService ;  // 通过CacheChannel操作j2cache缓存方法  private final CacheChannel cacheChannel;    public UserController(UserService userService, CacheChannel cacheChannel) {    this.userService = userService ;    this.cacheChannel = cacheChannel ;   }    @GetMapping("/save")  public User save() {    User user = new User() ;    int num = new Random().nextInt(80);    user.setAge(num) ;    user.setName("姓名 - " + num) ;    user.setSex(num >= 50 ? "男" : "女") ;    return this.userService.save(user) ;  }    @GetMapping("/{id}")  public Object get(@PathVariable("id") Long id) {    // 从指定的region,指定的key获取数据,如果一级,二级缓存中不存在,则通过第三个参数Function手动获取    // 如果缓存中不存在时,同时配置了允许缓存空对象,则会缓存一个空对象到缓存中    return this.cacheChannel.get("xj", id.toString(), key -> this.userService.get(id) , true) ;  }    @GetMapping("/delete/{id}")  public Object remove(@PathVariable("id") Long id) {    this.userService.remove(id) ;    return "success" ;  }  }

2.5 测试

先通过save接口添加数据LqD28资讯网——每日最新资讯28at.com

图片图片LqD28资讯网——每日最新资讯28at.com

查询id=2的数据LqD28资讯网——每日最新资讯28at.com

图片图片LqD28资讯网——每日最新资讯28at.com

level=3 表示本次数据缓存中不存在,从数据库中获取的。刷新页面LqD28资讯网——每日最新资讯28at.com

图片图片LqD28资讯网——每日最新资讯28at.com

level=2,本次数据从二级缓存redis中获取。再次刷新页面LqD28资讯网——每日最新资讯28at.com

图片图片LqD28资讯网——每日最新资讯28at.com

level=1,本次数据从一级缓存caffeine中获取。后续再怎么刷新只要缓存没有过期都将从一级缓存中获取。LqD28资讯网——每日最新资讯28at.com

测试不存在的数据

图片图片LqD28资讯网——每日最新资讯28at.com

从数据库中查询不存在的数据。LqD28资讯网——每日最新资讯28at.com

图片图片LqD28资讯网——每日最新资讯28at.com

缓存了空对象。LqD28资讯网——每日最新资讯28at.com

测试删除数据

图片图片LqD28资讯网——每日最新资讯28at.com

缓存中会立即清除LqD28资讯网——每日最新资讯28at.com

图片图片LqD28资讯网——每日最新资讯28at.com

以上是本篇文章的全部内容,希望对你有帮助。LqD28资讯网——每日最新资讯28at.com

完毕!!!LqD28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-75295-0.html基于内存和 Redis 的两级 Java 缓存框架

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 没看过AQS源码,别说精通Java并发编程

下一篇: 了解HttpListener:用于创建基于HTTP协议的桌面&amp;Web应用程序

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 联想YOGA 16s 2022笔记本将要推出,屏幕支持触控功能

    联想此前宣布,将于11月2日19:30召开联想秋季轻薄新品发布会,推出联想 YOGA 16s 2022 笔记本等新品。官方称,YOGA 16s 2022 笔记本将搭载 16 英寸屏幕,并且是一
Top