文章内容输出来源:拉勾教育Java高薪训练营
学习心得
课程介绍
第五阶段 大型分布式系统缓存架构进阶
模块二 Guava Cache、EVCache、Tair、Aerospike
本模块对市场上其他缓存服务进行讲解,例如:Guava Cache、EVCache、Tair、Aerospike等,可以提高在缓存方面的架构选型能力。
作业内容
模拟拉勾网首页热门职位的缓存设计和实现
如图:
要求:
BS结构:springboot或ssm都行
设计合适的数据结构用于缓存数据
先读本地缓存,本地缓存没有则读分布式缓存,分布式缓存没有则读数据库
采用CacheAsidePattern方式读写缓存
分布式缓存可以采用RedisCluster或Tair搭建
课程目录及观看建议
2倍速模式
课程1小时
作业2小时
***
必看
**
建议看
*
可不看
- 任务一:Guava Cache
- Guava Cache应用场景(37:32)
- Guava Cache操作实战(21:12)
***
- Guava Cache缓存数据策略(上)(13:55)
- Guava Cache缓存数据策略(下)(15:38)
- Guava Cache原理(19:51)
- Guava Cache高级实战(28:20)
***
- Guava Cache源码剖析(10:08)
- 任务二:EVCache
- 任务三:Tair
- 任务四:Aerospike
作业说明
软件版本
CentOS 7.7
Redis 5.0.5
JDK 11
Spring Boot 2.3.2.RELEASE
Mybatis-Spring-Boot-Starter 2.1.3
Guava 29.0-jre
实现步骤
1. MySQL数据库
可以根据业务创建一个(包括所有的岗位信息)或多个表(岗位和公司进行表连接查询)。
2. 搭建Redis5.0集群
搭建步骤参考上期作业。
java访问使用Spring Data的RedisTemplate。
3. 搭建SpringBoot项目
至少提供两个api:
根据岗位id查询岗位信息
根据岗位id修改岗位信息
4. 选择ORM框架
可以使用MyBatis作为ORM框架,便于进行SQL编写和性能调优。
5. 本地缓存
选用Guava Cache作为本地缓存。
6. 缓存策略
客户端查询的时候先查本地缓存,如果没有再查分布式缓存,如果还没有才查数据库,并将查询结果保存到分布式缓存和本地缓存中。
如果数据库信息被修改,则删除分布式和本地缓存。
注意事项
-
Null的处理
覆写Guava Cache的get方法中Callable参数的call方法时,如果考虑了查询数据为null的场合,返回值需要使用Optional类包装下才可以。定义缓存时,也需要把泛型的限定类型使用Optional包装成
Cache<String, Optional<Object>>
,例如:
new Callable<Optional<PostInfoVO>>() {
@Override
public Optional<PostInfoVO> call() throws Exception {
Object redisPostInfo = redisTemplate.opsForHash().get("post", postId);
if (redisPostInfo != null) {
return Optional.of((PostInfoVO) redisPostInfo);
} else {
return Optional.fromNullable(null);
}
}
}
-
缓存刷新问题
当数据库数据的数据更新以后,如果按照CacheAsidePattern策略,则需要删除分布式缓存(Redis)和本地缓存(Guava Cache)中的数据。待下次客户端查询该数据时再从数据库中查询,然后保存到缓存中。但是因为发起修改操作的服务节点和其他分布式服务节点是跨机器环境,所以无法直接删除其他机器的本地缓存。作业中可以只使用单机环境实现,但觉得实际生产的分布式环境可以采用Redis订阅模式监听,或者MQ异步处理(会有短时数据不一致情况)。如果是频繁更新的场合,还需要根据具体业务场景考虑是否真的需要本地缓存。
redis集群配置
spring:
redis:
database: 0
cluster:
nodes:
- 192.168.0.111:7001
- 192.168.0.111:7002
- 192.168.0.111:7003
- 192.168.0.111:7004
- 192.168.0.111:7005
- 192.168.0.111:7006
- 192.168.0.111:7007
- 192.168.0.111:7008
timeout: 5000