db 缓存

innodb 缓存池

  1. 数据表和索引的一部分数据
    1. 配置越大,缓存命中越大
    2. innodb_buffer_pool_size

查询缓存

  • 将 select 语句的结果保存到缓存中

query_cache_size = 2048m;
query_cache_type = ON;

  • 不建议开启, 数据添加、更新、修改会导致缓存大量失效,增大 IO 负责

持久层缓存

hibernate|mybatis

  • 都支持缓存,分为一级缓存和二级缓存
    • 一级缓存是会话级别缓存, session 关闭,缓存失效 (时效低)
      • 缓存结果集
      • 开启一级缓存后此时 where子句可以使用子查询 (大作用)
    • 二级缓存要引入第三方缓存
      • 缓存数据记录,偏向实际业务
  • mybatis 支持多种二级缓存,Ecache 、redis 等

使用 spring cache 配置二级缓存

  • 配置

    1. spring:
    2. jedis:
    3. # jedis 配置
    4. cache:
    5. # 可以写多个命名空间
    6. cache-names: user, password
    7. type: redis
  • service

    • 对单条数据进行缓存,不要对多条数据(比如分页数据)
      1. /**
      2. * @Cacheable 缓存数据
      3. * value 确定命名空间
      4. * key 确认命名空间的 key,后续更新删除都要基于相同的 key
      5. * #id 表示引用参数中的 id
      6. */
      7. @Cacheable(value = "user", key = "#id")
      8. public String getUsernameById(String id) {
      9. return userMapper.getUsernameById(id);
      10. }
  • 除了上述使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息

image.png

  • 可以省略 #root,因为Spring默认使用的就是root对象的属性
  • 注意,如果不能基于key 来删除,只能全部删除
    • @CacheEvict(cacheNames = "user", allEntries = true)
  • save 不用缓存数据
  • update 如果返回值不是实体信息,那么就直接清空该数据即可
    • @CacheEvict(cacheNames = "user", key = "#id")

删除时机

  • spring 先删除物理数据,事务提交后才会删除二级缓存

    spring cache 缺点

  • 不能批量删除、更新,只能全部清空

    redis 宕机导致数据不一致

  1. 清空二级缓存
    1. 适合小型
  2. 后期程序批量比对更新

业务层缓存

  • redis .etc
  • 做好持久化