db 缓存
innodb 缓存池
- 数据表和索引的一部分数据
- 配置越大,缓存命中越大
innodb_buffer_pool_size
- 配置越大,缓存命中越大
查询缓存
- 将 select 语句的结果保存到缓存中
query_cache_size = 2048m;
query_cache_type = ON;
- 不建议开启, 数据添加、更新、修改会导致缓存大量失效,增大 IO 负责
持久层缓存
hibernate|mybatis
- 都支持缓存,分为一级缓存和二级缓存
- 一级缓存是会话级别缓存, session 关闭,缓存失效 (时效低)
- 缓存结果集
- 开启一级缓存后此时
where
子句可以使用子查询 (大作用)
- 缓存结果集
- 二级缓存要引入第三方缓存
- 缓存数据记录,偏向实际业务
- 缓存数据记录,偏向实际业务
- 一级缓存是会话级别缓存, session 关闭,缓存失效 (时效低)
- mybatis 支持多种二级缓存,Ecache 、redis 等
使用 spring cache 配置二级缓存
配置
spring:
jedis:
# jedis 配置
cache:
# 可以写多个命名空间
cache-names: user, password
type: redis
service
- 对单条数据进行缓存,不要对多条数据(比如分页数据)
/**
* @Cacheable 缓存数据
* value 确定命名空间
* key 确认命名空间的 key,后续更新删除都要基于相同的 key
* #id 表示引用参数中的 id
*/
@Cacheable(value = "user", key = "#id")
public String getUsernameById(String id) {
return userMapper.getUsernameById(id);
}
- 对单条数据进行缓存,不要对多条数据(比如分页数据)
- 除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息
- 可以省略
#root
,因为Spring默认使用的就是root对象的属性 - 注意,如果不能基于
key
来删除,只能全部删除@CacheEvict(cacheNames = "user", allEntries = true)
- save 不用缓存数据
- update 如果返回值不是实体信息,那么就直接清空该数据即可
@CacheEvict(cacheNames = "user", key = "#id")
删除时机
- 清空二级缓存
- 适合小型
- 适合小型
- 后期程序批量比对更新
- 慢
业务层缓存
- redis .etc
- 做好持久化