失效链接处理 |
缓存和分布式锁 PDF 下载
本站整理下载:
提取码:itge
相关截图:
主要内容:
一、缓存 1、缓存使用
为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而db
承担数据落盘工作。
哪些教据适合放入緩存? 即时性、数据一致性要求不高的 访问量大且更新频率不高的数据(读多,写少)
举例:电商类应用,商品分类,商品列表等适合缓存并加一个失效时间(根据数
据更新频率来定),后台如果发布一个商品,买家需要5分钟才能看到新的商品一
般还是可以接受的。
伪代码逻辑:
data = cache.load(id);//从缓存加载数据 if(data == null){ data = db.loadid);//从数据库加载数据 cache.put(id,data);//保存到cache中 }retum data; 注意:在开发中,凡是放入缓存中的数据都应该指定过期时间,使其可以在系统即使没有 主动更新数据也能自动触发数据加载进缓存的流程。避免业务崩溃导致的数据永久不一致 题。本地缓存: 适合单体应用
分布式缓存-本地模式在分布式下的问题: 缓存一致性问题、拓展性问题、高可用问
题分布式缓存: 可以解决前面两个的不足,目前最常使用的是redis
2、整合 redis 作为缓存
需要创建一个 Spring Boot 项目来整合 Redis。如果还没有安装 Redis,那么
Redis 的安装可以参考:在CentOS中安装和使用Docker 这篇内容。或者使用
Windows 版本的 Redis 也是可以的。
1、配置pom 文件 在 SpringBoot 项目的 pom 文件中引入 redis 依赖,可以不用写版本号,使用
SpringBoot的默认配置项:
引入依赖之后,项目中就会有 RedisAutoConfiguration.java 自动配置类,可
以进行 redis 的自动配置。 RedisAutoConfiguration.java 将 redis 的所有
配置属性都放在 RedisProperties.java 类中。
2、配置application.yml文件: 3、测试 redis <!-- 引入redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data- redis</artifactId> </dependency> spring: redis: host: 192.168.56.10 # redis地址 port: 6379 # 端口号,默认为6379.相同的话也可以不配
在 RedisAutoConfiguration.java 类中,已经为我们提供了
RedisTemplate<Object, Object> 和 StringRedisTemplate 两个类,来封装
redis 的操作,下面来使用 StringRedisTemplate 测试一下。
在测试类中添加下面的代码:
测试输出结果:获取之前保存的数据:world_90bf25e1-2e84-4f50-b6e2- 5eaab32b4175
还可以通过安装 redis 可视化工具 RedisDesktopManager 来查看之前保存的数
据:
二、缓存失效问题 1、高并发下缓存失效问题-缓存穿透 @Autowired StringRedisTemplate stringRedisTemplate; @Test public void testStringRedisTemplate(){ // 操作字符串 ValueOperations<String, String> ops = stringRedisTemplate.opsForValue(); // 保存 ops.set("hello", "world_"+ UUID.randomUUID().toString()); // 查询 String hello = ops.get("hello"); System.out.println("获取之前保存的数据:"+hello); }
缓存穿透: 指查询一个一定不存在 的数据,由于缓存是不命中,将去查询数据
库,但是数据库也无此记录,我们没有将这次查询的null写入缓存,这将导致这
个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义
风险: 利用不存在的数据进行攻击,数据库瞬时压力增大,最终导致崩溃
解决: null结果缓存,并加入短暂过期时间 2、高并发下缓存失效问题-缓存雪崩
缓存雪崩: 缓存雪崩是指在我们设置缓存时key采用了相同的过期时间,导致缓
存在某一时刻同时失效,请求全部转发到DB,DB瞬时 压力过重雪崩。
解决: 原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过 期时间的重复率就会降低,就很难引发集体失效的事件。 3、高并发下缓存失效问题-缓存击穿
|