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, passwordtype: 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
- 做好持久化
