一、缓存
1、缓存使用
为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。 哪些数据适合放入缓存?
- 即时性、数据一致性要求不高的
- 访问量大且更新频率不高的数据(读多,写少)
1 | private Map<String, List<Catelog2Vo>> getCatalogJsonFromDB() { |
注意:在开发中,凡是放入缓存中的数据我们都应该指定过期时间,使其可以在系统即使没有主动更新数据也能自动触发数据加载进缓存的流程。避免业务崩溃导致的数据永久不一致问题。
2、整合redis 作为缓存
1)、引入redis=starter
1 | <dependency> |
2)、配置redis
1 | spring: |
3)、使用RedisTemplate操作redis
1 |
|
4)、切换使用jedis
1 | <dependency> |
二、缓存失效问题
解决大并发读情况下的缓存失效问题
1、缓存穿透 (查询一个一定不存在的数据)
- 缓存击穿是指查询一个一定不存在的数据,由于缓存是不命中,将去查询数据库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义.
- 在流量大时,可能db就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞.
- 解决: 缓存空结果,并设置短的过期时间
2、缓存雪崩
- 缓存雪崩是指我们在设置缓存时,采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB, DB瞬时压力过重雪崩.
- 解决: 原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件.
3、缓存击穿(热点数据)
- 对于一些设置了过期时间的key, 如果这些key可能会在某些时间点被超高并发的访问,是一种非常热点的数据
- 这个时候,需要考虑一个问题: 如果这个key在大量请求同时进来前正好失效,那么所有对这个key的数据查询都落到db,我们称为缓存击穿
- 解决: 加锁
三、缓存数据一致性
1、保证一致性的模式
1)、双写模式

改进方法: 分布式读写锁.读数据等待写数据整个操作完成
2)、失效模式

改进方法: 业务代码->更新DataBase->binlog->Canal->redis
四、分布式锁
1、分布式锁与本地锁

synchronized (this) 就是本地锁:
1 | /** |
2、分布式锁实现

使用 RedisTemplate 操作分布式锁:
1 | /** |
3、Redisson完成分布式锁
1、简介
Redisson 是架设在 Redis 基础上的一个 Java 驻内存数据网格(In-Memory Data Grid)。充分的利用了 Redis 键值数据库提供的一系列优势,基于Java 实用工具包中常用接口,为使用者提供了一系列具有分布式特性的常用工具类。使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的分布式服务,更进一步简化了分布式环境中程序相互之间的协作。
官方文档:https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95
2、配置
1 |
|
3、使用分布式锁
1 | /** |
五、Spring Cache
1、简介
Spring 从 3.1 开始定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术; 并支持使用 JCache(JSR-107)注解简化我们开发;
Cache 接口为缓存的组件规范定义,包含缓存的各种操作集合;Cache 接 口 下 Spring 提 供 了 各 种 xxxCache 的 实 现 ; 如 RedisCache ,EhCacheCache,ConcurrentMapCache 等;
每次调用需要缓存功能的方法时,Spring 会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。
使用 Spring 缓存抽象时我们需要关注以下两点;
1、确定方法需要被缓存以及他们的缓存策略
2、从缓存中读取之前缓存存储的数据
2、基础概念

3、注解
1 | 1)、引入依赖spring-boot-starter-cache |

4、语法表达式


If you like this blog or find it useful for you, you are welcome to comment on it. You are also welcome to share this blog, so that more people can participate in it. If the images used in the blog infringe your copyright, please contact the author to delete them. Thank you !