随笔 - 28  文章 - 0  评论 - 0  阅读 - 6430

通用缓存访问框架JetCache

JetCache是由阿里巴巴开源的通用缓存访问框架,提供的核心能力包括:

  1. 提供统一的,类似jsr-107风格的API访问Cache,并可通过注解创建并配置Cache实例
  2. 通过注解实现声明式的方法缓存,支持TTL和两级缓存
  3. 分布式缓存自动刷新,分布式锁 (2.2+)
  4. 支持异步Cache API
  5. Spring Boot支持
  6. Key的生成策略和Value的序列化策略是可以定制的
  7. 针对所有Cache实例和方法缓存的自动统计

JetCache使用

添加maven依赖

1
2
3
4
5
<dependency>
    <groupId>com.alicp.jetcache</groupId>
    <artifactId>jetcache-starter-redis</artifactId>
    <version>2.6.1</version>
</dependency> 

  

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableMethodCache(basePackages = "com.mengka.springboot.service")
@EnableCreateCacheAnnotation
public class Demo2Application {
 
    public static void main(String[] args) {
        SpringApplication.run(Demo2Application.class, args);
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface UserService {
    //配置一级缓存
    @Cached(name="userCache-", key="#userId", expire = 60)
    //缓存30秒钟自动刷新,从getUserById方法取一次,如果key在600秒内没有访问则不再自动刷新
    @CacheRefresh(refresh = 30, stopRefreshAfterLastAccess = 600, timeUnit = TimeUnit.SECONDS)
    //当缓存访问未命中的情况下,对并发进行的加载行为进行保护,同一个JVM中同一个key只有一个线程去加载,其它线程等待结果
    @CachePenetrationProtect
    User loadUser(long userId);
 
    //更新缓存
    @CacheUpdate(name="userCache-", key="#user.id", value="#user")
    User updateUser(User user);
 
    //删除缓存
    @CacheInvalidate(name="userCache-", key="#userId")
    void deleteUser(long userId);
}

  

自动刷新

1
@CacheRefresh

 

加载保护,对于加载开销比较大的对象,为了防止缓存未命中时的高并发访问打爆数据库

 CachePenetrationProtect注解保证当缓存未命中的时候,一个JVM里面只有一个线程去执行方法,其它线程等待结果。

1
@CachePenetrationProtect

 

接口测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@GetMapping("world")
public ResponseEntity<String> world() {
    log.info("-------, 调用hello接口");
 
    User user1 = userService.loadUser(1001);
 
    User updateUser = new User();
    updateUser.setName("mp444xxx");
    updateUser.setId(1001L);
    userService.updateUser(updateUser);
 
    User user2 = userService.loadUser(1001);
 
    userService.deleteUser(1001L);
 
    User user3 = userService.loadUser(1001);
 
    return ResponseEntity.ok("Hello World");
}

  

 

参考文档

【1】https://github.com/alibaba/jetcache/blob/master/introduce_CN.md

【2】https://blog.csdn.net/zhuyu19911016520/article/details/106951358

posted on   rabbit-xf  阅读(565)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示