数据查询慢怎么办?
用缓存,提前把数据取出来保存好(通常保存到读写更快的介质,比如内存),就可以更快的读写。
缓存的实现
- Redis(分布式缓存)
- memcached(分布式)
- Etcd(云原生架构的一个分布式存储,存储配置,扩容能力强,可以线性增加读写性能)
- ehcache(单机)
- 本地缓存(Java内存Map )
- Caffenine(java内存缓存,高性能)
- Google Guava
最简单实现思路,将不同服务器的缓存放在一个公共区域,直接从公共区域拿
Redis
NoSQL 数据库
key-value 存储系统(区别于MySQL,他存储的是键值对)
Redis数据结构
String 字符串类型:name:"hyx"
List列表: names:["hyx","coderhyx","hyx"]
Set集合:names:["hyx","coderhyx"] (值不能重复)
Hash 哈希:nameAge:{"hyx":1,":coderhyx": 2}
Zset集合:name:{hyx - 9,coderhyx - 12}:适合做排行榜,取某个区间的
Java里的实现方式
- Spring Data Redis(本项目用这个)通用的
Spring Data 通用的数据访问框架,定义了一组增删改查的接口
[springdata]https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis
-
Jedis
-
Redission
1)引入
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.6.3</version>
</dependency>
2)配置Redis的地址
spring:
# redis配置
redis:
port: 6379
host: localhost
database: 8
自定义RedisTemplate
引入一个库时,先写测试类
正式引入Redis
设计一下缓存的key
不同用户看到的数据不同
没加缓存之前
还需要设置过期时间,redis内存不能无限增加,一定要设置过期时间
加缓存之后
使用quickRedis查看缓存中有数据了
缓存预热
应用场景
比如:一个系统中第一个用户访问很慢 此时还没有缓存 这时候就可以使用缓存预热 再比如双十一 用户数量那么多 如果每个人第一次访问时候都得在服务器上查询一次数据库 再将查询结果存入缓存中 这样太慢了
第一个用户访问很慢。
优点:
- 解决上面的问题 也在一定的程度上保护数据库可以让用户始终访问很快
缺点
-
增加开发成本
-
需要占用额外的空间
-
预热的时机如果错了 有可能使你的缓存数据太老或者不适合
怎么使用缓存预热?
1.定时
2.手动触发
定时任务的实现
-
使用spring自带的@Scheduler
-
Quartz(独立于 Spring 存在的定时任务框架)
-
XXL-Job 之类的分布式任务调度平台(界面 + sdk)
实现
用定时任务,每天刷新所有用户的推荐列表
注意点
1.缓存预热的意义
2.缓存的空间不能太大,要预留给其他缓存空间
3.缓存数据的周期(此处一天一次)
测试定时任务,到点之后自动执行定时任务
经过测试确实走了缓存,没有查数据库